说说Context有哪些属性?
- React.createContext:创建一个context对象
- Context.Provider:允许子组件消费context
- Context.Consumer:消费组件,会消费离它最近的provider中定义的值,如果不存在,则会销毁context的默认值
- Class.contextType:允许销毁最近的context的值
- Context.displayName:确定Context显示的名称
怎么使用Context开发组件?
使用Class.contextType
import './App.css';
import React from 'react';
const myContext = React.createContext('defaultContext');
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: '123'
};
}
render() {
return (
<myContext.Provider value={this.state}>
<Toolbar theme="dark" />;
</myContext.Provider>
);
}
}
function Toolbar(props) {
return (
<div>
<ThemedButton theme={props.theme} />
</div>
);
}
class ThemedButton extends React.Component {
render() {
return <div>{this.context.name}</div>;
}
}
ThemedButton.contextType = myContext;
export default App;
使用Context.Consumer
import './App.css';
import React from 'react';
const myContext = React.createContext('defaultContext');
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
name: '123'
};
}
render() {
return (
<myContext.Provider value={this.state}>
<Toolbar theme="dark" />;
</myContext.Provider>
);
}
}
function Toolbar(props) {
return (
<div>
<ThemedButton theme={props.theme} />
</div>
);
}
class ThemedButton extends React.Component {
render() {
return (
<myContext.Consumer>
{({ name }) => <div>{name}</div>}
</myContext.Consumer>
);
}
}
export default App;
为什么React并不推荐我们优先考虑使用Context?
- 会破坏组件树之间的依赖,不正确的使用context会使数据管理变得复杂多乱
- 这是一个实验性的api,以后可能会被废弃掉
除了实例的属性可以获取Context外哪些地方还能直接获取Context呢?
- 无状态组件参数直接获取
- 构造函数
- 生命周期函数 shouldComponentUpdate componentWillReceiveProps componentWillUpdate
childContextTypes是什么?它有什么用
childContextTypes用来定义context数据类型