1. Lists
1.1 JS map()
for ๋ฐ๋ณต๋ฌธ์ JSX ์ค๊ดํธ ์์์ ์ฌ์ฉํ ์ ์์ด์ map()์ ๋์ ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋ array ์๋ฃ ์ฐ์ธก์ map() ํจ์๋ฅผ ๋ถ์ผ ์ ์์ต๋๋ค.
1.1.1 ๋ฐฐ์ด ์์๋งํผ ๋ฐ๋ณต์คํ
1let array = [2, 3, 4]23array.map(() => {4console.log(1) // 1์ด 3๋ฒ ์ถ๋ ฅ5})
1.1.2 ์ฝ๋ฐฑํจ์
์ฝ๋ฐฑํจ์์ ํ๋ผ๋ฏธํฐ ์๋ฌด๋ ๊ฒ๋ ์๋ช
ํ๋ฉด, ๊ทธ ํ๋ผ๋ฏธํฐ๋ array ์์ ์๋ ๋ชจ๋ ์๋ฃ๋ฅผ ํ๋์ฉ ์ถ๋ ฅํด์ค๋๋ค.
(๊ทธ๋ฅ ์๊ดํธ์์ ์๋ ํจ์๋ฅผ ์ฝ๋ฐฑํจ์๋ผ๊ณ ํฉ๋๋ค).
1let array = [2, 3, 4]23array.map(Element => {4console.log(Element) // 2, 3, 45})
1.1.3 ์์ ์กฐ์ํด ์ ๋ฐฐ์ด๋ก
1let array = [2, 3, 4]23let newArray = array.map(Element => {4return Element * 105})6console.log(newArray) // [20, 30, 40]
1.2 Rendering Multiple Components
- Rendering Multiple Components = ๋ค์ ์ปดํฌ๋ํธ ๋ ๋๋ง
1const numbers = [1, 2, 3, 4, 5]2const listItems = numbers.map(numbers => <li>{numbers}</li>)34// ์ ์ฒด listItems ๋ฐฐ์ด์ <ul> ์์ ์์ ์ฝ์ ํ ๋ค DOM์์ ๋ ๋๋ง5const root = ReactDOM.createRoot(document.getElementById('root'))6root.render(<ul>{listItems}</ul>) // 1๋ถํฐ 5๊น์ง์ ์ซ์๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์คํธ
1.3 Basic List Component
๋ณดํต ๋ฆฌ์คํธ๋ฅผ ์ปดํฌ๋ํธ ์์์ ๋ ๋๋งํฉ๋๋ค.
์ ์ฝ๋์ numbers ๋ฐฐ์ด์ ๋ฐ์์ ์์์๋ ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ ์ปดํฌ๋ํธ๋ก ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.
1function NumberList(props) {2const numbers = props.numbers3const listItems = numbers.map(number => <li key={number.toString()}>{number}</li>)4return <ul>{listItems}</ul>5}67const numbers = [1, 2, 3, 4, 5]89const root = ReactDOM.createRoot(document.getElementById('root'))10root.render(<NumberList numbers={numbers} />)
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, ๋ฆฌ์คํธ ์์ดํ
์ ํค๋ฅผ ๋ฃ์ด์ผํ๋ค๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค.
ํค(key)๋ ์์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ๋ ํฌํจํด์ผํ๋ ํน์ํ ๋ฌธ์์ด ์์ฑ์
๋๋ค.
2. Key
key= ์ด๋ค ์์ดํ ์ธ์ง ์ธ์ํ๋ ํ๋ณํ๋ ID- key ๊ฐ์ ๊ณ ์ ํด์ผ ํจ
- key ๊ฐ์ html์ ๋๋๋ง ํ ๋, ๋ณ๊ฒฝ๋ html๋ง ๋๋๋ง, ์ต์ ํ ํ๊ธฐ ์ํด ์ฌ์ฉ
ํค๋ฅผ ์ ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฆฌ์คํธ ์์ดํ ์ ํ์ ์ค ๋ฆฌ์คํธ ์์ดํ ์ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ID๋ฅผ ํค๋ก ์ฌ์ฉํฉ๋๋ค.
์์ดํ ์ ์์๊ฐ ๋ฐ๋ ์ ์๋ ๊ฒฝ์ฐ ํค์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ ์ข์ต๋๋ค. ์ด๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋๊ฑฐ๋ ์ปดํฌ๋ํธ์ state์ ๋ฐ๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค
2.1 key๋ก ์ปดํฌ๋ํธ ์ถ์ถ
key๋ ์ฃผ๋ณ ๋ฐฐ์ด์ ์ปจํ ์คํธ์์๋ง ์๋ฏธ๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ListItem ์ปดํฌ๋ํธ๋ฅผ์ถ์ถํ ๊ฒฝ์ฐ,
ListItem ์์ฒด์ ๋ฃจํธ <li> ์์๊ฐ ์๋ ๋ฐฐ์ด์ <ListItem /> ์์๊ฐ ํค๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผํฉ๋๋ค.
1function ListItem(props) {2// Correct! There is no need to specify the key here:3return <li>{props.value}</li>4}56function NumberList(props) {7const numbers = props.numbers8const listItems = numbers.map(number => (9// Correct! Key should be specified inside the array.10<ListItem key={number.toString()} value={number} />11))12return <ul>{listItems}</ul>13}1415const numbers = [1, 2, 3, 4, 5]1617const root = ReactDOM.createRoot(document.getElementById('root'))18root.render(<NumberList numbers={numbers} />)
2.2 JSX์์ map() ํฌํจํ๋ ๋ฒ
JSX๋ ์ค๊ดํธ๋ฅผ ์ด์ฉํ๋ฉด ๋ชจ๋ ํํ์์ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์ map() ๋ ์ธ๋ผ์ธ์ผ๋ก ํฌํจ์ํฌ ์ ์์ต๋๋ค.
1function ListItem(props) {2return <li>{props.value}</li>3}45function NumberList(props) {6const numbers = props.numbers7// ์ค๊ดํธ๋ฅผ ์ด์ฉํด map() ๋ฃ์ ์ ์์8return (9<ul>10{numbers.map(number => (11<ListItem key={number.toString()} value={number} />12))}13</ul>14)15}1617const numbers = [1, 2, 3, 4, 5]1819const root = ReactDOM.createRoot(document.getElementById('root'))20root.render(<NumberList numbers={numbers} />)
๋๋ก๋ ์ฝ๋๊ฐ ๋ ๋ช ํํด์ง ์๋ ์์ง๋ง ์ด ์คํ์ผ๋ ์ ์ฉ๋ ์ ์์ต๋๋ค. JS์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋ ์ฑ์ ์ํด ๋ณ์๋ก ์ถ์ถํด์ผํ ์ง์ ๋ํ๊ฑด ๊ฐ๋ฐ์๊ฐ ํ๋จํด์ผํฉ๋๋ค. map() ๋ฐ๋๊ฐ ๋๋ฌด ์ค์ฒฉ๋์ด์๋ค๋ฉด, ์ปดํฌ๋ํธ๋ก ์ถ์ถ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
3. ์์
1import { useState } from 'react'23export default function App() {4const [inputValue, setInputValue] = useState('')5const [list, setList] = useState(['๋ฐฅ๋จน๊ธฐ', '์ฝ๋ฉํ๊ธฐ'])67const addTodoList = () => {8setList(prevList => {9return [inputValue, ...prevList]10})11setInputValue('')12}1314return (15<>16<input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} />17<button onClick={addTodoList}>์ถ๊ฐ</button>18<ul>19{list.map(item => {20return <li>{item}</li>21})}22</ul>23</>24)25}
์ฝ์ ์ฐฝ์ ๋ณด๋ฉด, key๊ฐ ์๋ค๊ณ Warning ์ฐฝ์ด ๋์ด
- ๋ฟ๋ง ์๋๋ผ, Elementsํญ์ ํจ ์ฑ๋ก ๊ฐ์ ์ถ๊ฐํด๋ณด๋ฉด, ๋ชจ๋ DOM li ์์๊ฐ ํ๋ฒ์ ์ ๋ฐ์ดํธ๋จ
- ์๋ํ๋ฉด key๊ฐ์ด ์์ด์, React๋ ์ด๋ค ํญ๋ชฉ์ด ์ ๋ฐ์ดํธ๋๋์ง ๋ชฐ๋ผ์, ๋ชจ๋ ํญ๋ชฉ์ ์ ๋ฐ์ดํธํด์ค
- ๋ง์ฝ ํญ๋ชฉ์ด 100๋ง๊ฐ ์๋ค๋ฉด, ์ ํญ๋ชฉ์ ์ถ๊ฐํ ๋๋ง๋ค 100๋ง๊ฐ๋ฅผ ์ ๋ฐ์ดํธํด์ค (๋นํจ์จ์ )
1export default function App() {2// ์๋ต3return (4<>5<input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} />6<button onClick={addTodoList}>์ถ๊ฐ</button>7<ul>8{list.map(item => {9// key๊ฐ์ด ์์ผ๋ฉด ๊ฒฝ๊ณ ๊ฐ ๋ฌ๋ค. key๊ฐ์ ๊ณ ์ ํ ๊ฐ์ด์ด์ผ ํ๊ณ , index๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.10// ์ด์ ์ ์ฒด ํญ๋ชฉ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์๋๋ผ, ํน์ key๊ฐ์ ํญ๋ชฉ๋ง ์ถ๊ฐํ๋ค.11return <li key={item}>{item}</li>12})}13</ul>14</>15)16}
key๊ฐ์ ์ถ๊ฐํด์ฃผ๋ฉด, ํญ๋ชฉ์ ์ถ๊ฐํ ๋, ์ ์ฒด ํญ๋ชฉ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ด ์๋๋ผ, ํน์ key๊ฐ์ ํญ๋ชฉ๋ง ์ถ๊ฐํ๋ค.
3.1 key๊ฐ์ผ๋ก index๋ฅผ ์ฌ์ฉXโญ
1export default function App() {2// ์๋ต3return (4<>5<input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} />6<button onClick={addTodoList}>์ถ๊ฐ</button>7<ul>8{list.map((item, index) => {9// key๊ฐ์ด ์์ผ๋ฉด ๊ฒฝ๊ณ ๊ฐ ๋ฌ๋ค. key๊ฐ์ ๊ณ ์ ํ ๊ฐ์ด์ด์ผ ํ๊ณ , index๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค.10// index๋ ์์ ์ (๊ณ ์ ์ )์ด์ง ์๊ธฐ ๋๋ฌธ์, ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด, index ์์๊ฐ ์ถ๊ฐํ ๋งํผ ๋ฐ๋ฆผ11// ๊ทธ๋์ React๋ key๊ฐ์ด ๊ณ ์ ์ ์ด์ง ์๋ค๊ณ ํ๋จํด์, ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด, ์ ์ฒด ํญ๋ชฉ์ ์ ๋ฐ์ดํธํจ12return <li key={index}>{item}</li>13})}14</ul>15</>16)17}
์ถ๊ฐ์ ์ผ๋ก key๊ฐ์ผ๋ก index๋ฅผ ์ฐ๋ฉด ์๋ฉ๋๋ค. ์๋ํ๋ฉด index๋ ์์ ์ (๊ณ ์ ์ )์ด์ง ์๊ธฐ ๋๋ฌธ์, ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด, index ์์๊ฐ ์ถ๊ฐํ ๋งํผ ๋ฐ๋ฆฌ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ React๋ key๊ฐ์ด ๊ณ ์ ์ ์ด์ง ์๋ค๊ณ ํ๋จํด์, ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ฉด, ์ ์ฒด ํญ๋ชฉ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
3.2 key๊ฐ์ ๊ณ ์ ํด์ผ ํจ
1import { useState } from 'react'23export default function App() {4const [inputValue, setInputValue] = useState('')5const [list, setList] = useState([6{7id: '1',8value: '๋ฐฅ๋จน๊ธฐ',9},10{11id: '2',12value: '์ฝ๋ฉํ๊ธฐ',13},14])1516const addTodoList = () => {17setList(prevList => {18return [19{20id: list.length + 1 + '',21value: inputValue,22},23...prevList,24]25})26setInputValue('')27}2829return (30<>31<input type="text" value={inputValue} onChange={e => setInputValue(e.target.value)} />32<button onClick={addTodoList}>์ถ๊ฐ</button>33<ul>34{list.map(item => {35return <li key={item.id}>{item.value}</li>36})}37</ul>38</>39)40}
[์ฐธ๊ณ ] ๊ณต์๋ฌธ์
- Official DocsLists and Keys
- ๋ณ์ฝ๋ฉ