React中Provider组件详解

使用场景
1.A(顶级组件)-》B组件(子组件)-》C组件(孙子组件)
2.A(顶级组件)-》B组件(子组件)、C组件(孙子组件)…很多组件(每个组件都需要传props)
A组件传递数据给C组件实现方式有很多种
1.通过props层层传递到C组件
2.通过全局对象
使用Provider可以解决数据层层传递和每个组件都要传props的问题;

三个嵌套组件:A B C
场景:组件 C 想要取组件A 的属性,一般做法通过A–B–C一层一层传递下来
缺点:使用麻烦,容易出错,中途出错,后续都错

class A extends React.Component {
  state = { name: 'A'  }
  render(){
    return (
    <div>
        <B name={this.name.name}>
    </div>)
  }
}
// B组件
class Father extends React.Component {
  render(){
    return (
    <div>
        <C age={this.props.name}> 
    </div>)
  } 
}
// C组件
class C extends React.Component {
  render(){
     return (
     <div>
        {this.props.name}
      </div>
  } 
}

简单实现一个Provider ==》简化属性传递
利用react的context实现一个provider,任意后代组件可以直接通过context取到顶级组件的属性

// A组件
import Provider from './provider'
import B from './B';

 <Provider info={{name:'max', age: 13}}>
    <B/>
 </Provider>
// 简单的Provider组件
import React, { Component,Children } from 'react';
import PropTypes from  "prop-types" 
import A from './A'

export default class Provider extends React.Component {
  static  childContextTypes = {
    store: PropTypes.object.isRequired
  };
  constructor(props){
      super(props)
      this.store = {...props}
  }

  getChildContext(){
    return {store:this.store}
  }

  render(){
      return (
      <div>
          {this.props.children}
      </div>)
  }  
}
 // C组件
import React, { Component } from 'react';
import PropTypes from  "prop-types"

export default class C extends React.Component {
  // 必须要申明,react认为全局变量不好
  static  contextTypes = {
    store:PropTypes.object.isRequired
  };
  render(){
      return (
      <div>
          <h1>{this.context.store.info.age}</h1>  // 这里直接获取provider提供的属性值
      </div>)
  }
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值