[React] State / Props

Seungmin Lee·2022년 8월 5일
0

React

목록 보기
3/9
post-thumbnail

둘 다 다시 리턴을 해서 UI를 바꿈

Props

리액트에서 props는 속성(property)를 의미한다.
변하지 않는 값에 사용하고 그렇기 때문에 변경할 수 없으므로읽기 전용 객체이다.
콘솔에 props를 찍어보면 정의한 속성을 키와값으로 갖는 객체가 출력된다.
클래스 컴포넌트, 함수형 컴포넌트에서 사용
자식에게 전달해줄 속성을 정의한 뒤 부모에 자식을 불러온다
자식은 매개변수로 props를 가진다. 매개변수의 이름은 상관없으나 일반적으로 props로 쓴다.
prop는 객체이기 때문에 dot-notation을 이용해 {props.속성명} 형태로 사용

function Header(props){ // 매개변수로 props를 준다.
  return (
    <header>
      <h1>{props.title}</h1> // props객체의 키가 title인 요소의 값을 넣음
    </header>
  )
}

function App() {
  return (
  	<div>
    	<Header title='Hello' /> // Header에 전달해줄 속성을 정의
    </div>
  )
}

State

state를 이용해 값을 변경하면 새로고침 없이 재렌더링되기 때문에 컴포넌트 내에서 자주 변경되는 값에 주로 사용한다. on/off 기능이나 카운터, 정렬 기능 등에 적용할 수 있다.

useState()

  • useState()첫번째 요소로 state값 , 두번째 요소로 state 변경 함수(f)를 갖는 배열을 리턴한다. 초기값을 설정하지 않을 경우, state의 초기값은 undefined가 된다.
import React, { useState } from 'react';

function App(){
  // 초기값X
  console.log(useState()) // [undefined, f]
  
  // 초기값O
  console.log(useState('hello')) // ['hello', f]
}
  • useState()가 리턴한 배열의 요소들은 구조 분해 할당을 활용해 변수에 할당될 수 있다.
function App(){
  //구조 분해 할당
  const [ isState, isStateSet ] = useState('hello')
  // 아래와 같다고 볼 수 있다.
  // const isState = 'hello'
  // const isStateSet = 스테이트 변경 함수(f)
}
  • state직접 변경할 수 없기 때문에 state 변경 함수를 써서 변경해야 한다.
function App(){
  
  const [ isState, isStateSet ] = useState('hello')
  
  return (
    // case1) state 직접 변경 // h1을 클릭해도 hello가 world로 바뀌지 않음 
    <h1 onClick={() => isState='world'}>{isState}</h1>
    
    // case2) state	변경 함수로 변경 // h1을 클릭하면 hello가 world로 바뀜
    <h1 onClick={() => isStateSet('world')}>{isState}</h1>
  )
  
}
  • state배열이나 객체일 경우 원본 state가 바뀔 수 있기 때문에 값을 변경하기 전 깊은 복사가 필요하다. 배열의 경우 slice() 메서드나 1차원 객체의 경우 spread syntax 등을 이용하여 깊은 복사를 할 수 있다.
function App(){
  
  const [isArr, isArrSet] = useState(['hello', 'world']);
  const copy = [...isArr];
  copy[0] = 'hi';
  console.log(copy) // ['hi', world']
  
  return (
    // h1을 클릭하면 'helloworld'가 'hiworld'로 바뀜
    <h1 onClick={() => isArrSet(copy)}>{isArr}</h1>
  )

}
profile
<Profile name="seungmin" role="frontendDeveloper" />

0개의 댓글