Context 是 React 提供的一个 API
其功能有:
使用 createContext()
建立一个 Context 物件,
回传的物件中包含两个子元件:
const testContext = React.createContext();
const { Provider, Consumer } = testContext;
// App.js
export const ThemeContext = React.createContext()
const App = () => {
const [dark, setDark] = useState(true);
return (
<>
<ThemeContext.Provider value={dark}>
<FunctionComponent />
<ClassComponent />
</ThemeContext.Provider>
</>
);
}
产生了 Context 物件後
就可以呼叫它的 Provider,
被 Provider 包覆的子元件,
以及这些元件的子元件
都能接收到 value 这个参数,
而不需要在使用 props,
可避免产生复杂的巢状结构。
而如果需要多个 Provider,
可以一层层包在外面,
让资料传递进去。
// ThemeProvider.js
const ThemeContext = React.createContext();
const ThemeUpdate = React.createContext();
const ThemeProvider = ({children}) => {
const [dark, setDark] = useState(true);
const changeTheme = () => {
setDark(prevDark => !prevDark)
}
return (
<ThemeContext.Provider value={dark}>
<ThemeUpdate.Provider value={changeTheme}>
{children}
</ThemeUpdate.Provider>
</ThemeContext.Provider>
)
}
// App.js
const App = () => {
return (
<ThemeProvider>
<FunctionComponent />
<ClassComponent />
</ThemeProvider>
)
};
在需要使用 value 的地方
引入 Context 物件与 Consumer,
如此 Consumer 底下的范围内,
便都能自由使用 Provider 传入的变数。
// ButtonGroupComponent.js
import { ThemeContext } from './App.js';
const ButtonGroupComponent = () => {
const themeStyle = (dark) => {
return {
backgroundColor: dark ? '#2c3e50': '#f1c40f',
color: dark ? '#ecf0f1' : '#2c3e50'
}
};
return (
<ThemeContext.Consumer>
{ dark =>
<button style={themeStyle(dark)}>Class Component</button>
}
</ThemeContext.Consumer>
);
}
<<: 初学者跪着学JavaScript Day21 : 原型毕露(下)
>>: Day20【Dev】编程方法:Imperative 与 Declarative
别在乎别人做什麽;做得比自己好,每天突破自己的纪录,你就是一位成功者! Never mind wha...
今天我们来介绍 DRF 的 Authentication,了解 DRF 如何加入 Authencat...
设定 BMO 初始化、更新要更新什麽、画出 BMO 的方法 class Bmo { constru...
前言 大家好,我是辅大大三的学生,由於课程所需让我接触到铁人赛,因此我和同学一起组队参加,首先谢谢大...
虽然各式各样的工具会导入到专案中来提高效率,但是浏览器能看懂得档案只有 HTML、CSS、JavaS...