【问题标题】:React set variable value from a call back from child component从子组件的回调中反应设置变量值
【发布时间】:2020-11-24 01:27:48
【问题描述】:

我正在学习 React,需要一些帮助来找出这段代码的问题并了解我做错了什么。父组件是 MyMap,它需要来自其子组件(搜索栏)的 Lat 值。 回调函数名称为 setLatInfo,它将为 useState 中定义的 lat 变量设置值。

我看到的错误是 React Hook useEffect 内部对“setLatInfo”变量的赋值将在每次渲染后丢失。要随着时间的推移保留该值,请将其存储在 useRef Hook 中,并将可变值保留在 '.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>
  );
};

【问题讨论】:

  • 使用useCallback 在主函数体内定义setLatInfo 可能更好。然后您可以在useEffect 中调用它并将其作为道具传递给&lt;SearchBar/>
  • 谢谢Jayce444,我之前没有useCallback,你介意用代码展示一下吗?

标签: reactjs use-effect use-state react-functional-component


【解决方案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 状态变化是异步的,你不能在下一行打印它们的新值

【讨论】:

  • 试试@Jaycee444 并告诉你。
  • 哦,很高兴知道我无法打印新值。我还能如何检查它们?
  • 那我们为什么要使用这行代码呢?setLatInfo("initial value");为什么我们需要给它赋值?它是一个函数,为什么它需要一个初始值?
  • 我相信如果你只是在组件的主体中打印状态值,它将起作用,因为每次组件重新渲染时都会运行它。您也可以将其放入 useEffect 中,例如 useEffect(() =&gt; console.log(lat), [lat]);。你不需要需要给它一个初始值,我这样做是因为 useEffect 将在组件的初始渲染上运行,所以它会被调用。我只是给它那个值来表明这一点。
  • 非常感谢。我认为这有很大帮助。我现在正在阅读 useCallback 挂钩。我无法理解的一件事是为什么看看为什么没有 useCallback 就无法工作..
猜你喜欢
  • 2021-04-06
  • 2021-10-11
  • 1970-01-01
  • 2021-11-27
  • 2020-12-15
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多