期望'this'由类方法使用

Hin*_*tel 42 javascript ecmascript-6 reactjs eslint

在我的课堂上,eslint抱怨"预期'这个'被类方法'getUrlParams'使用

这是我的班级:

class PostSearch extends React.Component {
  constructor(props) {
    super(props);
    this.getSearchResults();
  }

  getUrlParams(queryString) {
    const hashes = queryString.slice(queryString.indexOf('?') + 1).split('&');
    const params = {};

    hashes.forEach((hash) => {
      const [key, val] = hash.split('=');
      params[key] = decodeURIComponent(val);
    });

    return params;
  }

  getSearchResults() {
    const { terms, category } = this.getUrlParams(this.props.location.search);
    this.props.dispatch(Actions.fetchPostsSearchResults(terms, category));
  }

  render() {
    return (
      <div>
        <HorizontalLine />
        <div className="container">
          <Col md={9} xs={12}>
            <h1 className="aboutHeader">Test</h1>
          </Col>
          <Col md={3} xs={12}>
            <SideBar />
          </Col>
        </div>
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

解决此问题或重构此组件的最佳方法是什么?

Ami*_*avi 26

你应该将函数绑定到thisESLint错误中"Expected 'this' to be used by class method 'getUrlParams'

getUrlParams = (queryString) => { .... }
Run Code Online (Sandbox Code Playgroud)

因为你getUrlParams在渲染期间没有使用(比如onClick()),所以上面的技术很好,我们可以称之为"类属性中箭头函数的使用".

还有其他绑定方式:

  • 绑定在构造函数中 this.getUrlParams=this.getUrlParams.bind(this)
  • 渲染中的箭头函数,例如onClick={()=>this.getUrlParams()}假设函数没有参数.
  • React.createClass与ES6没有意义:)

  • 这只会让“ESLint”认为您可能使用“this”上下文。你仍然没有使用“this”来做任何事情。该函数应设为静态或移至类之外。 (2认同)

Ioa*_*oan 16

这是一个ESlint规则,请参阅class-methods-use-this.

您可以提取方法getUrlParams并将其放入帮助程序或制作它static.

你还可以做的是移动this.props.location.search方法内部,因此调用this.getUrlParams()没有参数的方法,因为它似乎只使用它一次.

因此,这可能看起来像:

getUrlParams() {
    const queryString = this.props.location.search;
    ...
    return params;
  }
Run Code Online (Sandbox Code Playgroud)

最后一个选项是禁用此ESlint规则.

  • 但是,有谁知道 eslint 规则的要点是什么?为什么我们应该在类方法中引用“this”?我查看了这条规则的 eslint 文档,它从来没有解释为什么在类方法中*不*使用“this”是不好的。 (2认同)
  • @mojave尽管有规则的名称,但它的重点并不是你应该从类方法引用`this`,而是任何不使用`this`的方法都应该转换为静态方法,以明确方法没有做任何特定于实例的事情.还有一个有时有用的事实,即可以在不创建类的实例的情况下使用类的静态方法. (2认同)

rfd*_*fdc 10

getUrlParams = queryString => { ... }
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供此代码片段,它可能会提供一些有限的即时帮助。[正确的解释将极大地提高其长期价值](//meta.stackexchange.com/q/114762/206345),通过展示_为什么_这是问题的一个很好的解决方案,并将使其对未来的读者更有用其他类似的问题。请[编辑]您的答案以添加一些解释,包括您所做的假设。 (15认同)

Arj*_*bra 5

我的解决方案是在类之外使用此函数并将此函数绑定到类。

function getUrlParams(queryString) {
 const hashes = queryString.slice(queryString.indexOf('?') + 1).split('&');
 const params = {};
 hashes.forEach((hash) => {
  const [key, val] = hash.split('=');
  params[key] = decodeURIComponent(val);
 });
 return params;
}
class PostSearch extends React.Component {
  constructor(props) {
    super(props);
    this.getSearchResults();
    this.getUrlParams = getUrlParams.bind(this); // add this
  }

  getSearchResults() {
   const { terms, category } = this.getUrlParams(this.props.location.search);
   this.props.dispatch(Actions.fetchPostsSearchResults(terms, category));
  }
  render() {
   return (  "bla bla"  );
  }
}
Run Code Online (Sandbox Code Playgroud)