Computer/react

211110 리액트 입문 속성값과 상태값

COCSOS 2021. 11. 10. 01:13

UI 데이터를 속성값이나 상태값으로 관리해야함

#상태값

let color = 'red';

export default function App(){
function change(){
	color = 'blue';
}

return (
<button style={{backgroundColor:color}} onClick={onCLick}>
	좋아
</button>
)
}

// 변경되지 않는다, color가 변경됨을 리액트가 모르기 때문.


따라서 값을 변경을 알게 하기위해선

//0. 
import React, {useState} from 'react';
//1.
const [color, setColor] = useState('red')
/로 초기화
//2. setColor 함수로 변경
function change(){
setCoor('blue');
}




#속성값

export default function title(props){
}

export default function title({title}){
}


=> {title} 이라는 비구조화 문법을 사용하면 props.XX로 접근할 필요가 없어서 편하다


import Title from './Title'
타이틀이라는 컴포넌트를 가져올건데

export default function Count(){
  export [count, setCount] = ~
  function onClick(){
      setCount(count+1);
  }

  return (
    <div>
      <Title title={`현재 카운트:${count}`} />
      <button onClick={onClick}>증가</button>
    </div>
  )
}

...

import Count from './Counter';

export default function App(){
  const [color, setColor] = useState('red');
  function onClick(){
	  setColor('blue');
  }

  return (
    <div>
	    <Counter />
    </div>
  )
}



증가버튼을 누르면 title이 변경됨
부모컴포넌트가 렌더링될 때마다  자식도 렌더링됨.
이때 자식 속성값이 변하지 않았으면 굳이 새로 변경시킬 필요가없다

ex) 다음과같은 경우

export defulat function Count(){
  export [count, setCount] = ~
  export [count2, setCount2] = ~
  function onClick(){
 	 setCount(count+1);
  }
  function onClick2(){
 	 setCount2(count2+1);
  }
  return (
    <div>
      <Title title={`현재 카운트:${count}`} />
      <Title title={`현재 카운트2:${count2}`} />
      <button onClick={onClick}>증가</button>
      <button onClick={onClick2}>2증가</button>
    </div>
  )
}




위와 같은 상황에서 button2를 클릭할때 부모 컨테이너도 새로 렌더링되고 있다.

이를 방지하기 위해서는 React.memo를 사용할 수 있다.

function Title({title}){
	return (<p> {title}</p>)
}
export default React.memo(title);


-> title 속성값이 변경될때만 새로 그리게 된다.


# 같은 컴포넌트를 여러번 사용할수도 있는데, 각 컴포넌트는 각각 자신만의 상태값을 가진다.

<Count />
<Count />

#속성 값은 불변변수지만 상태값은 불변변수는 아니다.
다만, 상태값도 불변변수로 관리하는 것이 좋다.


#속성값은 왜 불변인가?
 자식comp에 전달되는 속성은 상위component에서 관리하기 때문이다.

XXXX
function Title(props){
props.title = "변경불가"
}
XXXX



#변경을 위해선 상위컴포넌트에서 변경시켜야한다!

만약 이러면 어떨까

export default functio n Counter(){
  count [count, setCount] = useState({value:0});
  function onClick(){
      count.value += 1; //값을 직접 수정
      setCount(count);
  }

  return (<div><<button onClick={oClick}>{`카운트:${count.vluae}`}</button></div>)
}



=> count를 변경해도 리액트가 변경여부를 알지 못한다.
count는 객체인데, 객체의 참조값은 변하지 않고 속성값만 변경하면
동일 참조 객체이기때문에 변경되지않았다고 보는것.

# 그러면 어떻게 해야댐!? 불변변수로 관리하면 되고, 전개연산자를 사용하면 된다!

function onClick(){
	setCount( {...count, value: count.value +1 });
}