기존 DOM 요소(div, a, etc)에 props를 넘겨줄 수 있는가?
No! JSX로 작성된 기존 DOM 요소는 React가 실제 요소로 변경해서 사용하는데 기존 속성에 추가할 수 없기 때문입니다. 그렇기에 기존 DOM 요소에 props를 넘겨주고 싶다면, cusDiv와 같은 컴포넌트를 만들어서 사용해야 합니다.
Render Array
JSX 내부에 {}를 통해 JS 변수를 넣을 때 화면에 보이는 형태로 직접 렌더링 되는 데이터가 있습니다.
React Element, 문자열, 숫자 그리고 배열입니다.
배열을 {[1,2,3,4]}로 넣게 되면 화면에는 1234로 마치 배열을 join 해서 나온 결과처럼 보입니다. 여기서 중요한 사실을 배열이 화면에 보이도록 렌더링이 된다는 것입니다.
이와 React Element를 활용해 배열의 요소를 가지고 같은 형태로 중복되는 UI를 만들 수 있습니다.
export default function Test() {
const arr = [{ name: 'nulzi', age: 21 },{ name: 'nulzi2', age: 22 },{ name: 'nulzi3', age: 25 }];
return (
<div>
{
arr.map(({name, age}) => {
return (
<div>
<p>name: {name}</p>
<p>age: {age}</p>
</div>
);
}
}
</div>
);
}
React를 사용할 때 데이터를 객체 배열에 담아서 준다면 쉽게 UI로 구현할 수 있습니다.
Key prop
위 코드와 같이 작성하면 UI는 잘 구현됩니다. 하지만 개발자 모드로 본다면 경고가 나와있는 것을 볼 수 있습니다.
바로 unique한 key prop이 필요하다는 경고가 말입니다.
배열과 map을 이용해 만든 요소들은 key가 있어야 React가 추론하고 각 요소를 구분할 수 있습니다. 그리고 구분할 수 있어야 배열 내의 요소들을 움직이거나 요소를 추가 또는 삭제할 수 있습니다.(실제로 key 없이 해도 경고만 뜨고 문제를 겪어본 적은 없습니다만...)
여기서 Unique한 key란
- 같은 배열로 만들어진 다른 형제 요소들과 같은 key를 가지면 안 됩니다.
- 또한 변하면 안 됩니다. 상수여야 한다는 말입니다.
그렇기에 key는 보통 데이터의 아이디를 사용하거나 데이터를 조합해서 유니크하게 만듭니다.
구분할 수 있는 무언가를 만들기 귀찮다고 배열의 index를 사용하면 안 됩니다!!!
배열의 index를 사용하는 경우는 배열의 요소가 고정되어 있을 때는 사용할 수도 있습니다. 하지만 배열의 index는 언제든 변경될 수 있는 위험이 있기 때문에 사용하지 않는 것을 추천합니다.
Spread object props
props로 객체도 전달할 수 있는데 객체로 전달하는 경우 props.obj로 접근해야 하고, destructuring을 사용해도 두 번의 과정이 필요하기 때문에 코드가 길어질 수 있습니다.
이를 위해 destructuring을 props를 내려주는 부분에서 사용할 수 있습니다.
export default function P() {
const obj = { name: 'nulzi', age: 21};
return (
<div>
<C
{...obj}
obj = {obj}
/>
</div>
);
}
export deafult function C(props) {
console.log(props);
// props { obj: { name: 'nulzi', age: 21}, name: 'nulzi', age: 21 }
return ();
}
위와 같이 속성을 작성하는 부분에서 destructuring을 사용하면 자동으로 객체에 있던 요소가 props로 전달되고 바로 사용할 수 있습니다.
참고
https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key
'개발 > React.js' 카테고리의 다른 글
| [React.js] Form onSubmit vs Button type="submit" (1) | 2025.08.07 |
|---|---|
| [React.js] React state (1) | 2025.08.04 |
| [React.js] static page last (0) | 2025.07.03 |
| [React.js] static page part.2 (0) | 2025.07.02 |
| [React.js] About lecture & static page (0) | 2025.07.01 |