반응 + useState () + previousState

Sep 11 2020

나는 반응이 아주 새롭고 useState Hook을 이해하는 데 문제가 있거나 더 구체적으로 previousState 의 측면을 이해하는 데 문제가 있습니다 .

일반적인 useState Hook 및 아마도 가장 일반적인 예는 다음과 같습니다.

import React, { useState} from 'react';

export default function CounterHooks({ initialCount }){
  const [count, setCount] = useState(initialCount);

  return (
    <div>
      <button onClick={() => setCount(count -1)}>-</button>
      <span>{count}</span>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  )
}

지금까지 내가 이해하고있는 것은 다음과 같습니다.

  • useState () 함수 / 후크를 호출합니까? 초기 상태 (initialCount)의 인수를 전달합니다.
  • 나는 즉시 변수 count 및 setCount (함수)로 파괴하는 배열을 얻습니다.
  • setCount ()를 사용하면 상태를 업데이트 할 수 있으므로 count 변수

지금까지 좋은 것 같아요 ...;)

때때로 나는 이해하지 못하는 prevState (prevCount)와 동일한 카운터 예제를 봅니다.

<button onClick={() => setCount(prevCount => prevCount -1)}>-</button>

여기서 무슨 일이 일어나나요? 이 부분은 이해가 안 돼요. 지금까지 내 생각 :

  • 이 경우 어떻게 든 이전 카운트 값에 액세스합니다.
  • setCount는 이제 함수를 예상합니다.
  • setCount는 이제 비동기로 실행됩니다.
  • 이 함수의 출처는 어디입니까?
  • prevCount의 출처는 어디입니까?
  • 이것을 실행하면 prevCount에 무엇이 들어 갑니까?

내 혼란을 이해합니까? 이걸 어떻게 다르게 구성해야할지 모르겠네요 ...

당신의 도움을 주셔서 대단히 감사합니다.

답변

6 devserkan Sep 11 2020 at 19:15

먼저 공식적인 설명을 여기에서 볼 수 있습니다 .

이 경우 어떻게 든 이전 카운트 값에 액세스합니다.

어떻게 든 이전 카운트 값에 액세스 하지 않습니다 . 기능 업데이트를 사용하고 setter에 콜백 함수를 제공하면 이전 상태를 반환하고 콜백 함수에서이 값을 사용합니다.

setCount는 이제 함수를 예상합니다.

함수를 제공하므로 사용할 수 있습니다.

setCount는 이제 비동기로 실행됩니다.

사실은 아닙니다. 비동기 함수가 아닙니다. 이전 상태를 제공하고 사용합니다. 상태 설정자는 비동기식이 아니며 상태 업데이트는 있습니다.

이 함수의 출처는 어디입니까?

prevCount의 출처는 어디입니까?

이미 대답했습니다.

이것을 실행하면 prevCount에 무엇이 들어 갑니까?

거기에 새로운 상태로 설정할 것을 제공합니다. 귀하의 예에서 count1 씩 증가시키고 싶으 므로+ 1

이 논리에 대한 순진한 설명이 있습니다. 순진한 것입니다. 콜백 로직을 예시하기 위해 이것을 추가하고 있습니다. 이것은 React의setState.

let state = 5;

function setState(val) {
  if (typeof val === "function") {
    return val(state);
  }

  return val;
}

const stateWithFunctionalUpdate = setState(prev => prev + 1);
const stateWithNormalUpdate = setState(9);
console.log(stateWithFunctionalUpdate);
console.log(stateWithNormalUpdate);

아마도이 예제는 React의 상태 설정 로직을 모방하는 데 적합 할 것입니다. 다시 말하지만 순진한 접근 방식입니다.

let state = 5;

function setState(val) {
  if (typeof val === "function") {
    state = val(state);
  } else {
    state = val;
  }

}

setState(9);
setState(prev => prev + 1);

console.log("state", state);

(타이핑없이) 의 실제 구현 을 살펴 보겠습니다 useState.

export function useState(initialState) {
  return useReducer(
    basicStateReducer,
    // useReducer has a special case to support lazy useState initializers
    initialState
  );
}

글쎄, 그것은 useReducer커튼 뒤에서 사용 합니다. 초기 상태를 설정하고 다음과 같은 basicStateReducer 를 사용합니다 .

function basicStateReducer(state, action) {
  return typeof action === "function" ? action(state) : action;
}

우리의 순진한 접근 방식과 마찬가지로 유형을 찾고 action그에 따라 작동합니다. 마지막으로 다음이 useReducer 반환됩니다 .

return [workInProgressHook.memoizedState, dispatch];

따라서 하루가 끝날 때에 함수를 제공하면 해당 함수를 useState가져온 다음 상태에서 실행하고 값을 반환합니다.

1 VietDinh Sep 11 2020 at 19:10

내가 이해하는 방법은 다음과 같습니다.

이 경우 어떻게 든 이전 카운트 값에 액세스합니다. -> setCount는 param을 확인하고, param이 콜백이면 해당 콜백을 호출하고 param에 대한 이전 상태를 전달합니다. 콜백 결과는 다음 상태가됩니다.

setCount는 이제 함수를 기대합니다 -> 예, 함수는 논리를 처리하고 다음 상태를 반환합니다.

setCount는 이제 asynchron 실행 ->이 함수는 synchron이지만 결과를 반환 한 후에 실행됩니다. setCount에 대한 후크는 이벤트를 전달하여 다음 상태를 업데이트합니다.

이 함수의 출처는 어디입니까? -> param이 현재 상태이고 다음 상태를 반환하는 한 함수에서 무엇이든 할 수 있습니다.

prevCount의 출처는 어디입니까? -> setCount를 호출 할 때 전달됩니다 (현재 상태에서 가져옴).

이것을 실행하면 prevCount에 무엇이 들어 갑니까? -> setCount의 현재 상태.

=> 값을 전달하는 방법이나 setCount에 대한 콜백의 예 : useState 후크, setState 함수. 이전 상태 값에 액세스