들어가며
항해 99 리액트 1주차의 과제는 투두리스트 만들기였습니다. 만들면서 css부터 react까지 많은 것을 배웠고, 이를 토대로 글을 작성해보고자 합니다.
1. 레이아웃 최대 넓이는 1200px, 최소 넓이는 800px로 제한하고 전체화면의 가운데로 정렬해주세요
.container {
min-width: 800px;
max-width: 1200px;
margin: 0 auto;
}
2. working 리스트가 나열됩니다.
.workingsContainer {
display: grid;
/* autofill공부
- auto-fill과 auto-fit은
column의 개수를 미리 정하지 않고 설정된 너비가 허용하는 한 최대한 셀을 채웁니다.
-
*/
grid-template-columns: repeat(auto-fit, min(240px));
gap: 20px;
}
.container {
width: 200px;
background-color: #ededed;
padding: 20px;
border-radius: 5px;
}
const Main = () => {
const [working, setWorking] = useState([]);
const [title, setTitle] = useState();
const [context, setContext] = useState();
// 인풋에서 Working 리스트로 저장하는 함수
const addWorksHandler = () => {
const newWork = {
// id 값 중복을 피하기 위해 uuid 사용
// state로 아이디 값 받아와도 괜찮음
id: uuid(),
title: title,
context: context,
done: false,
};
setWorking([...working, newWork]);
setTitle("");
setContext("");
};
const filtering = working.filter((work) => {
return work.id !== doneid;
});
const fix = working
.filter((work) => {
return work.id === doneid;
})
.map((work) => {
return {
id: work.id,
title: work.title,
context: work.context,
done: true,
};
});
setWorking([...filtering, ...fix]);
const index = working.findIndex((todo) => todo.id === doneid);
working[index].done = true;
setWorking([...working]);
const [title, setTitle] = useState();
const [context, setContext] = useState();
// 인풋에서 Working 리스트로 저장하는 함수
const addWorksHandler = () => {
const newWork = {
// id 값 중복을 피하기 위해 uuid 사용
// state로 아이디 값 받아와도 괜찮음
id: uuid(),
title: title,
context: context,
done: false,
};
setWorking([...working, newWork]);
// 추가 후 빈값으로 처리하는 코드
setTitle("");
setContext("");
};
// 추가 후 빈값으로 설정하기 위해서
// 콘솔에러가 뜨는데 처음 타이틀에 아무것도 없을 때는 '' 빈값으로
value={title || ""}
{WorkandDonelist &&
WorkandDonelist.map((work) => {
투두리스트는 수백번 해봤다 생각했는데, 생각보다 어려운 부분과 몰랐던 부분이 많았습니다. 세부적인 부분을 단순히 가져오는 것이 아닌, 스스로 생각해보는 시간을 가져야겠습니다.
다른 분이 짠 코드를 보니, input을 받는 형태가 달랐습니다. 신선한 형태였고, 이 부분을 추가로 공부 후 정리해보고자 아래 내용을 작성해봅니다.
event.target
을 콘솔로 치면 const [todos, setTodos] = useState({ title: "", content: "" });
const onChangeInputHandler = (event) => {
const { value, id } = event.target;
setTodos({ ...todos, [id]: value });
};
console.log(todos);
return (
<>
<input
type="text"
value={todos.title}
id="title"
onChange={onChangeInputHandler}
/>
<input
type="text"
value={todos.content}
id="content"
onChange={onChangeInputHandler}
/>
</>
);