컴포넌트 안에 컴포넌트를 넣어보자..
import React, {useState} from 'react';
import './App.css';
import UserList from './UserList';
function App() {
return (
<>
<UserList />
</>
);
}
export default App;
import React from 'react'
const Item = ({user}) => {
return (
<div>
<b>{user.username}</b><span>({user.email})</span>
</div>
)
}
const UserList = () => {
const users = [
{
id:1,
username : "jisung",
email : "jisung@gmail.com"
},
{
id:2,
username : "mark",
email : "marklee@naver.com"
},
{
id:3,
username : "jungwoo",
email : "jungwoo@gmail.com"
}
]
return (
<>
<Item user = {users[0]}></Item>
<Item user = {users[1]}></Item>
<Item user = {users[2]}></Item>
</>
)
}
export default UserList
UserList.jsx 약간의 변형
import React from 'react'
const Item = (props) => {
return (
<div>
<b>{props.user.username}</b><span>({props.user.email})</span>
</div>
)
}
const UserList = () => {
const users = [
{
id:1,
username : "jisung",
email : "jisung@gmail.com"
},
{
id:2,
username : "mark",
email : "marklee@naver.com"
},
{
id:3,
username : "jungwoo",
email : "jungwoo@gmail.com"
}
]
return (
<>
{users.map((user) => <Item user = {user} key = {user.id}/>)}
</>
)
}
export default UserList
UserList에 새로운 user를 추가
import React, {useRef, useState} from 'react';
import './App.css';
import CreateUser from './CreateUser';
import UserList from './UserList';
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:'jisung',
email:'jisung@gmail.com'
},
{ id:2,
username:'mark',
email:'marklee@naver.com'
},
{ id:3,
username:'jungwoo',
email:'jungwoo@gmail.com'
},
]);
const nextId = useRef(4);
const onCreate = () => {
const user = {
id : nextId.current,
username,
email
}
nextId.current += 1;
setUsers(users.concat(user));
setInputs = ({
username :'',
email : ''
})
}
return (
<>
<CreateUser
username = {username}
email = {email}
onCreate = {onCreate}
onChange = {onChange}
/>
<UserList users = {users} />
</>
);
}
export default App;
import React from 'react'
const Item = ({user}) => {
return(
<>
<div>
{user.username} : {user.email}
</div>
</>
)
}
const UserList = ({users}) => {
return (
<>
{users.map((user) => <Item user = {user} key = {user.id}/>)}
</>
)
}
export default UserList
import React from 'react'
const CreateUser = ({username, email, onCreate, onChange}) => {
return (
<>
<input
name = "username"
onChange = {onChange}
placeholder = '계정명'
value = {username}
/>
<input
name = "email"
onChange = {onChange}
placeholder = '이메일'
value = {email}
/>
<button onClick = {onCreate}>등록</button>
</>
)
}
export default CreateUser
DOM을 선택하는 용도 외에, 컴포넌트 안에서 조회 및 수정 할 수 있는 변수를 관리.
useRef로 관리하는 변수 값이 바뀌어도, 컴포넌트가 리렌더링 되지 않음.
배열에 새 항목을 추가할때, 새 항목에서 사용 할 고유 id를 관리 할 수 있음.
const nextId = useRef(4);
//useRef()에 파라미터를 넣어주면, 이 값이 .current의 값의 기본값.
값을 수정 : .current값을 수정.
값을 조회 : .current값을 조회.
UserList의 리스트를 삭제
import React, {useRef, useState} from 'react';
import './App.css';
import CreateUser from './CreateUser';
import UserList from './UserList';
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:'jisung',
email:'jisung@gmail.com'
},
{ id:2,
username:'mark',
email:'marklee@naver.com'
},
{ id:3,
username:'jungwoo',
email:'jungwoo@gmail.com'
},
]);
const nextId = useRef(4);
const onCreate = () => {
const user = {
id : nextId.current,
username,
email
}
nextId.current += 1;
setUsers(users.concat(user));
setInputs({
username :'',
email : ''
})
}
const onRemove = (id) => {
setUsers(users.filter(user => user.id !==id));
}
return (
<>
<CreateUser
username = {username}
email = {email}
onCreate = {onCreate}
onChange = {onChange}
/>
<UserList users = {users} onRemove={onRemove}/>
</>
);
}
export default App;
import React from 'react'
const Item = ({user, onRemove}) => {
const {username, email, id} = user;
return(
<>
<div>
{id}.{username} : {email}
</div>
<button onClick={() => onRemove(id)}>삭제</button>
</>
)
}
const UserList = ({users, onRemove}) => {
return (
<>
{users.map((user) => <Item user = {user} key = {user.id} onRemove = {onRemove}/>)}
</>
)
}
export default UserList
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.length > 6);
console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]
리스트를 클릭하면 토글스타일 적용하기
import React, {useRef, useState} from 'react';
import './App.css';
import CreateUser from './CreateUser';
import UserList from './UserList';
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:'jisung',
email:'jisung@gmail.com',
active : true
},
{ id:2,
username:'mark',
email:'marklee@naver.com',
active : false
},
{ id:3,
username:'jungwoo',
email:'jungwoo@gmail.com',
active : false
},
]);
const nextId = useRef(4);
const onCreate = () => {
const user = {
id : nextId.current,
username,
email
}
nextId.current += 1;
setUsers(users.concat(user));
setInputs({
username :'',
email : ''
})
}
const onRemove = (id) => {
setUsers(users.filter(user => user.id !==id));
}
const onToggle = (id) => {
console.log(id);
setUsers(users.map(user =>
user.id == id?
{
...user,
active:!user.active
}
:
user
)
)
}
return (
<>
<CreateUser
username = {username}
email = {email}
onCreate = {onCreate}
onChange = {onChange}
/>
<UserList users = {users} onRemove={onRemove} onToggle = {onToggle}/>
</>
);
}
export default App;
import React from 'react'
const Item = ({user, onRemove, onToggle}) => {
const {username, email, id, active} = user;
return(
<>
<div
style = {{
color : active ? 'green' : 'gray', cursor : 'pointer'}}
onClick={() => onToggle(id)}>
{id}.{username} : {email}
</div>
<button onClick={() => onRemove(id)}>삭제</button>
</>
)
}
const UserList = ({users, onRemove, onToggle}) => {
return (
<>
{users.map((user) => <Item user = {user} key = {user.id} onRemove = {onRemove}
onToggle = {onToggle}/>)}
</>
)
}
export default UserList