【问题标题】:How do I rewrite a react component with decorators as a pure function?如何将带有装饰器的 React 组件重写为纯函数?
【发布时间】:2017-01-22 03:04:49
【问题描述】:

我正在使用具有a rule that enforces stateless react components to be rewritten as a pure function 的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,
};

但是,当我将其重写为纯函数时(见下文),我收到 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,
};

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

【问题讨论】:

    标签: javascript reactjs airbnb-js-styleguide


    【解决方案1】:

    好的,问题出在 es7 风格的装饰器上。脱糖解决了这个问题:

    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);
    

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

    【讨论】:

    • 这是正确的,装饰器提案没有函数装饰器的概念,只有类和属性装饰器。所以这确实是装饰函数组件的惯用方式(顺便说一句,它也适用于类)
    • 你知道为什么会做出这个选择吗?能够注释类和方法但不能注释函数看起来很奇怪。
    猜你喜欢
    • 2016-07-17
    • 1970-01-01
    • 2014-07-21
    • 2023-03-28
    • 2014-09-20
    • 2022-09-23
    • 2019-04-30
    • 2018-04-06
    • 2013-02-10
    相关资源
    最近更新 更多