美文网首页
React Context使用过程

React Context使用过程

作者: kevin5979 | 来源:发表于2020-09-27 11:14 被阅读0次

组件多级传递

function ProfileHeader(props) {
  return (
    <div>
      <p>用户昵称: {props.nickname}</p>
      <p>用户等级: {props.level}</p>
    </div>
  )
}
class Profile extends Component{
  render() {
    return (
      <div>
        <ProfileHeader {...this.props} />
        <ul>
          <li>1</li>
          <li>2</li>
          <li>3</li>
        </ul>
      </div>
    )
  }
}
export default class ContextTest extends Component {
  constructor(props) {
    super(props);

    this.state = {
      nickname:"kevin",
      level:1
    }

  }

  render() {
    return (
      <div>
        <Profile nickname={this.state.nickname} level={this.state.level}/>
      </div>
    )
  }
}
  • 存在问题
    多级传递参数会是代码增多,不利于维护

使用 Context

类组件使用 Context

步骤

  • 创建一个需要共享的Context对象(写在组件外部)
const MyContext = React.createContext(defaultValue)
  • 在需要的组件中挂载(写在组件外部)
组件.contextType = MyContext;
  • 默认值使用(拥有源数据的组件中)
<Profile/>
  • 自定义值使用 这里如果传值不够,默认值不会覆盖,而是完全丢弃默认值
<MyContext.Provider value={{nickname: "kevin", level: 99}}>
  <Profile/>
</MyContext.Provider>
  • 注意点
 *  在该组件的所有生命周期都可以拿到this.context值
 *  MyContext.Provider嵌套时,组件会寻找距离最近的一个Provider值
完整代码流程
const MyContext = React.createContext({nickname: "kevin", level: 1})
/**
 * 1. 如果一个组件订阅了Context,那么这个组件会从离自身最近的那个匹配的 Provider 中读取到当前的context值;
 * 2. defaultValue是组件在顶层查找过程中没有找到对应的Provider,那么就使用默认值
 */
class ProfileHeader extends Component{
  componentDidMount() {
    let value = this.context
    console.log("componentDidMount", value);
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    let value = this.context
    console.log("componentDidUpdate", value);
  }

  componentWillUnmount() {
    let value = this.context
    console.log("componentWillUnmount", value);
  }
  render() {
    return (
      <div>
        <p>用户昵称: {this.context.nickname}</p>
        <p>用户等级: {this.context.level}</p>
      </div>
    )
  }
}
ProfileHeader.contextType = MyContext;
class Profile extends Component {
  render() {
    return (
      <div>
        <ProfileHeader/>
        <p>其他内容</p>
      </div>
    )
  }
}
export default class ContextTest extends Component {
  constructor(props) {
    super(props);
    this.state = {
      nickname: "kevin",
      level: 1
    }
  }


  render() {
    return (
      <div>
        <MyContext.Provider value={{nickname: "kevin", level: 99}}>
          <div>-------- 自定义Provider ----------</div>
          <Profile/>
        </MyContext.Provider>
        <div>-------- 默认 ----------</div>
        <Profile/>
      </div>
    )
  }
}
image.png

函数组件使用 Context

步骤

  • 创建一个需要共享的Context对象(写在组件外部)
const MyContext = React.createContext(defaultValue)
  • 在子组件中(写在组件内部)
return (
    <div>
      <MyContext.Consumer>
        {
          data=> {
            return (
              <div>
                <h2>用户昵称: {data.nickname}</h2>
                <h2>用户等级: {data.level}</h2>
              </div>
            )
          }
        }
      </MyContext.Consumer>
    </div>
  )
  • 在父组件中默认使用(拥有源数据的组件中)
<Profile/>
  • 自定义值使用 这里如果传值不够,默认值不会覆盖,而是完全丢弃默认值,并且取最近的Provider
<MyContext.Provider value={{nickname: "kevin", level: 99}}>
  <MyContext.Provider value={{nickname: this.state.nickname, level: this.state.level}}>
    <Profile/>
  </MyContext.Provider>
</MyContext.Provider>
  • 注意点
 *  函数组件不需要这步
    // ProfileHeader.contextType = MyContext;
 *  MyContext.Provider嵌套时,组件会寻找距离最近的一个Provider值
完整代码流程
const MyContext = React.createContext({nickname: "kevin", level: 1})

function ProfileHeader() {
  return (
    <div>
      <MyContext.Consumer>
        {
          value => {
            return (
              <div>
                <h2>用户昵称: {value.nickname}</h2>
                <h2>用户等级: {value.level}</h2>
              </div>
            )
          }
        }
      </MyContext.Consumer>
    </div>
  )
}
// 函数组件不需要这步
// ProfileHeader.contextType = MyContext;

class Profile extends Component {
  render() {
    return (
      <div>
        <ProfileHeader/>
        <p>其他内容</p>
      </div>
    )
  }
}

export default class ContextTest extends Component {
  constructor(props) {
    super(props);
    this.state = {
      nickname: "jeff",
      level: 9
    }
  }

  render() {
    return (
      <div>
        <MyContext.Provider value={{nickname: "kevin", level: 99}}>
          <MyContext.Provider value={{nickname: this.state.nickname, level: this.state.level}}>
            <Profile/>
          </MyContext.Provider>
        </MyContext.Provider>
        <p>----- 默认 -----</p>
        <Profile/>
      </div>
    )
  }
}
image.png END

相关文章

  • React Context使用过程

    组件多级传递 存在问题多级传递参数会是代码增多,不利于维护 使用 Context 类组件使用 Context 步骤...

  • React Context的使用 React Context能不

    官方给的解释如下 在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但...

  • React Context 解析

    react Context 是典型的生产者 <=> 消费者模式 1 使用 React.createContext(...

  • 2018-08-08

    React 高级指南 React 新版上下文(context) context ?答:上下文(Context) 提...

  • react context 的使用

    看了react context 语法,记录一下使用方式 context 的定义 提供了一种方式,能够让数据在组件树...

  • react context的使用

    context:主要为了跨层级通信。 使用步骤 通过 React.createContext()创建一个conte...

  • react context

    React Context 绝大多数应用程序不需要使用 context.如果你想让你的应用更稳定,别使用conte...

  • redux和react-redux的吐槽

    redux使用react还在测试阶段的context脱离传统事件流,只为了能跨组建获取数据,看react-redu...

  • React中不常用的功能——Context

    React中不常用的功能——Context Context React源码版本16.8 基本用法 跨层级通信 Co...

  • React中的Context理解

    今天看了下react官网的context,记录下学习过程和自己对context的理解。下面从为什么要用和怎么用两个...

网友评论

      本文标题:React Context使用过程

      本文链接:https://www.haomeiwen.com/subject/helphktx.html