React之Context随笔

Context

在 React 应用中,数据是通过 props 自上而下(父组件到子组件)传递的,但这对一些嵌套层数很多的组件来说,
数据的传递是很繁琐的,不出BUG还好,如果出现BUG,我们需要从最内层组件开始一层一层的排除问题所在,对于代码
维护以及可读性来说是很大的挑战。

Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。
它提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。

简单例子

App.js

import React from 'react';
import Screen from './Screen';

/**
|--------------------------------------------------
| @createContext
| 创建一个上下文的容器 生成一个 Context 对象。
| @Provider
| 生产者  生产共享数据的地方
| @Consumer
| 消费者  专门消费(使用)共享数据的地方
|--------------------------------------------------
*/

export const MyContext = React.createContext({ name: 'ddd', click: () => console.log('33') })

class App extends React.Component {
  state = {
    name: '点我啊!',
    num: 0,
    click: () => {
      this.setState({
        name: '你真点我啊?',
        num: this.state.num + 1
      })
    }
  }
  render() {
    return (
      <MyContext.Provider value={this.state}>
        <Screen />
      </MyContext.Provider>
    )
  }
}

export default App

Screen.js

import React from 'react';
import { Button } from 'antd';
import { MyContext } from './App';

const Toggle = () => {
  return (
    <MyContext.Consumer>
      {
        ({ name, click }) => <Button onClick={click}>{name}</Button>
      }
    </MyContext.Consumer>
  )
}

export default Toggle

Toggle.js

import React from 'react';
import { Button } from 'antd';
import { MyContext } from './App';

const Toggle = () => {
  return (
    <MyContext.Consumer>
      {
        ({ name, click }) => <Button onClick={click}>{name}</Button>
      }
    </MyContext.Consumer>
  )
}

export default Toggle

消费多个 Context

App.js

import React from 'react';
import Screen from './Screen';

/**
|--------------------------------------------------
| @createContext
| 创建一个上下文的容器 生成一个 Context 对象。
| @Provider
| 生产者  生产共享数据的地方
| @Consumer
| 消费者  专门消费(使用)共享数据的地方
|--------------------------------------------------
*/

export const MyContext = React.createContext({ name: 'ddd', click: () => console.log('33') });
export const MyTheme = React.createContext('#1DA57A');

class App extends React.Component {
  state = {
    name: '点我啊!',
    num: 0,
    click: () => {
      this.setState({
        name: '你真点我啊?',
        num: this.state.num + 1
      })
    }
  }
  render() {
    return (
      <MyContext.Provider value={this.state}>
        <MyTheme.Provider value={{ theme: 'primary' }}>
          <Screen />
        </MyTheme.Provider>
      </MyContext.Provider>
    )
  }
}

export default App

Screen.js

import React from 'react';
import { Button } from 'antd';
import { MyContext } from './App';

const Toggle = () => {
  return (
    <MyContext.Consumer>
      {
        ({ name, click }) => <Button onClick={click}>{name}</Button>
      }
    </MyContext.Consumer>
  )
}

export default Toggle

Toggle.js

import React from 'react';
import { Button } from 'antd';
import { MyContext, MyTheme } from './App';

const Toggle = () => {
  return (
    <MyContext.Consumer>
      {
        ({ name, click }) => (
          <MyTheme.Consumer>
            {
              ({ theme }) => <Button onClick={click} type={theme} >{name}</Button>
            }
          </MyTheme.Consumer>
        )
      }
    </MyContext.Consumer>
  )
}

export default Toggle

如果多个 Context 有共享的数据,最好能合并到一起。

如果有什么不足的地方,还望指正,共同学习。

更多关于 Context 的介绍,请点击React-Context 中文文档查看.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值