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>;
}
您的組件仍將在身份驗證狀態更改或用戶數據更改時重新呈現,但僅在需要時重新呈現。
添加回答
舉報