1 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
恕我直言,您使用上下文 API 和身份驗(yàn)證觀察者的方法已經(jīng)很好,只有一些小問(wèn)題:
你應(yīng)該取消訂閱你的觀察者,正如 Awran5 提到的那樣
您可以觀察用戶數(shù)據(jù),而不是只獲取一次
您可以將上下文分開(kāi)以提高可讀性和性能
您可以使用所有者的 id 在集合 users 中創(chuàng)建文檔,這樣您就可以直接訪問(wèn)
collection("users").doc(authUser.uid)
而不是進(jìn)行查詢
這是我修改您的示例的方法,不確定這是否是最好的方法,我正在等待其他人的評(píng)論:
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>;
}
您的組件仍將在身份驗(yàn)證狀態(tài)更改或用戶數(shù)據(jù)更改時(shí)重新呈現(xiàn),但僅在需要時(shí)重新呈現(xiàn)。
添加回答
舉報(bào)