ComponentWillUnmount эквивалентно React Hooks, который имеет доступ к текущим значениям переменных состояния? - PullRequest
2 голосов
/ 28 февраля 2020

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

Этот код и окно иллюстрируют основную проблему, с которой я сталкиваюсь

Я знаю, что Я мог бы передать переменную состояния в массиве зависимостей useEffect, но в моем примере из реального мира требуется, чтобы эффект вызывался только один раз, когда компонент размонтируется, и добавление его в массив вызывало бы его при каждом рендеринге.

Также я пытался использовать useCallback, useRef для переменной состояния и безуспешно искал похожие варианты использования и примеры, и мне кажется, что я что-то упустил.

Есть ли способ выполнить оба требования (вызывается только один раз и доступ к переменным текущего состояния)?

Также вот мой код моего примера. Кнопка монтирует / размонтирует счетчик, и я хотел бы, чтобы при его исчезновении печаталось последнее значение счетчика.

import * as React from "react";
import "./styles.css";
import { useState, useEffect } from "react";

const Counter = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    return () => {
      // this should print the counters current value
      console.log("Count was " + count + " when counter disappeard!");
    };
  }, []); // Empty because effect should only run when component unmounts

  const handleClick = () => {
    setCount(count + 1);
  };

  return <button onClick={handleClick}>{count}</button>;
};

export default function App() {
  const [showCounter, setShowCounter] = useState(true);

  // mount/unmount the counter
  const handleClick = () => {
    setShowCounter(!showCounter);
  };

  return (
    <div className="App">
      <button onClick={handleClick}>Show/Hide counter</button>
      {showCounter && <Counter />}
    </div>
  );
}

Я был бы очень рад, если бы кто-нибудь знал способ решить это.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Другим решением было бы сохранить состояние в ссылке и иметь отдельный хук useEffect, который обновляет ссылку при изменении состояния. Затем вы можете получить доступ к «последнему» состоянию через объект ref.

Пример: https://codesandbox.io/s/trusting-diffie-8tiev

1 голос
/ 28 февраля 2020

Это может сработать:

https://codesandbox.io/s/blue-leaf-jmdu1

Я не знаю, является ли это решение, которое вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...