zoukankan      html  css  js  c++  java
  • react中使用decorator 封装context

    2020-03-27
    react中使用decorator 封装context

    在传统的react context中,子组件使用context十分繁琐,如果需要使用context的子组件多的话

    每个组件都需要写consumer,所有如果能使用decorator的话,就会方便很多

    对比一下下:
    方案1: 传统的context
    每一个需要使用context的组件都需要写consumer
     
    import React from 'react';
    import MyContext from '../context.js';
    
    class Son extends React.Component {
      render() {
        return (
          // 每一个需要使用context的组件 你都需要用consumer包装一下
          // 如果有一百个呢???? 而且写法复杂很不友好!
          <MyContext.Consumer> 
            {value => (
              <div>
                <div>{value.name}</div>
                <div>{value.age}</div>
              </div>
            )}
          </MyContext.Consumer>
        )
      }
    }
    
    export default Son;
    方案2: 牛p的decorator
    哪个组件要用 装饰一下即可
    import React from 'react';
    import MyContext from '../context.js';
    
    function withUser(Component) { // 定义一个方法,这个方法就是decorator装饰器
      return class extends React.Component{ // 方法返回了一个组件 是将原组件装饰之后的组件
        render() {
          return (
            // 装饰器统一将原组件用Consumer包装起来 并将context的value值存在组件props的指定key中,这里是user
            <MyContext.Consumer> 
              {value => <Component user={value} {...this.props} />}
            </MyContext.Consumer>
          )
        }
      }
    }
    
    export default withUser;
     
    import React from 'react';
    import withUser from './decorator';
    
    @withUser // 装饰器的参数默认就是下面的组件了
    class Son extends React.Component {
      render() {
        return (
          <div>
            {/* 经过 装饰器装饰过的组件中 props中已经有了context的值了, key是user */}
            <div>{this.props.user.name}</div> 
            <div>{this.props.user.age}</div>
          </div>
        )
      }
    }
    
    export default Son;
  • 相关阅读:
    元素模式
    完美C++(第5版)(双色)
    ASP.NET Web API 2框架揭秘
    跨终端 Web
    WebKit技术内幕
    云计算时代——本质、技术、创新、战略
    互联网创业密码
    Netty权威指南
    Robot Framework 学习笔记(二)-------第一个脚本
    Robot Framework学习笔记(一)------环境搭建
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/12582456.html
Copyright © 2011-2022 走看看