[React] React key
React key
๐ React์์ key์ ์ญํ
Key๋ React๊ฐ ์ด๋ค ํญ๋ชฉ์ ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ญ์ ํ ์ง ์๋ณํ๋ ๊ฒ์ ๋์ฐ๋ฉฐ,
๋ฐฐ์ด์ element์ ๊ณ ์ ์ฑ์ ๋ถ์ฌํ๊ธฐ ์ํด ๋ฐฐ์ด ๋ด๋ถ์ eliment์ key๋ฅผ ์ง์ ํ๋ค.
key๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ID๋ฅผ key๋ก ์ฌ์ฉํ์ง๋ง
์์ ์ ์ธ ID๊ฐ ์๋ค๋ฉด ์ตํ์ ์๋จ์ผ๋ก ๊ฐ element์ index๋ฅผ key๋ก ์ฌ์ฉํ ์ ์๋ค.
const todoItems = todos.map((todo) =>
<li key={todo.id}>
{todo.text}
</li>
);
๐ React์์ key๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์
ํจ์จ์ ์ธ DOM ํธ๋ฆฌ ๊ตฌ์กฐ ๊ตฌ์ถ ๋ฐ ๋ ๋๋ง ์ฑ๋ฅ์ ์ํด ๐ก
React์ ๊ฐ์ DOM ํธ๋ฆฌ ๋น๊ต ์๊ณ ๋ฆฌ์ฆ์ ์๋์ ๋ ๊ฐ์ง ๊ฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
๐ ์๋ก ๋ค๋ฅธ ํ์ ์ ๋ element๋ ์๋ก ๋ค๋ฅธ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
๐ key prop์ ์ด์ฉํด์ ์ฌ๋ฌ ๋ ๋๋ง ์ฌ์ด์์ ์ด๋ค ์์ element๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ผ ํ ์ง ํ์ํ ์ ์๋ค.
element์ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ํธ๋ฆฌ ์ ์ฒด๋ฅผ ์ฌ๊ตฌ์ถํ์ง๋ง,
element์ ํ์ ์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ ๋ element์ ์์ฑ์ ๋์์ ํ์ธํด์ ๋์ผํ ๋ด์ญ์ ์ ์งํ๊ณ ๋ณ๊ฒฝ๋ ์์ฑ๋ค๋ง ๊ฐฑ์ ํ๋ค.
ex) className์ด ๋ณ๊ฒฝ๋๋ฉด className๋ง ๊ฐฑ์ ํ๊ณ , inline CSS๊ฐ ๋ณ๊ฒฝ๋๋ฉด inline CSS๋ง ๊ฐฑ์
case 1. key๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ๋ง์ง๋ง์ element๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
๐๐ป ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ๋ ์ ์งํ๊ณ <li>third</li> ๋ง ์ถ๊ฐ
<ul>
<li>first</li>
<li>second</li>
</ul>
<ul>
// ์ ์ง
<li>first</li>
// ์ ์ง
<li>second</li>
// ์ถ๊ฐ๋ ์ธ ๋ฒ์งธ element๋ง ์
๋ฐ์ดํธํด์ ๋ ๋๋ง
<li>third</li> // ์ถ๊ฐ๋ ์ธ ๋ฒ์งธ element๋ง ์
๋ฐ์ดํธ
</ul>
case 2. key๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ฒซ ๋ฒ์งธ์ element๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
๐๐ป ์ฒซ ๋ฒ์งธ element๋ถํฐ ๋ง์ง๋ง element๊น์ง ๋ชจ๋ ์๋ก ๊ตฌ์ถํด์ผ ํด์ ๋นํจ์จ์ ์
<ul>
<li>Duke</li>
<li>Villanova</li>
</ul>
<ul>
// ์๋ก ์
๋ฐ์ดํธํด์ ๋ ๋๋ง
<li>Connecticut</li>
// ์๋ก ์
๋ฐ์ดํธํด์ ๋ ๋๋ง
<li>Duke</li>
// ์๋ก ์
๋ฐ์ดํธํด์ ๋ ๋๋ง
<li>Villanova</li>
</ul>
case 3. key ๊ฐ์ ๋ถ์ฌํ๋ฉด์ ์ฒซ ๋ฒ์งธ์ element๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
๐๐ป key ์์ฑ์ ์ด์ฉํ๋ฉด key๋ฅผ ํตํด ๊ธฐ์กด์ DOM ํธ๋ฆฌ์
์ ๋ฐ์ดํธ๋ DOM ํธ๋ฆฌ์ ์์ element๋ค์ด ๋์ผํ์ง ํ์ธํด์
key ๊ฐ์ด ์ผ์นํ์ง ์๋ element๋ง ์ถ๊ฐํด์ ์ ๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง์ ํจ์จ์ ์
<ul>
<li key="2015">Duke</li>
<li key="2016">Villanova</li>
</ul>
<ul>
// ์ฒซ ๋ฒ์งธ์ ์ถ๊ฐ๋์์ง๋ง ํด๋น element๋ง ์
๋ฐ์ดํธํด์ ๋ ๋๋งํจ
<li key="2014">Connecticut</li>
// ๊ธฐ์กด์ key ๊ฐ์ ๊ฐ์ง๊ณ ์๋ element๋ค์
<li key="2015">Duke</li>
// DOM์ ์๋ก ๊ตฌ์ถ๋์ง ์๊ณ ์๋ฆฌ๋ง ์ด๋
<li key="2016">Villanova</li>
</ul>