介绍
我的应用程序的不同屏幕上有多个听众。注销是在我的个人资料屏幕的子组件中实现的,由于我没有使用 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} />
</>
)