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;
原文地址:https://www.cnblogs.com/lanpang9661/p/12582456.html