๐๐ป ReactNetive ๊ณต๋ถ์ ํ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๊ตฌํํ ๊ธฐ๋ฅ
๋๋์
๋น์ทํ๋ฉด์๋ ๋ค๋ฅธ react ์ reactNetive
์ด์ ๋ฌด์์ ํด๋ณผ๊น
๋ฌธ์ ์์
TodoList ์ ์ฒดํฌ๋ฐ์ค๋ฅผ ํด๋ฆญํ์๋ ์ฒดํฌ๊ฐ ๋๊ณ , ํด๋น TodoItem ์ ํ ์คํธ๊ฐ ์ทจ์์ ์ด ๊ทธ์ด์ง๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผ ํ๋ค. ํ์ง๋ง ์ทจ์์ ์ Week 1 ์์๋ง ์๊ธฐ๊ณ , ์ฒซ๋ฒ์งธ todoList ๋ฅผ ํด๋ฆญํ๋ฉด ๋ชจ๋ Week ์ ์ฒซ๋ฒ์งธ TodoList ๊ฐ ์ฒดํฌ๋๋ค.. (์ทจ์์ ์๋๋๊ฑด ๋ค)
Data ์์ฒด๋ ์ get ํ๊ณ set ํ๋๊ฒ ๊ฐ์๋ฐ, ํด๋น ์ฒดํฌ๋ฐ์ค๋ฅผ ๊ทธ๋ ค์ค๋ ์๋ชป ๊ทธ๋ ค์ฃผ๊ณ ์๋.... ํ๋ ์๊ฐ์ด ๋ ๋ค. 2์๊ฐ์งธ ์ฐพ๋์ค์ด๋ค... ์์ค๋ ์๋์ ๊ฐ๋ค.
// ํด๋น Week ์ TodoList ๋ฅผ ๊ทธ๋ ค์ฃผ๋ ํจ์
{todos.map((todo, index) => (
<View key={index} style={styles.todoItem}>
<BouncyCheckbox
isChecked={todo.completed}
onPress={() => handleToggleTodo(index)}
/>
<Text style={[styles.todoText , {textDecorationLine : todo.completed ? 'line-through' : 'none' } ]}>{todo.content}</Text>
</View>
))}
// TodoList ์ฒดํฌ ๋ฐ์ค ์ฒดํฌํ๋ฉด ์ฒดํฌ๋ ๋ฐ์ดํฐ ํ์ธํด์
// completed ๊ฐ ๋ฐ๊ฟ์ฃผ๋ ํจ์
const handleToggleTodo = (weekNumber: number, index: number) => {
setTodoData(
(prevData) =>
prevData.map((todo, i) =>
todo.weekNumber === weekNumber && i === index
? { ...todo, completed: !todo.completed }
: todo
)
);
};
์ด์ค์ ๋ฒ์ธ์ด ์์ง ์์๊น...
๋๋ฒ๊ทธ๋ฅผ ์ฐ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ด์ ํด๋งค๊ณ ์๋ค... ๋๋ฒ๊ทธ ์ฐ๋ ๋ฐฉ๋ฒ๋ถํฐ ์ฐพ์๋ด์ผ๊ฒ ๋คใ ใ ใ
๋ฉ์ฒญํ๋ค...
// TodoList ์ฒดํฌ ๋ฐ์ค ์ฒดํฌํ๋ฉด ์ฒดํฌ๋ ๋ฐ์ดํฐ ํ์ธํด์
// completed ๊ฐ ๋ฐ๊ฟ์ฃผ๋ ํจ์
const handleToggleTodo = (weekNumber: number, index: number) => {
setTodoData(
(prevData) =>
prevData.map((todo, i) =>
// ์ด๋ถ๋ถ์ด ๋ฌธ์ ์๋ค. ( i === index)
todo.weekNumber === weekNumber && i === index
? { ...todo, completed: !todo.completed }
: todo
)
);
};
weekNumber 1์ 3๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๊ณ weekNumber 2์ 3๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์๋ weekNumber 2 ์ ์ฒซ๋ฒ์งธ todoList ๋ฅผ ํด๋ฆญํ๋ฉด weekNumber : 1 index : 0 ์ด ๋์ค์ง๋ง, i ์๋ 3์ด ๋ค์ด๊ฐ ๋ฒ๋ฆฐ ๊ฒ์ด์๋ค.... ์๋๋ฉด prevData ๋ 0,1,2, "3" ๋ฒ์งธ๋ฅผ ๋๊ณ ์์ผ๋...
const handleToggleTodo = (weekNumber: number, index: number) => {
setTodoData((prevData) => {
console.log('Previous Data:', prevData);
// ์ฃผ์ด์ง ์ฃผ์ฐจ์ ํด๋นํ๋ todo๋ง ํํฐ๋ง
const filteredData = prevData.filter((todo) => todo.weekNumber === weekNumber);
// ํํฐ๋ง๋ todo๋ฅผ map์ ์ฌ์ฉํ์ฌ ์
๋ฐ์ดํธ
const updatedData = filteredData.map((todo, todoIndex) => {
console.log(todoIndex + ' Todo:', todo);
if (todoIndex === index) {
// ์ฃผ์ด์ง index์ ํด๋นํ๋ todo์ completed๋ฅผ ํ ๊ธ
const updatedTodo = {
...todo,
completed: !todo.completed,
};
console.log('Updated Todo:', updatedTodo);
return updatedTodo;
}
return todo;
});
// ๊ธฐ์กด ๋ฐ์ดํฐ ์ค์์ ํด๋น ์ฃผ์ฐจ์ ๋ฐ์ดํฐ๋ง ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ก ๊ต์ฒด
return prevData.map((todo) =>
todo.weekNumber === weekNumber ? updatedData.shift() || todo : todo
);
});
};
๋ฐ์์จ weekNumber ์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ง ํํฐ๋ง์ ํด์ฃผ๊ณ , ํํฐ๋ง๋ ๋ฐ์ดํฐ์์๋ง ๋น๊ตํ์๋ค. ๋๋จธ์ง๋ ๋ฐ๋ก ๋ฃ์ด์ฃผ๋ ํํ๋ก ๊ธฐ๋ฅ์ ์์ ํ๋ค!!
๋๋ฒ๊ทธ๋ฅผ console.log ๋ก๋ง ์ฐ๋ค๋ณด๋ ๋ฌธ์ ํ์ ์ด ์ฝ์ง ์์๋๊ฒ ๊ฐ๋ค.. (web ๋๋ฒ๊ทธ ์ฐ๊ธฐ๋ ์ฌ์ ๋๋ฐ ใ ใ ใ )
ADD ๋ฒํผ๋ง ๋๋ ๋๋ฐ ์ด๋ป๊ฒ ๋ฐ๋ก ์ํ์ด ์ฌ๋ผ์ค์ง?...
๊ทธ๋์์ TextInput ์ ๊ธ์๋ฅผ ์ ๋ ฅํ๊ณ ADD ๋ฒํผ์ ๋๋ฌ์ ์ถ๊ฐ์์ผฐ๋๋ฐ... ์ด๋ฒ์๋ ADD ๋ฒํผ๋ง ๋๋ ์๋ ์ํ์ด ์ฌ๋ผ์ค๊ฒ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค..
keyboard ๋ฅผ ๋์์ฃผ๋ ๊ธฐ๋ฅ์ ์๋ค๊ณ ํ๋ค..
์ค๋ง TextInput ์ ์ด๋๊ฐ์ ์จ๊ฒจ๋๊ณ ADD ๋ฒํผ์ ๋๋ฅด๋ฉด ์จ๊ฒจ๋์ textInput ์ ํฌ์ปค์ฑ์ ํ๋ ์ด์ํ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฉด ์๋๊ฒ ์ง? ๋ผ๊ณ ์๊ฐํ์์ง๋ง
<View
style={{ flexDirection: 'row', justifyContent: 'space-between', paddingHorizontal: 20, alignItems: 'center' }}
>
// ์ด๋๊ฐ๋ก ์จ๊ฒจ๋ฒ๋ฆฐ textInput
<TextInput
style={{ position: 'absolute', left: -1000 }}
ref={textInputRef}
value={newTodo}
onChangeText={(text) => setNewTodo(text)}
onSubmitEditing={handleTextInputSubmit}
/>
<Button title="Add" onPress={handleButtonPress} color={'#FF7484'} />
</View>