state가 object일 때를 살펴보자
import React from "react"
export default function App() {
const [contact, setContact] = React.useState({
firstName: "John",
lastName: "Doe",
phone: "+1 (719) 555-1212",
email: "itsmyrealname@example.com",
isFavorite: true
})
let starIcon = contact.isFavorite ? "star-filled.png" : "star-empty.png"
function toggleFavorite() {
console.log("Toggle Favorite")
}
return (
<main>
<article className="card">
<img src="./images/user.png" className="card--image" />
<div className="card--info">
<img
src={`../images/${starIcon}`}
className="card--favorite"
onClick={toggleFavorite}
/>
<h2 className="card--name">
{contact.firstName} {contact.lastName}
</h2>
<p className="card--contact">{contact.phone}</p>
<p className="card--contact">{contact.email}</p>
</div>
</article>
</main>
)
}
object이니까 이 부분에 이렇게 contact.firstName 등등을 넣는건
금방 혼자 했었는데
<h2 className="card--name">
{contact.firstName} {contact.lastName}
</h2>
<p className="card--contact">{contact.phone}</p>
<p className="card--contact">{contact.email}</p>
여기 이 부분을 contact.isFavorite해야하는데
그냥 isFavorite으로 했더니 계속 오류났었다 ㅋㅋ
let starIcon = contact.isFavorite ? "star-filled.png" : "star-empty.png"
그리고 이부분도 ${} 여기에 넣어야 하는데 그냥 {}따로 넣어서
했더니 오류나고 안되었음.
src={`../images/${starIcon}`}
여기서 object state 업데이트 해주는방법은 아래와 같음
import React from "react"
export default function App() {
const [contact, setContact] = React.useState({
firstName: "John",
lastName: "Doe",
phone: "+1 (719) 555-1212",
email: "itsmyrealname@example.com",
isFavorite: false
})
let starIcon = contact.isFavorite ? "star-filled.png" : "star-empty.png"
function toggleFavorite() {
setContact(prevContact => {
return {
...prevContact,
isFavorite: !prevContact.isFavorite
}
})
}
return (
<main>
<article className="card">
<img src="./images/user.png" className="card--image" />
<div className="card--info">
<img
src={`../images/${starIcon}`}
className="card--favorite"
onClick={toggleFavorite}
/>
<h2 className="card--name">
{contact.firstName} {contact.lastName}
</h2>
<p className="card--contact">{contact.phone}</p>
<p className="card--contact">{contact.email}</p>
</div>
</article>
</main>
)
}
근데 여기서 유의 깊게 봐야할게
그냥 바꿔줄 is fav만 쓰면 안되고
function toggleFavorite() {
setContact(prevContact => {
return {
...prevContact,
isFavorite: !prevContact.isFavorite
}
})
}
이런식으로 spread operator써서 모든 애들을 다 불러와주고
그다음에 바꿔줄 부분만 새로 추가해주면 바꿔짐..