본문 바로가기

개발일지/React & C++

[React : 04] 이벤트 리스너 ( 좋아요 버튼 )

https://youtu.be/Br9fKSIeAok

 


[ 저번 시간 답안 ]

 

import React, { useState } from 'react';
import './App.css';
import logo from './logo.svg';

function App() {

  let [글제목, 글제목변경] = useState(['남자 코트 추천', '강남 우동 맛집', '응암 고기 맛집']);

  let ftStyle = { color : 'wheat', fontSize : '30px'}

  return (
    <div className="App">
      <div className='black-nav'>
        <div style={ ftStyle }>개발 Blog</div>
      </div>
      <div className='list'>
        <h3> { 글제목[0] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[1] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[2] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
    </div>
  );
}

export default App;

 

이렇게 했을 때 터미널에 

 Compiled with warnings.  이라고 뜸

-eslint (린트) 잘못된 코딩 관습을 잡아 주는 라이브러리이다.

 

이런 warnings을 잡고 싶으면 import 위 최상단에 아래 처럼 쓰면된다. 

/* eslint-disable */

오늘은

첫번째 제목 옆에 좋아요 버튼 만들기!

두 번째, 세 번째는 나중에 반복문을 배우고 나서 배울 예정

 

크롬창에서 win + 마침표(.) 누르면

이모티콘을 사용할 수 있는데

그걸 제목 옆에 좋아요 버튼에 넣고,

그 옆에는 숫자 0을 쓴다.

<h3> { 글제목[0] } <span>👍</span> 0 </h3>

 

span태크 따봉을 누르면 숫자 증가하려면?

<h3> { 글제목[0] } <span onClick={1 + 1}>👍</span> 0 </h3>

이런식으로 직접적으로 적는 건 안 되니까 함수()를 만들어 넣거나 { ()=>{} } 콜백 함수를 넣는다. 

 

{ 클릭 될 때 실행할 함수 }

{ ()=>{ 실행할 내용 } }

 

- function 대신에 ()=>{} 이렇게 넣어도 됨

 


 

< 클릭 시 콘솔에 1띄우기 >

<h3> { 글제목[0] } <span onClick={ ()=>{ console.log(1) } }>👍</span> 0 </h3>

이런 걸 이벤트 리스너, 이벤트 핸들러 라고 한다. 

html과 JavaScript 문법과 별반 다르지 않다.

React의 큰 차이점은 저 안에 함수가 들어가야 한다는 점!

 

 

 


진짜로 따봉 누를 때마다 따봉 옆 숫자가 1씩 증가 하려면?

- 항상 바뀌는 숫자이기 때문에 state로 변수를 만들고 데이터 바인딩을 한다.

 

let [따봉, 따봉변경] = useState(0);

<h3> { 글제목[0] } <span onClick={ ()=>{ 따봉 + 1 } }>👍</span> { 따봉 } </h3>

위에서 state 변수를 만들고, 아래에 이런식으로 적어주면? 작동이 안 된다. 

state 변수는 그냥 변경을 하면 안 되고, 변경하는 방법이 따로 있다!

바로, 따봉이랑 함께 만들었던 따봉변경 변수를 사용한다.

이것은 따봉변경() 함수인 것이다. 

 

- 따봉변경(대체할 데이터)

<h3> { 글제목[0] } <span onClick={ ()=>{ 따봉변경(따봉 + 1) } }>👍</span> { 따봉 } </h3>

[state, state변경함수]

그래서 state 변수를 만들 때 함께 만든 함수를 이용해 주어야 유일하게 state를 변경할 수 있다. 이런식으로 변경을 해야 재 렌더링이 일어난다. 

 

/* eslint-disable */

import React, { useState } from 'react';
import './App.css';
import logo from './logo.svg';

function App() {

  let [글제목, 글제목변경] = useState(['남자 코트 추천', '강남 우동 맛집', '응암 고기 맛집']);
  let [따봉, 따봉변경] = useState(0);
  let ftStyle = { color : 'wheat', fontSize : '30px'}

  return (
    <div className="App">
      <div className='black-nav'>
        <div style={ ftStyle }>개발 Blog</div>
      </div>
      <div className='list'>
        <h3> { 글제목[0] } <span onClick={ ()=>{ 따봉변경(따봉 + 1) } }>👍</span> { 따봉 } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[1] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[2] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
    </div>
  );
}

export default App;

 

[ 숙제 ]

홈페이지에 버튼을 만들고, 버튼을 누르면 남자 코트 추천 제목이 여자코트 추천으로 바뀌어야 한다. 

 

- 전혀 못 풀겠어서 다음 영상까지 봐버림... ㄱ-

< 하드코딩 버전 >

/* eslint-disable */

import React, { useState } from 'react';
import './App.css';
import logo from './logo.svg';

function App() {

  let [글제목, 글제목변경] = useState(['남자 코트 추천', '강남 우동 맛집', '응암 고기 맛집']);
  let [따봉, 따봉변경] = useState(0);
  let ftStyle = { color : 'wheat', fontSize : '30px'}

  function 제목바꾸기() {
    글제목변경( ['여자 코트 추천', '강남 우동 맛집', '응암 고기 맛집'] );
  }

  return (
    <div className="App">
      <div className='black-nav'>
        <div style={ ftStyle }>개발 Blog</div>
      </div>
      <button onClick={ 제목바꾸기 }>button</button>
      <div className='list'>
        <h3> { 글제목[0] } <span onClick={ ()=>{ 따봉변경(따봉 + 1) } }>👍</span> { 따봉 } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[1] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
      <div className='list'>
        <h3> { 글제목[2] } </h3>
        <p>2월 17일 발행</p>
        <hr />
      </div>
    </div>
  );
}

export default App;

 


- 이렇게 바꾼다면? 안 됨

  function 제목바꾸기() {
    var newArray = 글제목; //복사본 생성
    newArray[0] = '여자코트 추천'; //복사한 데이터의 0번째를 바꿈
    글제목변경( newArray ); //그걸 글제목변경 함수에 넣음
  }

해당 데이터를 수정하고 싶으면 복사본을 만들어서 수정하는 것은 좋은 방법이나, 복사를 잘 못 했다.

 

var newArray = 글제목;

이런 방법은 값 복사가 아니라 값 공유이다.

( reference data type의 특징 )

 

 

< deep copy >

  function 제목바꾸기() {
    var newArray = [...글제목]; 
    newArray[0] = '여자 코트 추천'; 
    글제목변경( newArray ); 
  }

- deep copy는 값 공유를 하지 않는다.

- 서로 독립적인 값을 가지는 복사이다.

- '...' spread operator는 ES6의 신 문법

- '...'는 중괄호 대괄호 다 제거해 달라는 문법으로 글제목이라는 Array의 대괄호가 제거되고, 다시 대괄호에 담는다. 그러면 별개의 Array가 된다. 

- 이런 걸 하는 이유? 리액트 대 원칙(immutable data) 직접 수정이 되면 안 된다. 라고 권장을 하고 있기 때문에 이런 뜻을 따라야한다. 

 

- 따라서 Object state 데이터를 수정할 때는 변경함수를 사용하고, state는 직접적으로 건들면 안 되고 deep copy해서 써야한다. 

'개발일지 > React & C++' 카테고리의 다른 글

[C++] 포인터  (0) 2023.09.17
[React : 05] Component  (1) 2022.03.20
[React : 03] state를 이용해 글 목록 만들기  (0) 2022.03.15
[React : 02] JSX  (0) 2022.03.14
[React : 01] 세팅  (0) 2022.03.14