首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个组件只挂载一次,不要再卸载一次

一个组件只挂载一次,不要再卸载一次
EN

Stack Overflow用户
提问于 2020-05-10 21:46:39
回答 1查看 50关注 0票数 0

也许我认为可以解决我的问题的方法不是正确的。很高兴听到你的想法。我得到了:

代码语言:javascript
运行
复制
Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and async task in a useEffect cleanup function

并追踪到一个组件,该组件位于状态栏的headerRight部分。我的印象是它只会安装一次。无论如何,组件都会与发生并更新状态的同步进程进行通信。对于每个同步状态,将显示不同的图标。

dataOperations是一个NativeModules类,它与一些执行后台同步并将状态发送给RN的JAVA进行对话。

代码语言:javascript
运行
复制
import React, {useState, useEffect} from 'react';
import {DeviceEventEmitter } from 'react-native';

import DataOperations from "../../../../lib/databaseOperations"

const CommStatus: () => React$Node = () => {
  let [status, updateStatus] = useState('');
  const db = new DataOperations();

  const onCommStatus = (event) => {
    status = event['status'];
    updateStatus(status);
  };

  const startSyncing = () => {
    db.startSyncing();
  };


const listner = DeviceEventEmitter.addListener(
  'syncStatusChanged',
  onCommStatus,
);

 //NOT SURE THIS AS AN EFFECT
  const removeListner = () =>{
    DeviceEventEmitter.removeListener(listner)
  }

  //REMOVING THIS useEffect hides the error
  useEffect(() => {
    startSyncing();
    return ()=>removeListner(); // just added this to try
  }, []);



  //TODO: find icons for stopped and idle. And perhaps animate BUSY?
  const renderIcon = (status) => {
    //STOPPED and IDLE are same here.
    if (status == 'BUSY') {
      return (
        <Icon          
          name="trending-down"
        />
      );
    } else if (status == 'IS_CONNECTING') {
      ...another icon
    }
  };

  renderIcon();

  return <>{renderIcon(status)}</>;
};


export default CommStatus;

组件作为堆栈导航的一部分加载,如下所示:

代码语言:javascript
运行
复制
  headerRight: () => (
    <>
    <CommStatus/>
    </>
  ),
EN

回答 1

Stack Overflow用户

发布于 2020-05-10 23:20:49

为此,您可以使用App.js。

代码语言:javascript
运行
复制
    <Provider store={store}>

      <ParentView>
        <View style={{ flex: 1 }}>
          <AppNavigator />
          <AppToast />
        </View>
      </ParentView>

    </Provider>

因此,在这种情况下,将只挂载一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61713078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档