0

介绍

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

问题

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

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

Pd:我正在使用“受保护的路线”模式进行导航

代码

退出组件

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} />
     </>
 )
4

1 回答 1

1

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

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

如果不是(错误或其他东西......)会发生什么?

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

于 2020-08-26T07:14:34.843 回答