0%

React Context

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。

Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。

使用props进行数据传递如下:

1
2
3
4
5
6
//App.js
class App extends React.Component {
render() {
return <Toolbar theme="dark" />;
}
}
1
2
3
4
5
6
7
8
9
10
11
//Toolbar.js
function Toolbar(props) {
// Toolbar 组件接受一个额外的“theme”属性,然后传递给 ThemedButton 组件。
// 如果应用中每一个单独的按钮都需要知道 theme 的值,这会是件很麻烦的事,
// 因为必须将这个值层层传递所有组件。
return (
<div>
<ThemedButton theme={props.theme} />
</div>
);
}
1
2
3
4
5
6
//ThemedButton.js
class ThemedButton extends React.Component {
render() {
return <Button theme={this.props.theme} />;
}
}

使用 context进行数据传递如下:

1
2
3
4
5
//ThemeContext.js
//使用createContext为theme 创建一个context。
const ThemeContext = React.createContext({
theme:"light"
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//App.js
import ThemeContext from "ThemeContext.js";

class App extends React.Component {
render() {
// 使用Provider将当前的theme的值传递给组件树,且通过value来改变theme的值。
//接下来组件树接受的theme值为dark。
return (
<ThemeContext.Provider value={{theme: "dark"}}>
<Toolbar />
</ThemeContext.Provider>
);
}
}
1
2
3
4
5
6
7
8
9
//Toolbar.js
//中间的组件不用向下传递theme了。
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
1
2
3
4
5
6
7
8
9
10
11
//ThemedButton.js
import ThemeContext from "ThemeContext.js";

function ThemedButton() {
// 使用Consumer获取theme的值,此时theme的值为dark。
return (
<ThemeContext.Consumer>
{value=> <Button theme={value.theme} /> }
</ThemeContext.Consumer>
)
}

使用v16.8.0版本新增的Hooks中提出的useContext来更加便利的使用context:

1
2
3
4
5
6
7
8
9
10
11
//ThemedButton.js
import React from 'react';
import ThemeContext from "ThemeContext.js";

function ThemedButton() {
// 使用useContext获取theme的值。
const value = React.useContext(ThemeContext);
return (
<Button theme={value.theme} />
)
}