如何用decorator重写一个反应组件作为纯函数?

问题描述:

我正在使用airbnb eslint设置,其中有a rule that enforces stateless react components to be rewritten as a pure function。以下组件触发此规则,这意味着下面的部分将被更好地写成纯函数:如何用decorator重写一个反应组件作为纯函数?

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短缺规则中的错误,是不可能同时满足这两个规则的?

好的,所以问题是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); 

这并不美观,但它确实有效,并且不会触发任何错误。

+1

这是正确的,装饰者提案没有函数装饰器的概念,只有类和属性装饰器。所以这实际上是装饰器功能组件的惯用方式(它对于类也适用) – mweststrate