구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식입니다.
-mdn-
const a = [1,2,3,4,5]
const [b,c] = a
console.log(b)
//1
console.log(c)
//2
const {name, age} = {name: "Joah", age: 10}
console.log(name)
//Joah
console.log(age)
//10
📌
부모 컴포넌트 코드
//Monsters.js
function Monsters() {
const [monsters, setMonsters] = useState([]);
const [userInput, setUserInput] = useState("");
// 데이터 로딩
useEffect(() => {
fetch('서버주소')
.then((res) => res.json())
.then((data) => setMonsters(data));
}, []);
return (
<div className="monsters">
<h1>컴포넌트 재사용 연습!</h1>
<SearchBox handleChange={inputValue} />
<CardList monsters={monsters} />
</div>
);
}
export default Monsters;
자식 컴포넌트 코드
function CardList({ monsters }) {
return (
<div className="cardList">
{monsters.map((monster) => (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
))}
</div>
);
}
export default CardList;
구조분해할당을 하지 않고
props
를 작성했을 떄!
부모 컴포넌트인 Monsters.js 에서 자식 컴포넌트인 CardList에 monsters
라는 데이터를 전달한다.
Monsters.js return
문 안에 <CardList/>
안에 데이터를 작성하므로 해당 컴포넌트에 데이터를 넘겨준다.
function CardList(props) {
return (
<div className="cardList">
{props.monsters.map((monster) => (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
))}
</div>
);}
props
를 구조분해할당하지 않았을 때는 props를 그대로 넘겨주었다.
그리고 props.monsters.map()
을 실행한다.
props
라는 객체 안에는 monsters
라는 key
가 담겨져있다.
props
값을 콘솔에 출력하면
console.log(props)
//{monsters: Array(10)}
즉, props
안에는 monsters
라는 Key
에 10개의 배열 데이터가 value
로 담겨있다는 뜻이다.
구조분해할당을 했을 때
💥하지만 아래의 구조분해할당은 데이터를 받아오는 시점부터 props
를 분해한다.
function CardList({monsters}) {}
props
안에 있는 key
인 monsters
를 { }
중괄호 안에 담아 monsters
객체를 가져온다.
function CardList({ monsters }) {
return (
<div className="cardList">
{monsters.map((monster) => (
<Card
key={monster.id}
id={monster.id}
name={monster.name}
email={monster.email}
/>
))}
</div>
);
}
export default CardList;
따라서 props.monsters
가 아니라 부모로부터 바로 monsters
를 받아와 자체를 map()
함수로 돌릴 수 있다.
나의 생각
props는 부모에서 넘어오는 모든 데이터를 포함하는데 이를 매번 작성하면서 여기에는 이 데이터 저기에는 다른 데이터 표시하다가 나 스스로 혼란스러워 계속 부모 컴포넌트를 확인할 것 같다. 하지만 이렇게 객체 이름으로 구조분해할당을 하여 애초에 받아오면 경험상 가독성과 유지보수에 용이하다.
지금 작성한 코드는 props
에 담긴 데이터가 몇 없어서 간단해 보일지 몰라도 props
안에 담긴 객체 안에 또 객체 그 안에 객체가 있다면 props
를 사용할 때마다 길고 긴 코드가 작성될 것이다. 추후 이를 방지하기 위해 구조분해할당을 사용하면 유용할 것 같다