Javascript 反应本机:警告:Can';t在未安装的组件上执行React状态更新

Javascript 反应本机:警告:Can';t在未安装的组件上执行React状态更新,javascript,reactjs,react-native,react-hooks,Javascript,Reactjs,React Native,React Hooks,我很想了解,为了修复所描述的错误,在useffect中需要修复什么 以下是“数据源”: 这是因为您没有在useffect函数中提供cleanup函数。 数据源中有一些内容正在更改,因此会触发useEffect,但实际上屏幕没有聚焦,您可以使用以下代码解决此问题,并从给定链接阅读有关cleanup useEffect的更多信息: 第二个是: useEffect(() => { let isMounted = true; if (isMounted) {

我很想了解,为了修复所描述的错误,在useffect中需要修复什么

以下是“数据源”:


这是因为您没有在useffect函数中提供cleanup函数。 数据源中有一些内容正在更改,因此会触发useEffect,但实际上屏幕没有聚焦,您可以使用以下代码解决此问题,并从给定链接阅读有关cleanup useEffect的更多信息:

第二个是:

useEffect(() => {
        let isMounted = true;

    if (isMounted) {
      (() => {
       eventEmitter?.emit('selected', listSelectedZoneIds);
      })();
    }

    return () => {
      isMounted = false;
    };
  }, [listSelectedZoneIds]);

基本上,上述代码将帮助您使useEffect仅在屏幕装入堆栈时更新屏幕,如果未装入,则状态将不会更新,直到屏幕装入堆栈参照上面的链接,以帮助更好地理解出现错误/警告的原因。

代码片段中的
数据源是什么?你能分享一个更完整的代码示例吗?这甚至不是一个有效的React组件。这是“数据源”:
[{“isSelect”:false,“selectedClass”:null,“zoneId”:1026,“zoneName”:“tomato”},{“isSelect”:false,“selectedClass”:null,“zoneId”:1025,“zoneName”:“apple”}]
dataSource
useffect
钩子的依赖项,该钩子可能会在卸载组件后被触发并尝试更新状态。什么是更新数据源?请包括一个更全面的组件代码示例,最好是整个组件和触发更新/重新发布的任何父组件,这样我们就有了完整的上下文。您测试过这段代码吗?也许我只是误读了它,但只要运行effect回调,就会发现
isMounted
被设置为
true
,if语句就会被执行。我认为这种模式在这里不起作用,因为在渲染周期结束时,在清理功能中设置了
isMounted
false
,当效果消失时,它会立即再次设置
true
。第一个效果中没有任何东西是异步的,以利用存储模块。代码经过测试,实际上主要使用堆栈中的redux,因此它是这些警告类型的解决方案,有时我们没有任何控制器来清理函数,此解决方案在这些情况下非常有用,并且大多数情况下可以通过firebase/firestore实现。在我的情况下,它不起作用。。我不知道为什么还要检查你所有的屏幕,并用上面的代码更新你的useEffect。
function Button1(props) {
const [listSelectedZoneIds, setListSelectedZoneIds] = useState([]);

  useEffect(() => {
    let listSelectedZoneIds = dataSource
      .filter((zone) => zone.isSelect === true)
      .map((zone) => zone.zoneId);
    setListSelectedZoneIds(listSelectedZoneIds);
  }, [dataSource]);

  useEffect(() => {
    eventEmitter?.emit('selected', listSelectedZoneIds);
  }, [listSelectedZoneIds]);
}
useEffect(() => {
    let isMounted = true;

    if (isMounted) {
      (() => {
       let listSelectedZoneIds = dataSource
  .filter((zone) => zone.isSelect === true)
  .map((zone) => zone.zoneId);
setListSelectedZoneIds(listSelectedZoneIds);
      })();
    }

    return () => {
      isMounted = false;
    };
  }, [dataSource]);
useEffect(() => {
        let isMounted = true;

    if (isMounted) {
      (() => {
       eventEmitter?.emit('selected', listSelectedZoneIds);
      })();
    }

    return () => {
      isMounted = false;
    };
  }, [listSelectedZoneIds]);