【问题标题】:how to solve the ` Component should be written as a pure function ` error in eslint-react?如何解决 eslint-react 中的`组件应该写成纯函数`错误?
【发布时间】:2016-06-20 17:37:26
【问题描述】:
class Option extends React.Component {
  constructor(props) {
    super(props);
    this.handleClickOption = this.handleClickOption.bind(this);
  }
  handleClickOption() {
    // some code
  }
  render() {
    return (
      <li onClick={this.handleClickOption}>{this.props.option}</li>
    );
  }
}

我使用eslint-config-airbnb 来检查上面的代码,它向我显示了一个错误消息,例如Component should be written as a pure function

那么如何把上面的组件改成纯函数呢?

感谢您的帮助。

【问题讨论】:

    标签: reactjs eslint


    【解决方案1】:

    React 0.14 引入了纯函数组件。

    这应该是所有无状态组件的首选。

    function Option({ onClick, option }) {
        return (
            <li onClick={onClick}>
                {option}
            </li>
        );
    }
    

    【讨论】:

    • 有一个不同之处在于点击处理程序是问题中组件的一部分。
    • 大多数时候最好在更高级别定义点击处理程序。或者,您可以在同一个文件中将其作为一个单独的函数。
    【解决方案2】:

    在 ES6 中你可能会做类似这样的事情:

    const Options = (props) => {
    
        const handleClickOption = () => {
            // some code
        }
    
        return (
            <li onClick={handleClickOption}>{props.myOptionsListItem}</li>
        );
    };
    
    Options.propTypes = {
        // validate props
    };
    
    export default Options;
    

    【讨论】:

    • 与您的特定解决方案无关,但更多的是对这种编码风格的一般回应:我不明白。为什么每次应该渲染组件时都创建一个新的handleClickOption,而不是一个原型对象,它们都将共享相同的函数引用但每次执行使用不同的上下文?似乎 JS 引擎臃肿...
    • 它对我来说很好用:我投票给这个@John Meyer
    • 你引用“Option”,然后导出“Options”对吗?
    【解决方案3】:

    无状态功能组件将受益于未来针对这些组件的 React 性能优化。 以下是我们可以将组件编写为纯函数的方式:

    const App = () => {
      return (
        <div>
          <h2 id="heading">Hello ReactJS </h2>
          <header />
        </div>
      );
    };
    
    export default App;

    然而,如果你想以 ES6 风格编写组件,你仍然可以这样做,但在这种情况下,需要删除 eslint 错误(如果你使用的是 eslint)。 .eslintrc 文件中的以下更改

    例如:

    "rules": {
        "react/prefer-stateless-function": "off"
    }

    那么这里可以使用 eslint enable 编写 ES6 风格的组件:

    import React, { Component } from 'react';
    
    class Home extends Component {
      render() {
        return (
          <header className="header">
            <h1>Home page</h1>
          </header>
        );
      }
    }
    
    export default Home;

    【讨论】:

      【解决方案4】:

      这意味着您在没有构造的情况下在 react 中声明有状态组件。场景可以是这样的

      import React, { Component } from 'react';
      
      class Something extends Component {
         render() {
            return (
              <div>Your classes</div>
            )
         }
      }
      

      上面的代码是错误的,所以正确的代码应该是这样的

      class Something extends Component {
      
         constructor(props) {
            super(props);
            this.props = props;
         }
      
         render() {
            return (
              <div>Your classes</div>
            )
         }
      }
      

      【讨论】:

        【解决方案5】:

        我也有类似的问题。有谁知道如何在传递的点击函数中调用组件特定的道具。

        例如

        function ElementRow({onClick, element, key}) {
          return (
            <tr key={key}>
              <td><a href="#" onClick={onClick}>Delete</a></td>
              <td>
                ...
              <td>{ element.first } { element.last }</td>
            </tr>
          );
        }
        

        onClick 函数内部,我需要element.id。我正在寻找不使用bind()的解决方案

        我知道如何让它与 React.createClassextend React.Component 一起工作,但不是作为纯函数编写的。

        编辑:找到了解决方案,但我不确定这是否是代码异味。 :)

        function ElementRow({ onClick, element, key }) {
          const _onClick = (e) => {
            onClick(e, element.id);
          };
        
          return (
            <tr key={key}>
              <td><a href="#" onClick={_onClick}>Delete</a></td>
              <td>
                ...
              </td>
              <td>{ element.first } { element.last }</td>
            </tr>
          );
        }
        

        【讨论】:

        • 在这种情况下,您不妨内联函数onClick={(event) =&gt; onClick(event, element.id)}。或者考虑在更高级别(即父组件)定义 onClick 事件。将来,如果您有任何问题,请创建一个新主题,而不是在现有主题上添加一个问题。
        • 你说得对,下次我会开始一个新线程,我不确定。在这种情况下,onClick 是通过父组件的道具传递的。我认为用一个完整且更具描述性的示例开始一个新线程是值得的。
        猜你喜欢
        • 2016-10-02
        • 2019-05-03
        • 2017-07-14
        • 2017-09-08
        • 2020-10-30
        • 2019-03-30
        • 2022-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多