React的context的使用
如果一个变量是全局性的,如i18n或theme,那通过props自上而下的传递就非常笨重了。react 提供了一个 context api,可以通过创建一个上下文,在 Provider
中提供值以及修改值的方式,在 Consumer
中消耗值即修改值的方式。通过context的方式减少,值通过props层层传递的情况。
创建Context
使用 React.createContext
api 创建一个context上下文;context是一个react.context
的对象,对象中包含Provider
和Consumer
key。
其中 Provider
和 Consumer
中有一个_context
属性,循环引用了context。
在挂载 Provider
组件时,会将Provider 组件的props.value 赋给 Provider._context._currentValue
,这样会同时更新 context._currentValue
和 Consumer._context._currentValue
,最终达到同一上下文的目的。
// context.js
export const ThemeContext = React.createContext({})
// Context 值如下:
// {
// $$typeof: Symbol(react.context),
// Consumer: {$$typeof: Symbol(react.context), _context: {…}, …},
// Provider: {$$typeof: Symbol(react.provider), _context: {…}},
// _currentRenderer: null,
// _currentRenderer2: null,
// _currentValue: {},
// _currentValue2: {},
// _defaultValue: null,
// _globalName: null,
// _threadCount: 0
// }
提供:使用Provider提供value
在使用Provider
时,为 Provider
增加一个 value
props。
import {ThemeContext} from 'context.js'
import Header from 'Header'
import Main from 'Main'
const App = () => {
const [theme, setTheme] = useState('black')
const toggleTheme = () => {
setTheme(theme === 'black' ? 'white' : 'black')
}
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
<Header />
<Main />
</ThemeContext.Provider>
)
}