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์ ํด๋น ๋ถ๋ถ์ด ๋ฆฌ๋ ๋๋ง๋๋ค.
Comment