Откуда берется currCount в этом примере?

#reactjs #react-hooks

#reactjs #реагирующие хуки

Вопрос:

Я смотрел упрощенное видео для веб-разработчиков о написании более чистого кода в React, но этот пример даже слишком чистый для моего понимания, потому что я не могу понять, какой механизм присваивает значение currCount параметру -parameter в arrow-function (который сам является параметром для функции hook setCount ), весь пример находится в github, но здесь яскопируйте фактическую компонентную функцию для контекста:

 function Counter({ initialCount }) {
  const [count, setCount] = useState(initialCount)

  function incrementCount() {
    setCount(currCount => currCount   1)
  }

  function decrementCount() {
    setCount(currCount => currCount - 1)
  }

  useEffect(() => {
    console.log(count)
  }, [count])

  return (
    <div>
      <button onClick={decrementCount}>-</button>
      {count}
      <button onClick={incrementCount}> </button>
    </div>
  )
}
  

Мне нужно введение currCount : где оно инициализируется текущей переменной count (или копией состояния?)?

Ответ №1:

Давайте начнем отсюда:

 // let's say we have
const initialCount = 1;

const [count, setCount] = useState(initialCount);
  

После этой строки у вас есть setCount функция, которую вы можете использовать для обновления count , которая на данный момент равна 1. Например, вы можете сделать setCount(123) .

Но что, если ваше новое значение — это не простое число, например 123, а что-то, что вам нужно вычислить, и, кроме того, оно вычисляется с использованием предыдущего состояния или предыдущего значения счетчика.

В документах React говорится:

Если новое состояние вычисляется с использованием предыдущего состояния, вы можете передать функцию setCount . Функция получит предыдущее значение и вернет обновленное значение.

Давайте попробуем это сделать:

 // first we need a function to compute new value 
function computeNewCount(prevCount) {
    return prevCount   1;
}

// second at some point we need to call setCount to do the actual update
// and React will call this function for you and pass previous count value as argument 
setCount(computeNewCount);
  

Обычно мы не пишем подобный код. Вместо написания функции вы можете использовать функцию со стрелкой, которая выглядит намного проще:

 // that's our computeNewCount as arrow function
prevCount => prevCount   1

// and you can pass it to setCount
// React will do the rest (as above)
setCount(prevCount => prevCount   1)
  

Ответ №2:

currCount используется только в лямбдах, которые имеют свой собственный контекст.

currCount => currCount является ли JS сокращением для

 function anonymous(currCount) {
  return currCount;
}
  

Вероятно, вы можете видеть, что currCount это можно назвать как угодно, потому что оно закрыто в контексте анонимной функции.

 function anonymous(iceCream) {
  return iceCream;
}
  

В этом случае setCount принимает лямбда или нефункциональное значение.
Так setCount(g => g 1) что в основном эквивалентно setCount(count 1)