
list์ ๋ํ ๋ถ๋ถ๋ค์ ์ ์ฅํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ
expo install @react-native-async-storage/async-storage
๋น๋๊ธฐ๋ก ๋์, key+value(๋๋ค string! ๋ณํํด์ผ ํจ)๋ก ๊ตฌ์ฑ๋ ๋จ์ storage
key, value๋ก ๋์ํ๋ฏ๋ก ํ api๋ก ํธ์ถ์ด ๊ฐ๋ฅ//์ ๋ ฅ ์ฒ๋ฆฌ const addItem = useCallback(() => { const newData = [ ...list, { key: new Date().toString(), content: inputText }, ]; //์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ์๋ list ์์ ๊ฐ๊ณผ ํจ๊ป key, content ๊ฐ์ผ๋ก ๋ํ๋ setList(newData); //์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ setList์ ํฌํจ AsyncStorage.setItem("todo-list", JSON.stringify(newData)); //AsnycStorage์ todo-list๋ผ๋ key์ newData๋ผ๋ value๋ฅผ stringํํด์ ์ ์ฅ setInputText("") }, [list, inputText]); //AstncStorage ์์ data๋ฅผ ๋ถ๋ฌ์ด (getItem) useEffect(() => { AsyncStorage.getItem("todo-list").then((rawData) => { if (rawData) { setList(JSON.parse(rawData)); } else { setList([]); } }); }, []);//์ญ์ ์ฒ๋ฆฌ const removeItem = useCallback( (key) => { const newData = list.filter((item) => item.key !== key); setList(newData); //์ญ์ ํ Stroage์ ๋ฃ์ด์ค AsyncStorage.setItem("todo-list", JSON.stringify(newData)); }, [list] );๊ฒน์น๋ ๋ถ๋ถ function์ผ๋ก ๋ฌถ์ด์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌ
function updateStorage(data) { return AsyncStorage.setItem("todo-list", JSON.stringify(newData)); } export default function App() { const [list, setList] = useState([]); const [inputText, setInputText] = useState(""); const addItem = useCallback(() => { const newData = [ ...list, { key: new Date().toString(), content: inputText }, ]; setList(newData); updateStorage(newData); setInputText(""); }, [list, inputText]); const removeItem = useCallback( (key) => { const newData = list.filter((item) => item.key !== key); setList(newData); updateStorage(newData); }, [list] ); useEffect(() => { AsyncStorage.getItem("todo-list").then((rawData) => { if (rawData) { setList(JSON.parse(rawData)); } else { setList([]); } }); }, []);
์๋ณธ์ ๋ณ๊ฒฝํ์ง ์๋๋ค, ๋ฐ๋์ ๋ณ๊ฒฝ๋ ์ฌ๋ณธ์ ํตํด ๋น๊ตํ๋ค
๋ฌด์์ด ๋ณ๊ฒฝ๋์๋ ์ง๋ฅผ ํตํด ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ์ฐพ์๋ธ๋ค
array.filter: ์๋ณธ์ ๋ณ๊ฒฝ๋์ง ์์, ์ฌ๋ณธ์ ์์ฑ, ์ถ๋ ค๋ด์ด ๋น๊ต
array.push(): ์๋ณธ์ ๋ณ๊ฒฝํจimmer
js์ ๊ธฐ๋ณธ state๋ฅผ ๋ค๋ฃจ๋ ๊ฒ
draft: ๋ณ๊ฒฝ์ ์ผ๋ง๋ ์ง ํ ์ ์๋ ์ด์//App.js import produce from "immer"; const updateItem = useCallback((key, value) => { const newData = produce(list, (draft) => { const index = list.findIndex((item) => item.key === key); draft[index].isDone = value; }); setList(newData); updateStorage(newData); }, [list] ); <TodoItem id={item.item.key} label={item.item.content} isDone={item.item.isDone} onSwitchChange={updateItem} onDelete={() => removeItem(item.item.key)} /> )} style={{ flex: 1 }} /> //TodoItem.js export default function TodoItem({ label, onDelete, isDone, onSwitchChange }) { return ( <Row style={{ alignItems: "center", marginBottom: 12 }}> <Switch value={isDone} onValueChange={(value) => onSwitchChange(id, value)} valuestyle={{ marginRight: 8 }} /> <Text style={{ color: isDone ? "#eee" : "#000" }}> {label ?? "๋ด์ฉ ์์"} </Text> <Button title="์ญ์ " onPress={onDelete} /> </Row> ); }switch ๋ณ๊ฒฝ์ด ๋์ด๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ด storage์ ์ update๋จ
array, object ๋ฑ์ด ๋ค์ด๊ฐ๋ฉด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ํ ๋์ ์ด ํ์