context API
在16.3之前,react官方是不推荐使用context API的,但是因为使用的开发者较多,所以在16.3版本推送了一个更加易用的context API供开发者使用,新的API,更加易用。
在新的context API中,React提供了一个createContext的方法,该方法返回一个包含Provider,Consumer对象,
例如:
// content.jsximport {createContext} from "react";// createContext:用来创建context,有一个参数是默认值,返回值是Provider和Consumer对象// Provider:用于提供context组件// Consumer:用于获取context组件export const {Provider,Consumer} = createContext({a:1});// App.jsximport React,{Component} from "react";import {Provider} from "./content;import Parent from "./parent";class App extends Component {state = {a:2};render(){return (<div><Provider value={this.state}><Parent /></Provider></div>)}}export default App;// child.js// 我们可以在子组件中使用Consumer获取Provider传递下来的数据import React, {PureComponent} from "react";import {Consumer} from "./content";class Child extends PureComponent {render(){return (<Consumer>{content=><p>{context.a}</p>}</Consumer>)}}export default Child
层级关系为:App -> parent -> child
我们可以通过context直接将数据从App中传递给child,而不需要parent的转递
context的用法
createContext:用于创建context,需要一个defaultValue的参数,并返回一个包含Provider,以及一个Consumer对象
Provider:顶层用于提供context的组件,包含一个value的props,value是实际的context数据
Consumer:底层用于获取context的组件,需要一个
需要注意的是,我们在context.js中初始化context API时加入的参数,是作为当我们没有设置Provider组件的情况下,Consumer组件可以调用那个参数作为初始值。
但是只要Provider组件存在,哪怕没有传值,Consumer也不会使用初始化时传入的值作为初始值。
为什么createContext需要一个defaultValue
