React Context使用

react

组件跨层级通信Context,类比Vue中的provider,Inject。

场景:一键换肤,切换地区

1,Context.js

API:

React.createContext

创建一个Context对象,当React渲染一个订阅了这个Context对象的组件,这个租金会从组件树中离自身最近的那个匹配的Provider中读取到当前的Context的值。

Context.Provider

Provider接受一个value属性,传递给消费组件,允许消费组件订阅context的变化。一个Provider可以和多个消费组件有对应关系。多个Provider也可以嵌套使用,里层的会覆盖外层的数据。

当Provider的value值发生变化时,它内部的所有消费组件都会重新渲染。Provider及其内部consumer组件都不受制于shouldComponentUpdate函数,因此当Consumer组件在其祖先组件退出更新的情况下也能更新。

Class.contextType

Context.Consumer

消费者

useContet

import React from "react";

export const ThemeContext = React.createContext({themeColor: "pink"});

export const ThemeProvider = ThemeContext.Provider; //提供者

export const ThemeConsumer = ThemeContext.Consumer; //消费者

export const UserContext = React.createContext();

export const UserProvider = UserContext.Provider;

export const UserConsumer = UserContext.Consumer;

 

2,ContextPage.js

ConsumerPage在<ThemeProvider>的服务区内,必须是Provider的子组件

import React, {Component} from "react";

import {ThemeProvider, UserProvider, UserContext} from "../Context";

import ConsumerPage from "./ConsumerPage";

import UseContextPage from "./UseContextPage";

export default class ContextPage extends Component {

constructor(props) {

super(props);

this.state = {

theme: {

themeColor: "red"

},

user: {name: "xiaoming"}

};

}

render() {

const {theme, user} = this.state;

return (

<div>

<h3>ContextPage</h3>

<ThemeProvider value={theme}>

<UserProvider value={user}>

<ConsumerPage />

<UseContextPage />

</UserProvider>

</ThemeProvider>

</div>

);

}

}

 

3, ConsumerPage.js

接受一个参数返回一个组件

包在<ThemeConsumer>里面,代表是人家的用户

import React, {Component} from "react";

import {ThemeConsumer, UserConsumer} from "../Context";

export default class ConsumerPage extends Component {

render() {

return (

<div>

<h3>ConsumerPage</h3>

<ThemeConsumer>

{themeContext => (

<div className={themeContext.themeColor}>

omg

<UserConsumer>

{userContext => <Child {...userContext} />}

</UserConsumer>

</div>

)}

</ThemeConsumer>

</div>

);

}

}

function Child(props) {

return <div>{props.name}</div>;

}

 

4,UseContextPage.js

import React, {useContext} from "react";

import {ThemeContext, UserContext} from "../Context";

export default function UseContextPage(props) {

const {themeColor} = useContext(ThemeContext);

const {name} = useContext(UserContext);

return (

<div className="border">

<h3 className={themeColor}>UseContextPage</h3>

<p>{name}</p>

</div>

);

}

 

总结:

三种使用方式,contextType, Consumer和useContext。

区别:

ContextType,使用简单,必须用在类组件上,只能通过该API订阅单一context.

Consumer,最广泛使用的

useContext,Hook方法,只能用在函数组件当中或者自定义的Hook当中。

 

 

react-redux用到Context,react-redux的<Provider />就是通过Context提供一个全局态的store,路由租金react-router通过Context管理路由状态等。

在React组件开发中,如果用好Context,可以让你的组件变得强大,而且灵活。

以上是 React Context使用 的全部内容, 来源链接: utcz.com/z/382809.html

回到顶部