1 回答
TA贡献1806条经验 获得超5个赞
恕我直言,您使用上下文 API 和身份验证观察者的方法已经很好,只有一些小问题:
你应该取消订阅你的观察者,正如 Awran5 提到的那样
您可以观察用户数据,而不是只获取一次
您可以将上下文分开以提高可读性和性能
您可以使用所有者的 id 在集合 users 中创建文档,这样您就可以直接访问
collection("users").doc(authUser.uid)
而不是进行查询
这是我修改您的示例的方法,不确定这是否是最好的方法,我正在等待其他人的评论:
const AuthContext = React.createContext();
function AuthProvider({ children }) {
const [authUser, setAuthUser] = React.useState(undefined);
React.useEffect(() => {
return firebase.auth().onAuthStateChanged(user => setAuthUser(user));
}, []);
return <AuthContext.Provider value={authUser}>{children}</AuthContext.Provider>;
}
const UserDataContext = React.createContext();
function UserDataProvider({ children }) {
const [userData, setUserData] = React.useState(null);
const authUser = React.useContext(AuthContext);
React.useEffect(() => {
if (!authUser) return;
const query = firebase.firestore().collection("/users").where("userId", "==", authUser.uid);
return query.onSnapshot(snapshot => setUserData(snapshot.empty ? null : snapshot.docs[0].data()));
}, [authUser]);
return <UserDataContext.Provider value={userData}>{children}</UserDataContext.Provider>;
}
export default function App() {
return (
<AuthProvider>
<UserDataProvider>
{/* ... other components */}
<MyComponent />
</UserDataProvider>
</AuthProvider>
);
}
function MyComponent() {
const authUser = React.useContext(AuthContext);
const userData = React.useContext(UserDataContext);
if (authUser === undefined) return <div>loading user authentication...</div>;
if (authUser === null) return <div>logged out</div>;
return <div>User data: {JSON.stringify(userData)}</div>;
}
您的组件仍将在身份验证状态更改或用户数据更改时重新呈现,但仅在需要时重新呈现。
添加回答
举报