complex state: object, updating object

Juyeon Lee·2022년 5월 3일
0

REACT 리액트

목록 보기
23/65

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써서 모든 애들을 다 불러와주고
그다음에 바꿔줄 부분만 새로 추가해주면 바꿔짐..

0개의 댓글