Реагировать установить значение переменной из обратного вызова из дочернего компонента

Я изучаю React, и мне нужна помощь в обнаружении проблемы с этим кодом и понимании того, что я делаю неправильно. Родительский компонент - MyMap, и ему нужны значения для Lat из его дочернего компонента, который является панелью поиска. Имя функции обратного вызова - setLatInfo, и она установит значение для переменной lat, определенной в useState.

Ошибка, которую я вижу, - это присвоения переменной setLatInfo изнутри React Hook useEffect будут потеряны после каждого рендеринга. Чтобы сохранить значение с течением времени, сохраните его в хуке useRef и сохраните изменяемое значение в свойстве .current. В противном случае вы можете переместить эту переменную прямо в useEffect.

на функции setLatInfo = (latInfo: number)

Как я могу назначить функцию обратного вызова в блоке useEffect?

import SearchBar from "../components/SearchBar";

const MyMap: FunctionComponent = () => {
    const [lat, setLat] = useState();
  let setLatInfo: (latInfo: number) => void;

  useEffect(() => {
    const loadData = () => {
      
      // map?.map
     // (map as any)?.map.addLayer(h3Layer);
    };
  
    setLatInfo = (latInfo: number) => {   // this entire function is showing error 
      setLat(latInfo);
      console.log(lat);
      console.log(latInfo);
    };

  }, []);

  return (
    <div>
      <SearchBar
        parentCallbackLat={setLatInfo}
      />
    </div>
  );
};

person Sarah    schedule 04.08.2020    source источник
comment
Вероятно, лучше определить setLatInfo внутри тела основной функции с помощью useCallback. Затем вы можете вызвать его внутри useEffect и передать его как опору в _4 _ / ›   -  person Jayce444    schedule 04.08.2020
comment
Спасибо, Jayce444, я раньше не использовал Callback, вы не против показать его с кодом?   -  person Sarah    schedule 04.08.2020


Ответы (1)


Лучше всего проверить синтаксис usCallback и то, как он работает, а также несколько примеров, чтобы вы могли точно понять, что с ним происходит. Базовый пример для вашего варианта использования:

const [lat, setLat] = useState();

const setLatInfo = useCallback(latInfo => {
    console.log(latInfo);
    setLat(latInfo);
},[setLat]);

useEffect(() => {
    setLatInfo("initial value");
}, [setLatInfo]);

return <SearchBar parentCallbackLat={setLatInfo} />;

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

person Jayce444    schedule 04.08.2020
comment
Попробуйте @ Jaycee444 и дайте вам знать. - person Sarah; 04.08.2020
comment
О, как хорошо знать, что я не могу напечатать новые значения. Как еще я могу их проверить? - person Sarah; 04.08.2020
comment
Итак, почему мы используем эту строку кода? SetLatInfo (начальное значение); Почему нам нужно присвоить ему значение? Это функция, зачем ей начальное значение? - person Sarah; 04.08.2020
comment
Я считаю, что если вы просто напечатаете значение состояния в основной части компонента, это будет работать, поскольку оно запускается каждый раз, когда компонент повторно отрисовывается. Вы также можете поместить его в useEffect, например useEffect(() => console.log(lat), [lat]);. Вам не нужно давать ему начальное значение, я просто сделал это, потому что useEffect будет запускаться при первоначальном рендеринге компонента, поэтому он будет вызван тогда. Я просто присвоил ему это значение, чтобы указать на это. - person Jayce444; 04.08.2020
comment
Спасибо большое. Я думаю, это очень помогло. Я сейчас читаю о хуке useCallback. Одна вещь, которую я не могу понять, - это почему я понимаю, почему он не работал без useCallback .. - person Sarah; 04.08.2020