ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • state 개별 숫자 증가, props
    프레임워크/리액트 React 2023. 1. 19. 01:09
    반응형

    1. 과제

    1-1. 반복문 처리 없이, 👍 클릭시 개별적으로 숫자 증가 구현하기

    /*eslint-disable*/ //경고메세지가 뜨는 eslint 기능을 꺼준다.
    import './App.css';
    import {useState} from 'react';
    
    function App() {
      let [글제목, 글제목변경] = useState(['남자코트 추천', '강남 우동맛집', '파이썬독학']);
      let [좋아요, 좋아요변경] = useState([0,0,0]);
      let [modal, setModal] = useState(false);
      
    
      return (
        <div className="App">
          <div className="black-nav"> 
            <h4>ReactBlog</h4>
          </div>
    
          <div className="list">
            <h4>{글제목[0]} <span onClick={
               () => {
                let good = [...좋아요];
                good[0] = good[0] + 1;
                좋아요변경(good)
                } }>👍</span> {좋아요[0]} </h4>
            <p>2월 17일 발행</p>
          </div>
          <div className="list">
            <h4>{글제목[1]}<span onClick={ () => {
              let good2 = [...좋아요];
              good2[1] = good2[1] + 1;
              좋아요변경(good2)} }>👍</span> {좋아요[1]} </h4>
            <p>2월 17일 발행</p>
          </div>
          <div className="list">
            <h4>{글제목[2]}<span onClick={ () => {
              let good3 = [...좋아요];
              good3[2] = good3[2] + 1;
              좋아요변경(good3)} }>👍</span> {좋아요[2]} </h4>
            <p  style={{display:'inline-block', marginRight: '10px'}}>2월 17일 발행</p>
            <button onClick={ ()=> {
            modal == false ? setModal(true) : setModal(false)
            }}>모달버튼</button>
          </div>
    
          {/* {
            글제목.map(function(a,i){
              return (
                <div className="list" key={i}>
                  <h4 onClick = { () => {setModal(!modal)}} > 
                    {글제목[i]}
                      <span onClick={ () => {
                       좋아요변경(좋아요+1);
                      } }>👍</span> 
                   {좋아요}
                  </h4>
                  <p>2월 17일 발행</p>
                </div>
              )
            })
          } */}
    
    
          {
            modal == true ? <Modal/> : null
          }
        </div>
      );
    }
    
    //컴포넌트 
    function Modal() {
      return (
        <div className='modal'>
          <h4>제목</h4>
          <p>날짜</p>
          <p>상세내용</p>
        </div> 
      )
    }
    
    export default App;

     

    1-2. 반복문 처리해서 구현하기

    → 이전 시간에 배웠던, 펼침연산자를 이용한 배열복사로 풀어준다.

    {
            글제목.map(function(a,i){
              return (
                <div className="list" key={i}>
                  <h4 onClick = { () => {setModal(!modal)}} > 
                    {글제목[i]}
                      <span onClick={ () => {
                        let good = [...좋아요];
                        good[i] = good[i] + 1;
                       좋아요변경(good);
                      } }>👍</span> 
                   {좋아요[i]}
                  </h4>
                  <p>2월 17일 발행</p>
                </div>
              )
            })
     }

    🗨️사담)

    맨 처음에 이렇게 했던 것 같은데 그때는 뭐 때문인지 오류가 계속 났다....

    정답 볼까말까 고민하다가 반복문부터 적용해보지 말고, 반복문 없이 적용해보라는 멘트를 보고

    반복문 없이 → 반복문 추가해서 처리하니 더 쉽게 구조가 보였다. 아직은 구조에 익숙하지 않으니,

    이렇게 풀어서 바꾸는 방식으로 연습하는 게 좋을 것 같다.

     

     

    2. Props

    함수 안에 있는 모든 변수는 함수 바깥에서 쓸 수 없다.

    그래서 Modal 함수에서 App 함수 내의 글제목 state를 가져 쓸 수 없다.

    → 이를 해결하기 위한 게 props

     

    2-1. 부모 컴포넌트 → 자식 컴포넌트로 state 전송하기

    props를 이용하면, 부모 컴포넌트에서 자식 컴포넌트로 state를 전송할 수 있다.

    → 부모 컴포넌트의 state를 사용할 수 있게 함

     

    • 부모 컴포넌트 내 자식컴포넌트 사용하는 곳에 서  <자식컴포넌트 작명={state이름} /> 
    • 자식컴포넌트 만드는 function으로 가서 props라는 파라미터 등록 후 props.작명 사용

    * props 작명은 보통 사용하려는 state 이름으로 쓴다. (다른 것도 가능)

    * props는 부모에서 자식 컴포넌트로만 가능하다.

     

    funcion App() {
      let [글제목, 글제목변경] = useState(['남자코트 추천', '강남 우동맛집', '파이썬독학']);
      
      return (
    	<div className="App">
        	<Modal 글제목={글제목}/>  {/* <자식컴포넌트 작명={state이름} /> */}
    	</div>
      )
    }
    
    //자식컴포넌트 - Modal
    function Modal(props) {
      return (
        <div className='modal'>
          <h4>{props.글제목}</h4>
          <p>날짜</p>
          <p>상세내용</p>
        </div> 
      )
    }

     

    * props의 파라미터로 넘길 수 있는 것은 state만 넘길 수 있는 게 아니라 일반 변수, 함수, 문자 전송도 가능

    * 문자 전송시에는 중괄호 없이도 가능하다.

    funcion App() {
      let [글제목, 글제목변경] = useState(['남자코트 추천', '강남 우동맛집', '파이썬독학']);
      
    	<div className="App">
        	<Modal color={"pink"} 글제목={글제목}/> 
            {/* <Modal color="pink" 글제목={글제목}/> */}
    	</div>
    }
    
    //자식컴포넌트 - Modal
    function Modal(props) {
      return (
        <div className='modal' style={{background : props.color}}>
          <h4>{props.글제목}</h4>
          <p>날짜</p>
          <p>상세내용</p>
        </div> 
      )
    }

     

    * 파라미터 문법

    매개변수(parameter) 는 함수에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미

    인수(argument)는 함수가 호출될 때 함수로 값을 전달해주는 값

    function run(매개변수) {
    	실행할 코드;
    }
    
    run(인수);

    자바스크립트에서는 정의된 함수보다 적은 인수가 전달되어도 오류가 발생하지 않는다.

    대신 전달되지 않은 매개변수는 undefined로 값 설정된다.

     

     

     

    2-2. props 과제

    자식 컴포넌트(모달)의 수정버튼을 누르면, 모달 내 제목 변경하기

    funcion App() {
      let [글제목, 글제목변경] = useState(['남자코트 추천', '강남 우동맛집', '파이썬독학']);
      
    	<div className="App">
        	<Modal color={"pink"} 글제목={글제목} 글제목변경={글제목변경}/> 
    	</div>
    }
    
    //자식 컴포넌트 
    function Modal(props) {
      return (
        <div className='modal' style={{background : props.color}}>
          <h4>{props.글제목[0]}</h4>
          <p>날짜</p>
          <p>상세내용</p>
          <button onClick={()=> {
            // 2-1.
            // props.글제목변경(['여자코트 추천', '강남 우동맛집', '파이썬독학'])
            
            // 2-2. 펼침연산자를 통해 복사 후 변경
             let copy = [...props.글제목];
             copy[0] = '여자코트 추천';
             props.글제목변경(copy)
            
            
            //1. 그대로 바꾸면 → 동일한 state로 생각해 안바뀜
            // props.글제목[0] = '여자코트 추천';
            // props.글제목변경(props.글제목)
            // console.log(props.글제목)
            }}>글수정버튼</button>
        </div> 
      )
    }

     

     

    '프레임워크 > 리액트 React' 카테고리의 다른 글

    모듈 호출 방식 (import, require)  (0) 2024.07.09
    ERROR 1045(28000) 비밀번호 오류  (0) 2024.07.09
    map()  (0) 2023.01.17
    컴포넌트 생성, 사용하기  (1) 2023.01.16
    리액트 기본문법 JSX, state  (0) 2023.01.14

    댓글

Designed by Tistory.