노력이 좋아서
<step65>'react_todolist실습'
zoaseo
2022. 6. 22. 14:07
1)
App.js
import './App.css';
import { useState, useRef } from 'react';
import CreateTodo from './components/CreateTodo';
import TodoList from './components/TodoList';
function App() {
//CreateUser의 입력 인풋을 상태관리
const [ inputs, setInputs ] = useState({
todo: '',
});
const onChange = (e) => {
const {name, value} = e.target;
setInputs({
...inputs,
[name]: value,
})
console.log(inputs);
}
const {todo} = inputs;
//useState()실행 -> 배열 return
//arr[0] = 상태
//arr[1] = 상태를 변경해주는 f
const [users,setUsers] = useState([
])
const nextId = useRef(1);
//배열에 새로운 항목을 추가하는 함수
//users 배열에 새로운 user 객체를 추가
const onCreate = () => {
//새로운 user 객체 생성
const user = {
id: nextId.current,
todo, // = username: username
active: false,
}
setUsers([...users,user]);
setInputs({
todo: '',
})
nextId.current += 1;
}
const onDelete = (id) => {
setUsers(users.filter(user=>id !== user.id));
}
const onToggle = (id) => {
setUsers(users.map(user=> id ===user.id? {...user, active : !user.active} : user));
}
return (
<div className="App">
<CreateTodo todo={todo} onChange={onChange}
onCreate={onCreate}></CreateTodo>
<TodoList users={users} onDelete={onDelete} onToggle={onToggle} />
</div>
);
}
export default App;
CreateTodo.js
import React from 'react';
import './TodoList.css';
const CreateUser = ({todo, onChange, onCreate}) => {
return (
<div id="wrap">
<h1>to do list</h1>
<input name="todo" value={todo}
onChange={onChange} />
<button onClick={onCreate}>+</button>
</div>
);
};
export default CreateUser;
TodoList.js
import React from 'react';
const User = ({user, onDelete, onToggle}) => {
return (
<div>
<span className={user.active ? 'active' : ""} onClick={()=>{onToggle(user.id)}}>
{user.todo}
</span>
<button id="btn" onClick={()=>{onDelete(user.id)}}>x</button>
</div>
)
}
const UserList = ({users, onDelete, onToggle}) => {
return (
<div id='lists'>
{users.map(user => <User user={user} key={user.id} onDelete={onDelete} onToggle={onToggle}/>)}
</div>
);
};
export default UserList;
TodoList.css
* {padding: 0; margin: 0 auto;box-sizing: border-box;}
#wrap {
width: 1000px;
height: 150px;
background-color: red;
margin: 0 auto;
padding-top: 30px;
}
h1 {
color: #fff;
}
input {
border-radius: 20px;
outline: none;
border: none;
padding: 10px 20px;
width: 600px;
}
button {
border: none;
background-color: #fff;
padding: 3px 10px;
font-size: 20px;
border-radius: 100%;
margin-left: 20px;
}
#lists {
background-color: #eee;
width: 1000px;
text-align: left;
}
#lists div {
padding: 10px 50px;
font-size: 20px;
}
.active {
background-color: #ccc;
border-radius: 5px;
padding: 0 5px;
}
#btn {
border: none;
background-color: #fff;
padding: 1px 7px;
font-size: 15px;
border-radius: 100%;
}