props와 폴더구조

degull·2023년 5월 26일

Container / presenter

Container : 자바스크립트(기능)
Presentational : JSX(UI)
한개의 파일에 정렬했던 코드를 2개의 파일로 나눠 폴더를 정렬한다.

파일을 2개로 나눠도 실행시에는 pages에서 하나로 합쳐져서 실행되어야 하기 때문에 부모 컴포넌트(presenter)에서 자식 컴포넌트(container)를 불러와야한다.

_app.js

import '../styles/globals.css';
import { ApolloClient, ApolloProvider, InMemoryCache } from '@apollo/client';

function MyApp({ Component, pageProps }) {
  const client = new ApolloClient({
    uri: 'http://practice.codebootcamp.co.kr/graphql',
    cache: new InMemoryCache(),
  });

  return (
    <ApolloProvider client={client}>
      <Component {...pageProps} />
    </ApolloProvider>
  );
}

export default MyApp;

🔥🔥🔥 실행은 항상 _app.js에서 실행된다..



graphql-mutation-input

import BoardWrite from "@/src/components/units/board/write/BoardWrite.container";

export default function GraphqlMutationPage(){

   return (
      <BoardWrite />
   );


};

BoardWrite.presenter

import React from 'react';

export default function BoardWriteUI(props){

   //javascript 영역


// HTML 영역
   return (
      <>
         작성자 : <input type='text' onChange={props.bbb}></input>
         제목 : <input type='text' onChange={props.ccc}></input>
         내용 : <input type='text' onChange={props.ddd}></input>
         <button onClick={props.aaa}>GRAPHQL-API(동기)요청하기</button> 
      </>
   );
};


BoardWrite.container

import React from 'react';

import { useState } from 'react';
import {gql, useMutation} from '@apollo/client'

import BoardWriteUI from './BoardWrite.presenter';

const CREATE_BOARD = gql`
  mutation createBoard($writer: String, $title: String, $contents:String ){   #변수의 타입 적는 곳
   createBoard(writer:$writer, title:$title, contents :$contents){            # 실제 우리가 전달할 변수 적는 곳
      _id
      number
      message
   }
  } 
`
export default function BoardWrite(){


   const [writer, setWriter] = useState("")
   const [title, setTitle] = useState("")
   const [contents, setContents] = useState("")

   const [나의함수] = useMutation(CREATE_BOARD)

   const onClickSubmit = async () =>{
      const result = await 나의함수({
         variables:{ //variables : 이게 $역할
            writer: writer,
            title: title,
            contents : contents
         }
      })
      console.log(result)
      alert(result.data.createBoard.message)
   }

   const onChangeWriter = (event) =>{
      setWriter( event.target.value )
   }

   const onChangeTitle = (event) =>{
      setTitle( event.target.value )
   }

   const onChangeContents = (event) =>{
      setContents( event.target.value )
   }
}

   return (
      <BoardWriteUI
         aaa={onClickSubmit}
         bbb={onChangeWriter}
         ccc={onChangeTitle}
         ddd={onChangeContents} 
      />
   );

props

부모 컴포넌트가 자식 컴포넌트에게 물려주는 변수/함수
props를 물려줄때는 객체로 묶어서 넘긴다.

💡💡 리액트의 데이터 흐름은 단방향 구조이다.
즉, props는 부모가 자식에게만 넘겨줄 수 있으며, 자식이 부모에게 넘겨주는 부분은 허용되지 않는다.


props 내려주기(부모)

props를 객체형태로 넘긴다.

props 받아오기(자식)


파라미터 부분에 props를 적지 않으면 받아 올 수 없다!!

또한 객체로 넘어오기 때문에 받아온 props를 사용하려면 객체의 속성을 꺼내오는 것 처럼 사용해야하며 props.___ 형태로 사용해야 한다.

profile
그래도 해야지

0개의 댓글