react+vue

[react] props (2)

h-yujin 2022. 9. 24. 20:40

데이터 여러개 전달하기

import { useEffect, useState } from "react";
import Footer from "../components/footer";
import Header from "../components/header";
import Home from "../components/home";

function HomePage() { 

    const [boards, setBoards] = useState([]);
    useEffect(() => {
        //board다운로드
        let datas = [
            { id: 1, name: "길동", content: "가나다" },
            { id: 2, name: "꺽정", content: "마바사" }
        ];
        setBoards([...boards,...datas]);
     },[]);
    return (
        <div>
            <Header />
            <Home boards={boards} id={ 1} />
            <Footer/>
        </div>
    );
};

export default HomePage;
  • boards와 id 데이터를 전달하였다. 이런 방식으로 여러개의 데이터를 전달할 수 있다.

 

 

구조분할 할당

import styled from "styled-components";

const HomeStyle = styled.div`
    background-color: pink;
    margin: 0 auto;
    text-align: center;
    font-size: 5rem;
`;
function Home(props) {
    const { boards } = props;
    console.log(boards);
    return <HomeStyle>ddd{ }</HomeStyle>;
};
export default Home;

  • id도 마찬가지로 const {id }= props;로 받아올 수 있다.
  • boards와 id 동시에 받기
import styled from "styled-components";

const HomeStyle = styled.div`
    background-color: pink;
    margin: 0 auto;
    text-align: center;
    font-size: 5rem;
`;
function Home(props) {
    const { boards,id } = props;
    console.log(boards,id);
    return <HomeStyle>ddd{ }</HomeStyle>;
};
export default Home;

id는 undefined로 출력되었다. 아마 배열이 아니라서 그런 것 같다.

 

 

props 출력하기

import styled from "styled-components";

const HomeStyle = styled.div`
    background-color: pink;
    margin: 0 auto;
    text-align: center;
    font-size: 5rem;
`;
function Home(props) {
    const { boards,id } = props;
    console.log(boards,id);
    return( 
        <HomeStyle>
            홈 내부
            {boards.map((board) => <h3>내용:{ board.content}</h3>)}
        </HomeStyle>);
};
export default Home;

 

 

props passing

props passing을 해봤다.

데이터를 다른 컴포넌트로 넘기는 기법을 props passing이라고 하며, 컴포넌트는 해당 데이터를 인자 props로 받아 가공하여 화면에 표현할 수 있다.

 

 

삭제 버튼 만들기

  • deleteBoards 만들기
function Home(props) {
    const { boards,id } = props;
    
    const deleteBoards = () => { 
        boards = [];
    };
    return( 
        <HomeStyle>
            홈 내부
            <button onClick={ deleteBoards}>전체 삭제</button>
            {boards.map((board) => <h3>내용:{ board.content}</h3>)}
        </HomeStyle>);
};
export default Home;

작동하지 않는다. boards는 상태변수로 정의 되어 props로 넘겨받았다. 수정하기 위해서는 setBoards가 필요한 상황이다.

props로 함수도 넘겨줄 수 있으므로 setBoards로 넘겨준다.

  • homPage.js
import { useEffect, useState } from "react";
import Footer from "../components/footer";
import Header from "../components/header";
import Home from "../components/home";

function HomePage() { 

    const [boards, setBoards] = useState([]);
    useEffect(() => {
        //board다운로드
        let datas = [
            { id: 1, name: "길동", content: "가나다" },
            { id: 2, name: "꺽정", content: "마바사" }
        ];
        setBoards([...boards,...datas]);
     },[]);
    return (
        <div>
            <Header />
            <Home boards={boards} setBoards={ setBoards} />
            <Footer/>
        </div>
    );
};

export default HomePage;
  • home.js
import styled from "styled-components";

const HomeStyle = styled.div`
    background-color: pink;
    margin: 0 auto;
    text-align: center;
    font-size: 5rem;
`;
function Home(props) {
    const { boards,setBoards } = props;
    
    
    return( 
        <HomeStyle>
            홈 내부
            <button onClick={ ()=>setBoards([])}>전체 삭제</button>
            {boards.map((board) => <h3>내용:{ board.content}</h3>)}
        </HomeStyle>);
};
export default Home;

구조분할 할당으로 setBoards로 받아준다. onClick 에 setBoards를 실행하는 함수를 넣어주면 실행된다.

 

 

데이터 흐름

  • homPage는 home의 부모 컴포넌트다.
  • 그래서 home으로 데이터를 전달할 수 있다.
  • homPage의 코드가 읽혀지면서 home으로 데이터를 전달하는 코드가 읽히기 때문이다.
  • 하지만 home에서 hompage로 데이터를 전달하는 것은 불가능하다.
  • 자식에서 부모로는 데이터 전달이 불가능하다.
  • home 내부의 코드가 읽힐 때는 homePage의 코드가 다 읽힌 후이기 때문이다.