π― Todo List νλ©΄μ νμ¬ μκ°μ νμν©λλ€.
- Date κ°μ²΄μ
toLocaleDateString
κ³Ό toLocaleDateString
μ μ΄μ©ν΄ νμ¬ λ μ§μ μκ°μ κ°μ Έμμ΅λλ€. λ μ§μ optionμ DATE_FORM, μκ°μ optionμ TIME_FORMμ΄λ©° λμ typeμ Intl.DateTimeFormatOptionsμ
λλ€.
setIntervalν¨μ
λ₯Ό μ΄μ©ν΄ μ€μκ° μκ³λ₯Ό ꡬννμ΅λλ€.
// TodoHead.js
const TodoHead = () => {
//@TODO νμ¬ μκ°μ νμν΄μΌν©λλ€.
const [date] = useState(new Date().toLocaleDateString('en-US', DATE_FORM));
const [time, setTime] = useState(new Date().toLocaleTimeString('en-US', TIME_FORM));
useEffect(() => {
const timer = setInterval(() => {
setTime(new Date().toLocaleTimeString('en-US', TIME_FORM));
}, 1000);
return () => {
clearInterval(timer);
};
}, []);
return (
<TodoHeadBlock>
<p>{date}</p>
<p>{time}</p>
</TodoHeadBlock>
);
};
// utils/constants.ts
export const DATE_FORM: Intl.DateTimeFormatOptions = {
year: 'numeric',
weekday: 'long',
month: 'long',
day: 'numeric',
};
export const TIME_FORM: Intl.DateTimeFormatOptions = {
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
};
- style κ°μ κ²½μ° λ¬΄λΆλ³ν div νκ·Έ μ¬μ©κ³Ό μ»΄ν¬λνΈ μμ±μ λ§κΈ° μν΄ TodoHeadBlock μμ pνκ·Έμ child μμ±μ μ΄μ©ν΄ λμ ꡬλΆνμ΅λλ€.
// TodoHead.tsx
const TodoHeadBlock = styled.div`
padding-top: 52px;
padding-bottom: 24px;
border-bottom: 3px solid #33bb77;
p {
text-align: center;
color: #119955;
padding-top: 5px;
}
p:first-child {
font-size: 26px;
}
p:last-child {
font-size: 22px;
}
`;
π― To/do νλͺ©μ μλ£ λ²νΌμ λλ₯΄λ©΄ Todoκ° μλ£λ μ μλλ‘ μμ±ν©λλ€.
- λ¨Όμ
TodoItem.tsx
μμ μλ£ λ²νΌμ ν΄λ¦νμ λ idλ₯Ό useTodo
μ toggleTodo
ν¨μλ‘ λ겨μ€λλ€.
// TodoItem.tsx
const TodoItem = ({ toggleTodo, removeTodo, todo }: TodoItemProps) => {
const { id, text, done, startDate, deadline } = todo;
const handleCompleteToggle = useCallback((id) => {
toggleTodo(id);
}, []);
return (
<TodoItemBlock>
<CheckCircle done={done} onClick={() => handleCompleteToggle(id)}>
{done && <CheckOutlined />}
</CheckCircle>
...
<TodoItemBlock>
)
}
- μ λ¬ λ°μ idλ₯Ό ν΅ν΄ λ°κΎΈλ €λ itemμ μ°Ύκ³ , ES8μ object spread properties μ΄μ©ν΄ λΆλ³μ±μ μ§ν¨ μ± doneκ°μ λ³κ²½ν©λλ€.
// useTodo
const toggleTodo = (id: number) => {
setTodoState((prevState) =>
prevState.map((todo: Itodo) =>
todo.id === id
? {
...todo,
done: !todo.done,
}
: todo,
),
);
};