【问题标题】:Is it neccessary to detach all my Firestore listeners when signing out?退出时是否需要分离所有 Firestore 侦听器?
【发布时间】:2020-08-26 07:10:42
【问题描述】:

简介

我的应用程序的不同屏幕上有多个侦听器。注销是在我的个人资料屏幕的子组件中实现的,并且由于我没有使用 redux,我必须将每个侦听器(实际上我将它们都存储在父组件的引用中)传递给它,以便在之前分离它们退出。

问题

这不是很容易处理,因为我必须将多个侦听器从子级传递给一个共同的父级作为道具,然后传递给 SignOut 组件...对组件树进行长时间的浏览。

真的有必要在退出之前分离我的所有 Firebase 侦听器吗?如果没有会发生什么(错误或其他东西......)?

Pd:我正在使用"Protected routes" 模式进行导航

代码

退出组件

const SignOut = withFirebase(function SignOut(props) {
   // ... stuff
   const signOut = () => {
    const { firebase, onSignOut } = props;

    // Do the neccessary stuff before signing out
    onSignOut();

    // Change the authentication state
    firebase.signOut();
  };
  // ... stuff
};

配置文件屏幕组件(退出组件的直接父级)

...
const {attachListener, detachListeners} = props;

// ... code attaching a new firestore listener
// ... stuff

return (
   ...
   <SignOut detachListeners={detachListeners} />
) 

公共父级(包含所有侦听器的引用)

 ...
 const listeners = useRef([]).current;

 const attachListener = (listener) => listeners.push(listener);

 const dettachListeners = () => listeners.forEach(listener => listener());


 useEffect(() => {
    // cleanup
    return () => { 
       detachListeners(); 
    }
 }, []);


 return (
     <>
        <Profile attachListener={attachListener} detachListener={detachListener} />
        <OtherComponentWithListeners1 attachListener={attachListener} />
        <OtherComponentWithListeners2 attachListener={attachListener} />
     </>
 )

【问题讨论】:

    标签: javascript reactjs firebase react-native google-cloud-firestore


    【解决方案1】:

    真的有必要在退出之前分离我的所有 Firebase 侦听器吗?

    这完全取决于您的具体情况。

    如果没有会发生什么(错误或什么...)?

    您可能会泄漏一个侦听器,该侦听器会在这些更新有用后很长时间内继续接收更新。这将浪费金钱和带宽。如果您想避免浪费,请在所有侦听器在您的应用中变得无用之前移除它们。

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 2018-11-15
      • 2020-01-31
      • 2020-02-24
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多