跳到主要内容

React-Context

Context

什么是Context

Context为我们提供了一种在不同组件间共享数据的方式,它不再拘泥于props刻板的逐层传递,而是在外层组件中统一设置,设置后内层所有的组件都可以访问到Context中所存储的数据。换句话说,Context类似于JS中的全局作用域,可以将一些公共数据设置到一个同一个Context中,使得所有的组件都可以访问到这些数据。

为什么用Context

在React中组件间的数据通信是通过props进行的,父组件给子组件设置props,子组件给后代组件设置props,props在组件间自上向下(父传子)的逐层传递数据。但并不是所有的数据都适合这种传递方式,有些数据需要在多个组件中共同使用,如果还通过props一层一层传递,麻烦自不必多说。

怎么用Context

1.创建Context

/* const MyContext = React.createContext(defaultValue); */ //示例

import React from "react";

const TestContext = React.createContext({
name:'孙悟空',
age:18,
gender:'男',
sayHello:()=>{
alert(this.name);
}
});

export default TestContext;



React.createContext(defaultValue)用来创建一个Context对象,它需要一个初始值作为参数,这个初始值可以是一个原始值,也可以是一个JS对象。调用以后,方法将会返回一个Context对象,这个对象非常关键,当我们想在其他组件中访问Context中的数据时,必须要通过这个对象。

2.调用Context对象中的数据

第一种方式,可以通过Consumer标签来访问到Context中的数据

import React from 'react';
import TestContext from '../store/test-context';//引入之前创建的Context

const MyComponent = () => {

return (
<TestContext.Consumer>
{(ctx)=>{
return (
<ul>
<li>{ctx.name}</li>
<li>{ctx.age}</li>
<li>{ctx.gender}</li>
</ul>
);
}}
</TestContext.Consumer>

);
};

export default MyComponent;

方法二:钩子函数useContext()调用(常用)

import React, {useContext} from 'react';
import TestContext from '../store/test-context';

const MyComponent = () => {

const ctx = useContext(TestContext);

return (
<ul>
<li>{ctx.name}</li>
<li>{ctx.age}</li>
<li>{ctx.gender}</li>
</ul>
);
};

export default MyComponent;

3.provider-consumer模式

provider

什么是provider

​ React提供用来给组件指定Context值

import React from "react";
import MyComponent from "./component/MyComponent";
import TestContext from "./store/test-context";

const App = () => {


return <TestContext.Provider value={{name:'猪八戒', age:28, gender:'男'}}>//Privider组件中访问的是Provider提供的数据
<MyComponent/>
</TestContext.Provider>;
};

export default App;

Provider设置信息

Provider会设置在外层组件中,通过value属性来指定Context的值。这个Context值在所有的Provider子组件中都可以访问。

Context的信息使用流程

Context的搜索流程和JS中函数作用域类似,当我们获取Context时,React会在它的外层查找最近的Provider,然后返回它的Context值。如果没有找到Provider,则会返回Context模块中设置的默认值。