반응 후크-useState 및 변수 사용


12

반응 후크는 우리에게 useState 옵션을 제공하며 항상 후크 대 클래스 상태 비교를 봅니다. 그러나 후크와 일부 정규 변수는 어떻습니까?

예를 들어

function Foo() {
    let a = 0;
    a = 1;
    return <div>{a}</div>;
}

나는 Hooks를 사용하지 않았으며 다음과 같은 결과를 얻을 것이다.

function Foo() {
    const [a, setA] = useState(0);
    if (a != 1) setA(1); // to avoid infinite-loop
    return <div>{a}</div>;
}

차이점은 무엇입니까? 이 경우 후크를 훨씬 더 복잡하게 사용하는 이유는 무엇입니까?


그래도 두 가지 다른 것을 비교하고 있습니다. 후크가있는 두 번째 기능에는 데이터를 업데이트하는 기능이 있습니다. 첫 번째는 실제로 아무것도하지 않습니다. 방금 초기화했을 let a = 1; return <div>{a}</div>수 있으며 동일한 결과를 얻을 수 있습니다.
Yathi

답변:


13

이유는 useState뷰 를 다시 렌더링하기 때문입니다 . 변수 자체는 메모리의 비트 만 변경하며 앱 상태는 뷰와 동기화되지 않을 수 있습니다.

이 예제를 비교하십시오 :

function Foo() {
    const [a, setA] = useState(0);
    return <div onClick={() => setA(a + 1)}>{a}</div>;
}

function Foo() {
    let a = 0;
    return <div onClick={() => a + 1}>{a}</div>;
}

두 경우 모두 a클릭시 변경 사항이 있지만 useState보기를 올바르게 사용 하면 a의 현재 값이 올바르게 표시 됩니다.


감사! 따라서 뷰를 렌더링 할 필요가 없다면 데이터 (소품)를 배열로 구성하는 방법 만 'let'을 사용할 수 있습니까? 그것은 나를 위해 작동합니다. 나는 괜찮고 수용 가능한지 알고 싶습니다.
Moshe Nagar

@MosheNagar 소품에서 데이터를 파생하는 경우 구성 요소가 소품 변경에 다시 렌더링되므로 뷰가 데이터와 동기화되므로 데이터를 상태로 유지하는 대신 로컬 변수를 사용하는 것이 좋습니다. 그것들을 상태로두면 불필요한 변경 사항이 발생할 수 있습니다.
marzelin

이 답변을 보는 또 다른 방법은 두 번째 경우에는 변수 a가 실행을 완료 한 후에 가비지 수집 될 것이라고 생각하는 것입니다. 첫 번째 변수 는 useState그 가치를 보존 할 것이기 때문에a
João Marcos Gris

useRef뷰를 다시 렌더링하지 않으려는 경우 에도 여전히 사용할 수 있습니다. 로컬 변수 나 React 참조를 사용해야하는지에 대한 의문이 남아 있습니다. 예를 들어 시간 초과가 있거나 Axios를 사용하여 진행중인 http 요청이있는 경우 시간 초과 또는 Axios 소스를 변수 또는 React 참조에 저장합니까?
Tom

3
@Tom 일반적인 규칙은 파생 상태에 로컬 변수를 사용하는 것입니다. 다른 용도로는 useRef(렌더링을 원하지 않는 useState경우 ) 또는 (렌더링을 원하는 경우)를 사용하십시오. 타이머의 경우 부작용이므로 useEffect후크 로 시작해야합니다 . timerId정리 목적으로 만 사용 하려는 경우 처리기 의 로컬 변수 에 보관할 수 있습니다 . 구성 요소의 다른 곳에서 타이머를 지우려면을 사용해야합니다 useRef. 저장 timerIdA의 성분은 지방 바르 각 렌더링의 "재설정"때문에의 지역 변수는 실수가 될 것입니다.
marzelin

1

상태를 업데이트하면 구성 요소가 다시 렌더링 될 수 있지만 로컬 값은 그렇지 않습니다.

귀하의 경우 구성 요소에서 해당 값을 렌더링했습니다. 즉, 값이 변경되면 업데이트 된 값을 표시하기 위해 구성 요소를 다시 렌더링해야합니다.

따라서 useState일반적인 지역 값보다 사용하는 것이 좋습니다 .

function Foo() {
    let a = 0;
    a = 1; // there will be no re-render.
    return <div>{a}</div>;
}

function Foo() {
    const [a, setA] = useState(0);
    if (a != 1) setA(1); // re-render required
    return <div>{a}</div>;
}

0

첫 번째 예제는 데이터가 본질적으로 절대 변경되지 않기 때문에 작동합니다. 사용의 시작점은 setState상태가 정지 될 때 전체 구성 요소를 다시 렌더링하는 것입니다. 따라서 예제에 일종의 상태 변경 또는 관리가 필요한 경우 변경 값이 필요하다는 것을 빨리 인식하고 변수 값으로 뷰를 업데이트하려면 상태 및 다시 렌더링이 필요합니다.


0
function Foo() {
    const [a, setA] = useState(0);
    if (a != 1) setA(1); // to avoid infinite-loop
    return <div>{a}</div>;
}

에 해당

class Foo extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            a: 0
        };
    }
    // ...
}

어떤 useState두 가지 반환 있습니다 :

  1. 새로운 상태 변수
  2. 해당 변수의 세터

당신이 전화 setA(1)하면 당신은 전화 this.setState({ a: 1 })를 다시 렌더링을 트리거합니다.


0

로컬 변수는 돌연변이에 따라 렌더링 될 때마다 재설정되지만 상태는 업데이트됩니다.

function App() {
  let a = 0; // reset to 0 on render/re-render
  const [b, setB] = useState(0);

  return (
    <div className="App">
      <div>
        {a}
        <button onClick={() => a++}>local variable a++</button>
      </div>
      <div>
        {b}
        <button onClick={() => setB(prevB => prevB + 1)}>
          state variable b++
        </button>
      </div>
    </div>
  );
}

serene-galileo-ml3f0 편집

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.