기존에 하던 투두리스트를 리액트로 해보기전에 선택항목을 불러오는 투두리스트를 짜보았다.
const [inputText, setInputText] = useState('')
const [todos, setTodos] = useState('')
//인풋 value => inputText로 넣기
const inputTextHandeler = (e) => {
setInputText(e.target.value);
};
//클릭시 input value todos로 넣기
const submitTodoHandeler = (e) => {
e.preventDefault();
setTodos([
...todos,
{ text: inputText, completed: false, id: Math.random() * 1000 },
]);
// todos로 넣은 후 inputText비우기
setInputText("");
};
인풋값이 onChange할때마다 inputText로 들어가게 하였으며, 새로운 todos변수에 data형식 array를 만들어서 text안에 인풋값이 다시 들어가게 하였다.
const getTodo = todos.map((todo) => (
<Todo
key={todo.id}
text={todo.text}
setTodos={setTodos}
todos={todos}
todo={todo}
/>
));
//Todo.js
<div className='todo'>
<li>
{text}
</li>
<button className='complete-btn'>
선택
</button>
<button className='trash-btn'>
삭제
</button>
</div>
리액트에서 array를 반복문 돌면서 html을 만드는 방법으로 map을 사용하였으며, 리스트 하나하나의 값을 모듈화하여 다른 파일로 빼내었다. 또한
props값으로 데이터들을 전달하였다.
const completeHandeler = () => {
setTodos(
todos.map((item) => {
if (item.id === todo.id) {
return { ...item, completed: !item.completed };
}
return item;
})
);
};
버튼을 onClick할때 setTodos로 값을 변경하여 리스트가 자동적으로 변경되게 하였으며, 안에는 todos를 반복문 돌린 후 if조건문으로 id값이 같다면 completed: 기존의 boolean값의 반대값을 가지게 하였다.
const [status, setStatus] = useState("all");
const statusHandeler = (e) => {
setStatus(e.target.value);
};
//선택하게 될 기준 리스트
<select onChange={statusHandeler}>
<option value='all'>All</option>
<option value='completed'>Completed</option>
<option value='uncompleted'>Uncompleted</option>
</select>
onChange시 status로 value값을 넣어주었다.
const [filteredTodos, setFilteredTodos] = useState([]);
useEffect(() => {
filterHandler();
}, [todos, status]);
const filterHandler = () => {
switch (status) {
case "completed":
setFilteredTodos(todos.filter((todo) => todo.completed === true));
break;
case "uncompleted":
setFilteredTodos(todos.filter((todo) => todo.completed === false));
break;
default:
setFilteredTodos(todos);
break;
}
};
일단 switch문법을 통하여 조건들의 결과를 구성하였다.
조건의 기준은 status(select.option값이다)이고 각각의 조건에 해당되는 값에따라 filter함수를 사용하여 새로 배열을 만들었다.
const getTodo = filteredTodos.map((todo) => (
<Todo
key={todo.id}
text={todo.text}
setTodos={setTodos}
todos={todos}
todo={todo}
/>
));
기존에 리스트였던 todos에 map반복문을 돌려서 리스트를 구현하였었다.
그러나 지금은 선택기준옵션에 맞는 filteredTodos를 새로 만들었기 때문에 filteredTodos에 map을 적용하여 다시 구현하였다.