有关react的Context

react中,如果父组件要传值给子组件的话,一般可通过props进行传递。但是,当很深层级的组件需要获取外层组件的状态或是公众的数据时,若使用props进行传递的话,则需要一层一层…的往下进行,难免冗余和繁琐,这个时候我们就可以利用Context进行传递。

单个数据 contextType

// 文件1 data.js
import React from 'react';
export const ThemeContext = React.createContext('1');
// 订阅此context的组件 往上层找不到 ThemeContext.Provider 时 默认值 ’1‘ 才生效
// 文件2 App
import React, { Component } from 'react';
import Toolbar from './film3';
import { ThemeContext } from './data'
export default class App extends Component {
    state = {
        a: 999
    }
  render() {
    return (
        <ThemeContext.Provider value={this.state.a}>
                    <Toolbar />
                    <span onClick={()=>{
                        this.setState({
                            a: this.state.a + 1
                        })
                    }}>aa</span>
        </ThemeContext.Provider>
    );
  }
}
// 文件3 film3.js
import React from 'react'
import {ThemeContext} from './data'
export default function Toolbar() {
  return (
    <div>
      <ThemedButton/>
    </div>
  );
}

class ThemedButton extends React.Component {
  static contextType = ThemeContext; // 写法1 
  render() {
    return <div>
        {this.context}  //999
    </div>;
  }
}
// ThemedButton.contextType = ThemeContext;  写法1与此写法等价

多个数据时 Consumer

// 文件1 data.js
import React from 'react';
export const ThemeContext = React.createContext('1');
export const LiuContext = React.createContext('liu');
// 文件2 App.js
import React, {Component} from 'react';
import Toolbar from './film3';
import {ThemeContext,LiuContext} from './data';
export default class App extends Component {
    state = {
        a: 999,
        b: 888
    }
  render() {
    return (
        <ThemeContext.Provider value={this.state.a}>
            <LiuContext.Provider value = {this.state.b}>
                    <Toolbar />
                    <span onClick={()=>{
                        this.setState({
                            a: this.state.a + 1
                        })
                    }}>aa</span>

                     <span onClick={()=>{
                        this.setState({
                            b: this.state.b + 1
                        })
                    }}>bb</span>
            </LiuContext.Provider>
        </ThemeContext.Provider>
    );
  }
}
// 文件3 film3.js
import React from 'react'
import {ThemeContext,LiuContext} from './data'

export default function Toolbar() {
  return (
    <div>
      <Content />
    </div>
  );
}
// 一个组件可能会消费多个 context
function Content() {
    return (
      <ThemeContext.Consumer>
        {theme => (
          <LiuContext.Consumer>
            {user => (
              <div>
                  {user} xx  // 888
                  <br />
                  {theme} .. // 999
              </div>
            )}
          </LiuContext.Consumer>
        )}
      </ThemeContext.Consumer>
    );
}

------- 手动分割线 -------

请忽略代码中的命名…很早之前就知道context,但因为实际项目中有使用状态管理(redux、mobx),所以一直没怎么了解如何使用,有点太依赖于状态管理了。其实做些小型的项目,完全可以不使用状态管理,这样不但可以更好的帮助自己理解react本身,更可以减小项目的体积。

前端菜鸟,如有问题,还请多多指出~~
在这里插入图片描述

ReactContext是一种在组件之间共享数据的方法。它通过创建一个context对象,其中包含一个Provider和Consumer组件来实现。 Provider组件用于提供共享的数据,而Consumer组件用于获取这些共享的数据。在Provider组件内部,可以通过value属性来传递数据。而在Consumer组件内部,通过函数的方式获取这些数据。 下面是一个使用Context的例子: connect函数接受一个mapState函数作为参数,该函数用于将context的值映射到组件的props中。 总结来说,ReactContext提供了一种在组件之间共享数据的方式,可以通过Provider组件提供数据,再通过Consumer组件获取数据。同时,通过封装Consumer组件的方式,可以简化使用过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [React中的context](https://blog.csdn.net/sxm666666/article/details/115704805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Reactcontext上下文详解](https://blog.csdn.net/astonishqft/article/details/82868126)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值