React array state๊ฐ€ ๊ฐฑ์‹ ๋˜์–ด๋„ view๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ

React array state๊ฐ€ ๊ฐฑ์‹ ๋˜์–ด๋„ view๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ

const [members, setMembers] = useState<Array<string>>([]);

const deleteMember = (index: number) => {
    // member ์‚ญ์ œ
    const tmp = members;
    tmp.splice(index, 1);
    setMembers(tmp);
}

return(
    <>
    {
        members.map((member: string, index: number) =>
        <Grid key={member}>{member}</Grid>
    }
       </>
);

members๋ผ๋Š” Array state์˜ ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋„ ํ‘œ์‹œ๋˜๋Š” ํ•™์ƒ์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ๋ณด๋ฉด ๋ถ„๋ช… ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ members State๋Š” ๋ณ€๊ฒฝ๋˜์–ด์žˆ๋‹ค. ์ด๊ฒŒ ์–ด๋–ป๊ฒŒ ๋œ ์ผ์ผ๊นŒ?

 

React ๋ Œ๋”๋ง

React๋Š” Virtual DOM์„ ๊ทธ๋ฆฌ๋ฉฐ ํ•ด๋‹น ํŠธ๋ฆฌ๊ฐ€ ๋ณ€ํ–ˆ๋Š”์ง€ ํŒ๋‹จ์„ ํ•˜๊ธฐ ์œ„ํ•ด Reconciliation์„ ํ•œ๋‹ค.

๊ทธ ๊ณผ์ • ์ค‘ state์™€ props๊ฐ€ ๊ฐ™์€์ง€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Object.is ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฐ์ฒด๋Š” ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋น„๊ต๋œ๋‹ค.

const deleteMember = (index: number) => {
    // member ์‚ญ์ œ
    const tmp = members;
    tmp.splice(index, 1);
    console.log(Object.is(tmp, members)); // true
    setMembers(tmp); // rerendering x
}

 

์œ„์˜ ํ•จ์ˆ˜๋ฅผ ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ์–ด์„œ Obejct.is ๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ๊ฐ™์€ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— true๊ฐ€ return ๋˜์–ด setMembers๋กœ state๋ฅผ ๊ฐฑ์‹ ํ•ด๋„ ๊ฐฑ์‹ ๋˜์—ˆ๋‹ค๋Š” ๊ฑธ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜์—ฌ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์–•์€ ๋ณต์‚ฌ

const deleteMember = (index: number) => {
    // member ์‚ญ์ œ
    const tmp = [...members];
    // const tmp = members.slice(0); ๋„ ๊ดœ์ฐฎ๋‹ค.
    // const tmp = Object.assign([], members); ๋„ ๊ดœ์ฐฎ๋‹ค.
    tmp.splice(index, 1);
    console.log(Object.is(tmp, members)); // false
    setMembers(tmp); // rerendering o
}

๋”ฐ๋ผ์„œ ์ด๋ ‡๊ฒŒ ์š”์†Œ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด Object.is ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด false๊ฐ€ ๋‚˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ด๋‹น state์— ์˜ํ•ด Virtual DOM์˜ ํ•ด๋‹น ๋ถ€๋ถ„์ด ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค.

๋ฐ˜์‘ํ˜•