React-12 Context的使用

当最外层父组件需要给最底层子组件传递数据时,按照react中组件通信方式,需要使用props一层层组件向下传递,当组件层次较多时,会比较繁琐;

      这时我们可以使用Context,Context作用就是跨组件传递数据

使用步骤:

1. 调用React.createContext() 创建Provider(用来提供数据) 和 Consumer(用来消费数据) 两个组件;

const {Provider,Consumer} = React.createContext();

2. 使用Provider组件作为父节点包裹我们的应用(根组件);

3. 设置value属性,表示要传递的数据;

<Provider value='name'>
    <div>
        <Child></Child>
    </div>
</Provider>

4. 调用 Consumer组件接收数据;

<Consumer>
   {(data)=>{return  <span>data参数表示接收到的数据---{data}}</span>}
</Consumer>

小案例如下:

index.js:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';

// 创建Context
const {Provider,Consumer} = React.createContext();

class App extends React.Component{
    state={
        name:'张三'
    }
    render(){
        return(
            <Provider value={this.state.name}>
                <div className='app'>
                    App
                    <Node />
                </div>
            </Provider>
            
        )
    }
}

class Node extends React.Component{
    render(){
        return (
            <div className='node'>
                Node
                <SubNode />
            </div>
        )
    }
}

class SubNode extends React.Component{
    render(){
        return (
            <div className='subNode'>
                SubNode
                <Child />
            </div>
        )
    }
}

class Child extends React.Component{
    render(){
        return (
            <div className='child'>
                我是最底层子组件 Child  
                <Consumer>
                    {(data)=>{return <span>  Context传递过来的数据为: {data}</span>}}
                </Consumer>
            </div>
        )
    }
}

ReactDOM.render(<App />,document.getElementById('root'))

index.css:

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

code {
  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
    monospace;
}

.app{
  background-color: rgb(240, 26, 61);
  padding: 10px;
}

.node{
  background-color: rgb(247, 69, 99);
  padding: 10px;

}
.subNode{
  padding: 10px;
  background-color: rgb(252, 160, 175);
}
.child{
  padding: 10px;
  background-color: rgb(247, 204, 209);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阁下何不同风起?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值