如何使用装饰器重写反应组件作为纯函数?

vkj*_*fef 6 javascript reactjs airbnb-js-styleguide

我正在使用airbnb eslint设置,该规则具有强制将无状态反应组件重写为纯函数的规则.以下组件触发此规则,这意味着下面的组件将更好地编写为纯函数:

import React from 'react';
import { observer } from 'mobx-react';
import cssmodules from 'react-css-modules';

import styles from './index.css';
import Select from '../Select/';
import List from '../List/';

@cssmodules(styles)
@observer
export default class Analysis extends React.Component {
  render() {
    return (
      <div styleName="wrapper">
        <div styleName="column">
          <Select store={this.props.store} />
        </div>
        <div styleName="column">
          <List store={this.props.store} />
        </div>
      </div>
    );
  }
}

Analysis.propTypes = {
  store: React.PropTypes.object.isRequired,
};
Run Code Online (Sandbox Code Playgroud)

但是,当我将其重写为纯函数(见下文)时,我得到的错误是Leading decorators must be attached to a class declaration:

import React from 'react';
import { observer } from 'mobx-react';
import cssmodules from 'react-css-modules';

import styles from './index.css';
import Select from '../Select/';
import List from '../List/';

@cssmodules(styles)
@observer
function Analysis(props) {
  return (
    <div styleName="wrapper">
      <div styleName="column">
        <Select store={props.store} />
      </div>
      <div styleName="column">
        <List store={props.store} />
      </div>
    </div>
  );
}

Analysis.propTypes = {
  store: React.PropTypes.object.isRequired,
};
Run Code Online (Sandbox Code Playgroud)

那么我可以将它编写为纯组件并仍然附加装饰器吗?或者这是airbnb linting规则中的一个错误,是否不可能满足这两个规则?

vkj*_*fef 8

好的,问题是es7样式装饰器.Desugaring他们解决了这个问题:

import React from 'react';
import { observer } from 'mobx-react';
import cssmodules from 'react-css-modules';

import styles from './index.css';
import Select from '../Select/';
import List from '../List/';

function Analysis(props) {
  return (
    <div styleName="wrapper">
      <div styleName="column">
        <Select store={props.store} />
      </div>
      <div styleName="column">
        <List store={props.store} />
      </div>
    </div>
  );
}

Analysis.propTypes = {
  store: React.PropTypes.object.isRequired,
};

export default cssmodules(observer(Analysis), styles);
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但它确实有效,并且不会触发任何错误.

  • 你知道为什么做出这个选择吗?能够注释类和方法而不是函数看起来很奇怪。 (3认同)
  • 这是正确的,装饰器提议没有函数装饰器的概念,只有类和属性装饰器.所以这确实是装饰器功能组件的惯用方法(它适用于类以及btw) (2认同)