๐Ÿ’ป[React Native] Expo๋กœ TodoList ๋งŒ๋“ค๊ธฐ4-Flatlist, key, ์‚ญ์ œ

ํ˜ฑยท2023๋…„ 1์›” 15์ผ

๐Ÿ“Œ FlatList

์Šคํฌ๋กค์ด ํ•„์š”ํ•ด ์–‘์ด ๋งŽ์€ ์•„์ดํ…œ๋“ค์„ ๋ณด์—ฌ์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ
์Šคํฌ๋กค์„ ํ•˜๋ฉด ์›€์ง์ด๋Š” ๋ชจ์…˜์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์ด ํŠน์ง•, ๋ฆฌ์ŠคํŠธ ์•ˆ์—์„œ ์Šคํฌ๋กค ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
๐Ÿ”—App.js

<FlatList
          data={list}
          renderItem={(item) => <TodoItem label={item.item} />}
          //์–ด๋–ค ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ง€(map ํ•จ์ˆ˜์˜ ํ˜•์‹๊ณผ ๋™์ผ)
          keyExtractor={(item) => item} //key๊ฐ’ ์„ค์ •
          style={{ flex: 1 }}
          //์ž์‹ ์ด ์“ธ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ ์‚ฌ์šฉ
        />

๐Ÿ“Œ key

key๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๊ฒฝ์šฐ๋Š” keyExtractor ๋ถˆํ•„์š”
๋งŒ์•ฝ, key๋ฅผ ๊ฐ list์˜ ์ˆœ์„œ๋กœ ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, key:list.length+1+'' (string์œผ๋กœ ๋ณ€ํ™˜) ์ด์ง€๋งŒ ์ด๋•Œ ์‚ญ์ œ์˜ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ

uuid: ์™„๋ฒฝํ•˜๊ฒŒ ๊ฒน์น˜์ง€ ์•Š๋Š” hash-id ์ œ๊ณต

ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๊ธฐ์—” ๋„ˆ๋ฌด ๊ธด ๊ฒƒ์ด ๋‹จ์ 
react component์™€ ์•„๋ฌด ์ƒ๊ด€์ด ์—†๋Š” ์ˆœ์ˆ˜ Node package ๋”ฐ๋ผ์„œ expo์™€ ์ƒ๊ด€์—†์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ค์น˜๊ฐ€ ํ•„์š”
๋™์ผํ•˜๊ฒŒ ๋“ค์–ด๊ฐ€๋„ ๋žœ๋ค์œผ๋กœ ๋ฐฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒน์น  ์ผ์ด ๊ฑฐ์˜ ์—†์Œ
๐Ÿ”—App.js

const addItem = useCallback(() => {
    setList([...list, { key: uuid().toString(), content: inputText }]);
  }, [list, inputText]);
tinyuid: string์ด ์กฐ๊ธˆ ์งง๊ฒŒ ์ƒ์„ฑ๋จ
ํ˜„์žฌ Date ํด๋ฆญํ•˜๋Š” ์‹œ์ ์„ ์ด์šฉํ•ด์„œ key๋ฅผ ๋งŒ๋“ค์–ด๋„ ์ƒ๊ด€ ์—†์Œ(๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด ๋™์‹œ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ)

new Date().toString()

๐Ÿ“Œ ์‚ญ์ œ

์‚ญ์ œ์™€ ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ํ•จ์ˆ˜๋ฅผ ์‚ญ์ œ ๋ฒ„ํŠผ์—์„œ ํ˜ธ์ถœ
๐Ÿ”— App.js

 const removeItem = useCallback(
    (key) => {
      setList(list.filter((item) => item.key !== key));
    },
    [list]
  ); //์‚ญ์ œ ํ•จ์ˆ˜

<FlatList
          data={list}
          renderItem={(item) => (
            <TodoItem
              id={item.item.key}
          //key๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•จ ๊ทธ๋Ÿฌ๋‚˜ key๋Š” ๋ฏธ๋ฆฌ ์ง€์ •๋œ props 
          //๋”ฐ๋ผ์„œ Flatlist ๋“ฑ์— ์“ฐ์ด๋Š”  key์™€ ๊ฒน์น˜๊ฒŒ ๋˜๋ฏ€๋กœ, id๋กœ ๋ช…๋ช…
              label={item.item.content}
              onDelete={removeItem} 
			//Flatlist์—์„œ onDelete๋กœ ์‚ญ์ œ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์Œ
            />
          )}
          style={{ flex: 1 }}
        />
			//id์™€ onDelete๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋จ 

๐Ÿ”— TodoItem.js

export default function TodoItem({ label, id, onDelete }) {
  const [isDone, setDone] = useState(false);
  return (
    <Row style={{ alignItems: "center", marginBottom: 12 }}>
      <Checkbox
        value={isDone}
        onValueChange={(value) => setDone(value)}
        valuestyle={{ marginRight: 8 }}
      />
      <Text style={{ color: isDone ? "#eee" : "#000" }}>
        {label ?? "๋‚ด์šฉ ์—†์Œ"}
      </Text>
      <Button title="์‚ญ์ œ" onPress={() => onDelete(id)} />
    </Row>
  );
}

id ์ฆ‰, key๋ฅผ ์ด์šฉํ•ด์„œ ์‚ญ์ œ๋ฅผ ํ•˜๋ฏ€๋กœ ์ค‘๊ฐ„์˜ ๊ฒƒ๋“ค๋„ ์‚ญ์ œ ๊ฐ€๋Šฅ

๋งŒ์•ฝ, removeItem์˜ component๋ฅผ ํ•ด๋‹น component์•ˆ์—์„œ ์‹คํ–‰์‹œํ‚ฌ ๊ฒฝ์šฐ
id๋ฅผ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ๋„˜๊ฒจ์ฃผ๋Š” props๊ฐ€ ์ ์–ด์ง

๐Ÿ”— //App.js
<FlatList
          data={list}
          renderItem={(item) => (
            <TodoItem
              id={item.item.key}
              label={item.item.content}
              onDelete={()=>removeItem(item.item.key)}
            />
          )}
          style={{ flex: 1 }}
        />
//TodoItem.js
<Button title="์‚ญ์ œ" onPress={onDelete} />
profile
new blog: https://hae0-02ni.tistory.com/

0๊ฐœ์˜ ๋Œ“๊ธ€