React 中 useContext
跟 React-MobX 的差異
useContext
useContext
是 react 提供的一個 hook,可以讓我們透過讀取和訂閱元件中 context
共享元件之間的資料,主要是用來解決狀態提升和 prop drilling 的問題(即層層傳遞 props)。
App.jsx
import { createContext, useContext, useRef, useState } from "react";
const AuthContext = createContext(null);
export default function App() {
const [currentUser, setCurrentUser] = useState("");
console.log("App rendered");
return (
<AuthContext.Provider value={{ currentUser, setCurrentUser }}>
<Form />
</AuthContext.Provider>
);
}
function WelcomeCard() {
const { currentUser, setCurrentUser } = useContext(AuthContext);
console.log("WelcomeCard rendered");
return (
<div>
<h1>Welcome, {currentUser}!</h1>
<button onClick={() => setCurrentUser("")}>Log out</button>
</div>
);
}
function News() {
console.log("News rendered");
return (
<div>
<h1>Latest News</h1>
<ul>
<li>ewrweorjewoirj</li>
<li>ewwwwwrj</li>
<li>wjwirjwi</li>
</ul>
</div>
);
}
function Form() {
const { currentUser, setCurrentUser } = useContext(AuthContext);
const [name, setName] = useState("");
function handleSubmit(event) {
event.preventDefault();
setCurrentUser(name);
}
console.log("Form rendered");
return (
<section>
{currentUser && <WelcomeCard />}
{!currentUser && (
<form onSubmit={handleSubmit}>
<div>
<label name="username">
username
<input
type={"text"}
id="username"
onChange={(event) => setName(event.target.value)}
/>
</label>
</div>
<button type="submit">Log in</button>
</form>
)}
<News />
</section>
);
}
在這例子中,使用 useContext 實作了一個簡單的登入表單,當使用者輸入名稱後,點擊登入按鈕,就會顯示歡迎卡片,並且可以登出。
在 App 元件中,使用 AuthContext.Provider
提供了 currentUser
和 setCurrentUser
兩個方法,透過 useContext
可以在子元件中取得這兩個方法。
子元件透過 setCurrentUser
方法,可以改變 AuthContext
的 currentUser
的值,並且重新 render 子元件。
透過 Context 傳遞資料
在 WelcomeCard
中,我們透過 useContext
取得 currentUser
和 setCurrentUser
,不需要透過 props 傳遞資料,就可以取得 currentUser
的值。