React.useState는 props에서 상태를 다시로드하지 않습니다.


109

props 변경시 상태가 다시로드 될 것으로 예상하지만 이것이 작동하지 않고 user다음 useState호출에서 변수가 업데이트되지 않습니다 . 무엇이 잘못 되었습니까?

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});
  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

코드 펜

답변:


246

useState에 전달 된 인수는 클래스 구성 요소의 생성자에서 상태를 설정하는 것과 매우 유사한 초기 상태이며 다시 렌더링 할 때 상태를 업데이트하는 데 사용되지 않습니다.

소품 변경시 상태를 업데이트하려면 useEffect후크를 사용하십시오.

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});

  React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

작업 데모


21
생성자에서 초기 상태를 설정할 때 생성자가 클래스 인스턴스 생성시 한 번 호출된다는 것을 이해하는 것이 분명합니다. 후크를 사용하면 함수 호출 시마다 호출되고 상태를 초기화해야 할 때마다 useState가 호출되는 것처럼 보이지만 설명 할 수없는 "마법"이 발생합니다.
vitalyster


1
이 상태로 병합 소품에 필요한 경우 사용하는 경우, 당신은 무한 루프에 박히 만들-반응 - 응용 프로그램 종속성 배열로 상태를 필요로
user210757

2
이것은 꽤 성가신 초기 상태를 두 번 설정하는 것으로 끝납니다. 초기 상태를 null React.useEffect로 설정하고 매번 초기 상태를 설정하는 데 사용할 수 있는지 궁금합니다 .
CMCDragonkai

3
상태가 렌더링도 제어하는 ​​경우에는 작동하지 않습니다. 소품을 기반으로 렌더링하고 상태를 기반으로 렌더링하는 기능 구성 요소가 있습니다. 상태가 변경 되었기 때문에 렌더링하도록 구성 요소에 지시하면 useEffect가 실행되고 상태를 다시 기본값으로 설정합니다. 이것은 그들의 부분에서 정말 나쁜 디자인입니다.
Greg Veres

2

useState변수에 초기 값을 설정 하는 데 사용 하는 기능적 구성 요소는 초기 값을 props를 통해 전달하면 useEffect후크를 사용하지 않을 때까지 항상 동일한 초기 값을 설정합니다 .

예를 들어 당신의 경우 이것은 당신의 일을 할 것입니다

 React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

useEffect에 전달 된 함수는 렌더링이 화면에 커밋 된 후에 실행됩니다.

기본적으로 효과는 완료된 모든 렌더링 후에 실행되지만 특정 값이 변경된 경우에만 실행하도록 선택할 수 있습니다.

React.useEffect(FunctionYouWantToRunAfterEveryRender)

useEffect에 하나의 인수 만 전달하면 렌더링 할 때마다이 메서드가 실행 FunctionYouWantToRunAfterEveryRender됩니다. useEffect에 두 번째 인수를 전달 하여이 메서드를 실행할시기를 결정할 수 있습니다.

React.useEffect(FunctionYouWantToRunAfterEveryRender, [props.user])

당신은 지금 [props.user]을 통과하고 통지으로 useEffect만이 실행됩니다 FunctionYouWantToRunAfterEveryRender기능을 할 때 props.user변경

이해에 도움이 되었기를 바랍니다. 개선이 필요한 경우 알려주세요.


1

전달 된 매개 변수는 React.useState()해당 상태의 초기 값일뿐입니다. React는 상태 를 변경 하는 것으로 인식하지 않고 기본값 만 설정합니다. 처음에는 기본 상태를 설정 한 다음 조건부로을 호출 setUser(newValue)하여 새 상태로 인식하고 구성 요소를 다시 렌더링 할 수 있습니다.

지속적으로 업데이트되는 것을 막기 위해 어떤 조건없이 상태를 업데이트하는 것이 좋습니다. 따라서 props를받을 때마다 다시 렌더링하는 것이 좋습니다. 상태 기능을 부모 구성 요소에 게양하고 부모의 상태를이 아바타에 소품으로 전달하는 것을 고려할 수 있습니다.


-2

Hooks에 대한 ReactJS 문서에 따르면 :

그러나 구성 요소가 화면에있는 동안 친구 소품이 변경되면 어떻게됩니까? 우리 구성 요소는 다른 친구의 온라인 상태를 계속 표시합니다. 이것은 버그입니다. 또한 unsubscribe 호출이 잘못된 친구 ID를 사용하므로 마운트 해제시 메모리 누수 또는 충돌이 발생합니다.

여기서 유일한 상호 작용은 작동하지 않는 것으로 보이는 소품 변경에서 발생해야합니다. (여전히 문서에 따르면) componentDidUpdate (prevProps)를 사용하여 props에 대한 업데이트를 사전에 포착 할 수 있습니다.

추신 : 판단 할 코드가 충분하지 않지만 Avatar (props) 함수 내에서 적극적으로 setUser ()를 설정할 수 없습니까?


-12

반응 세계에서 이러한 경우 componentWillRecieveProps (nextProps) 함수에서 상태를 업데이트해야합니다.


4
어떤의 최신 버전에 대한 더 이상 사실입니다 반응
하기 Shubham 카트리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.