저번 포스팅에서 배열에 항목 추가하기에 이어, 항목을 제거하는 기능을 구현해보겠다!
1️⃣ 삭제 버튼 렌더링
UserList.js
import React from 'react'
function User({user, onRemove}) {
return(
<div>
<span>{user.username}</span>
<span>{user.email}</span>
<button onClick={()=>onRemove(user.id)}>삭제</button>
</div>
)
}
function UserList({users, onRemove}) {
return (
<div>
{users.map(user => (
<User user={user} key={user.id} onRemove={onRemove}/>
))}
</div>
)
}
export default UserList
- () => onRemove(user.id) : User컴포넌트의 삭제 버튼이 클릭 될 때, user.id값을 앞으로 props로 받아올 onRemove 함수의 파라미터로 넣어서 호출해주어야 한다.
- 여기서 onRemove "id가 ~인 객체를 삭제해라" 라는 의미!
- 이 onRemove함수는 UserList에서도 전달받을 것이고 이를 그대로 User 컴포넌트에게 전달해줄 것임!
2️⃣ onRemove 함수 구현!
- 배열에 있는 항목을 제거할때는 추가할 때와 마찬가지로 불변성을 지켜가면서 업데이트를 해줘야한다!
- 불변성을 지키면서 특정 원소를 배열에서 제거하기 위해서는 filter 배열 내장 함수를 사용하는 것이 가장 편함!
💡filter ?
- 배열에서 특정 조건이 만족하는 원소들만 추출하여 새로운 배열을 만들어 준다.
App 컴포넌트에서 onRemove 구현하고 UserList에게 전달해주기!
App.js
import React,{useRef, useState} from 'react';
import UserList from './UserList';
import CreateUser from './CreateUser';
function App() {
const [inputs, setInputs] = useState({
username: '', email: ''
})
const {username, email} = inputs;
const onChange = e => {
const {name, value} = e.target;
setInputs({
...inputs,
[name]: value
})
}
const [users, setUsers] = useState(
[
{id: 1, username: 'John', email: 'john@example.com'},
{id: 2, username: 'Car', email: 'car@example.com'},
{id: 3, username: 'lee', email: 'lee@example.com'},
]
)
const nextId = useRef(4);
const onCreate = () => {
// 새로운 항목을 추가하기 위한 객체
const user = {
id: nextId.current,
username,
email
};
// concat 함수로 새로운 배열을 만들어내기!
setUsers(users.concat(user));
setInputs({
username: '',
email: ''
})
nextId.current += 1;
};
// 파라미터로 받아온 id
const onRemove = id => {
// user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듦
// = user.id 가 id인 것을 제거함
// filter = user.id와 id가 같지 않은 것들만 추출해서 새로운 배열 만들어냄
setUsers(users.filter(user => user.id !== id))
}
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} onRemove={onRemove}/>
</>
);
}
export default App;
Reference
'React > Velopert's React' 카테고리의 다른 글
[React] Study #15 | useEffect (0) | 2021.10.08 |
---|---|
[React] Study #14 | 배열 항목 수정하기 (0) | 2021.10.07 |
[React] Study #12 | 배열에 항목 추가하기 (0) | 2021.10.07 |
[React] Study #11 | useRef 로 컴포넌트 안의 변수만들기 (0) | 2021.10.04 |
[React] Study #10 | 배열 렌더링, key의 중요성 (0) | 2021.10.02 |