※ 강의를 듣고 제가 이해한 것을 바탕으로 정리한 것이라서 오류가 있을 수 있습니다.
배열의 항목 수정하기
User 컴포넌트에 계정명을 클릭했을때 색상이 초록새으로 바뀌고 다시 누르면 검정색으로 바뀌도록 구현을 해보겠다.
우선 App 컴포넌트의 users 배열 안의 객체 안에 active 라는 속성을 추가한다.
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: 'programexplorer',
email: 'programexplorer@naver.com',
active: true
},
{
id: 2,
username: 'tester',
email: 'tester@gmail.com',
active: false
},
{
id: 3,
username: 'liz',
email: 'liz@daum.net',
active: false
}
]);
const nextId = useRef(4);
const onCreate = () => {
const user = {
id: nextId.current,
username,
email
};
setUsers(users.concat(user));
setInputs({
username: '',
email: ''
});
nextId.current += 1;
};
const onRemove = id => {
// user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
// = 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} onToggle={onToggle} />
</>
);
}
export default App;
그 다음에는 User 컴포넌트에서 방금 넣어준 active 값에 따라 폰트의 색상을 바꿔주도록 구현을 한다.
그리고 ursor 필드를 설정하여 마우스를 올렸을때 커서가 손가락 모양으로 변하도록 한다.
UserList.js
import React from 'react';
function User({ user, onRemove }) {
return (
<div>
<b
style={{
cursor: 'pointer',
color: user.active ? 'green' : 'black'
}}
>
{user.username}
</b>
<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;
실행 결과
이제 App.js 에서 onToggle 이라는 함수를 구현한다. 배열의 불변성을 유지하면서 배열을 업데이트 할 때에도 map 함수를 사용 할 수 있다.
id 값을 비교해서 id 가 다르다면 그대로 두고 같다면 active 값을 반전시키도록 구현을 하시면 된다.
onToggle 함수를 만들어서 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: 'propranmexplorer',
email: 'propramexplorer@naver.com',
active: true
},
{
id: 2,
username: 'tester',
email: 'tester@gmail.com',
active: false
},
{
id: 3,
username: 'liz',
email: 'liz@daum.net',
active: false
}
]);
const nextId = useRef(4);
const onCreate = () => {
const user = {
id: nextId.current,
username,
email
};
setUsers(users.concat(user));
setInputs({
username: '',
email: ''
});
nextId.current += 1;
};
const onRemove = id => {
// user.id 가 파라미터로 일치하지 않는 원소만 추출해서 새로운 배열을 만듬
// = user.id 가 id 인 것을 제거함
setUsers(users.filter(user => user.id !== id));
};
const onToggle = id => {
setUsers(
users.map(user =>
user.id === id ? { ...user, active: !user.active } : user
)
);
};
return (
<>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users} onRemove={onRemove} onToggle={onToggle} />
</>
);
}
export default App;
다음에는 UserList 컴포넌트에서 onToggle를 받아와서 User 에게 전달해주고 onRemove 를 구현했었던것처럼 onToggle 에 id 를 넣어서 호출한다.
UserList.js
import React from 'react';
function User({ user, onRemove, onToggle }) {
return (
<div>
<b
style={{
cursor: 'pointer',
color: user.active ? 'green' : 'black'
}}
onClick={() => onToggle(user.id)}
>
{user.username}
</b>
<span>({user.email})</span>
<button onClick={() => onRemove(user.id)}>삭제</button>
</div>
);
}
function UserList({ users, onRemove, onToggle }) {
return (
<div>
{users.map(user => (
<User
user={user}
key={user.id}
onRemove={onRemove}
onToggle={onToggle}
/>
))}
</div>
);
}
export default UserList;
실행 결과
계정명을 눌렀을 때 녹색으로 잘 바뀌는 것을 알 수 있다.
'개발 공부한 내용 정리 > React' 카테고리의 다른 글
React- useMemo 를 사용하여 연산한 값 재사용하기 (0) | 2020.09.12 |
---|---|
React- useEffect를 사용하여 마운트/언마운트/업데이트시 할 작업 설정하기 (0) | 2020.09.11 |
React- 배열의 항목 제거 하기 (0) | 2020.09.03 |
React- 배열에 항목 추가 하기 (0) | 2020.09.02 |
React- 배열 렌더링 하기 (0) | 2020.09.01 |