使用 useCotext
當有資料想在不同元件間共用時,可以將資料存入 useCotext 這個 hook,元件再從 useCotext 取用資料。
- 將
createContext, useContext
解構出來
1
| const { useState, useEffect, createContext, useContext } = React;
|
- createContext 建立資料共用環境
1
| const UserContext = createContext({});
|
- 將 UserContext 包在需要資料的子元件外層,並將資料傳入 UserContext
1 2 3 4 5 6 7 8 9 10 11
| const App = () => { const [username, setUsername] = useState('卡斯伯');
return (<> <UserContext.Provider value={{ username, setUsername }}> <Greeting /> <br /> <LoginForm /> </UserContext.Provider> </>) }
|
- 子元件中使用 useContext 取得資料
1 2 3 4 5 6 7 8
| const Greeting = () => { const { username } = useContext(UserContext);
return <> { username } 你好, 歡迎登入 <DeepComponent /> </> }
|
進階使用方法
除了上面將狀態放在 App 元件再傳入 UserContext 元件裡的方法以外,也可以將資料直接放在 UserContext, App 就不管理狀態。
- 建立 UserProvider 元件管理狀態,並將狀態存入 UserContext.Provider 回傳,children 會將子元件帶入
1 2 3 4 5 6 7 8
| const UserProvider = ({ children }) => { const [username, setUsername] = useState('卡斯伯'); const [isLogin, setIsLogin] = useState(false);
return (<UserContext.Provider value={{ username, setUsername, setIsLogin, isLogin}}> { children } </UserContext.Provider>) }
|
- 使用 UserProvider 包覆子元件
1 2 3 4 5 6 7
| const App = () => { return (<> <UserProvider> <DashBoard /> </UserProvider> </>) }
|
- 子元件即可取得 userCotext 資料
1 2 3 4
| const DashBoard = () => { const { isLogin } = useContext(UserContext); return (<>{ isLogin ? <Greeting /> : <LoginForm /> }</>) }
|