私のクラスでは、eslintが「クラスメソッド 'getUrlParams'によって使用される 'this'が予期されています」と文句を言っています。
これが私のクラスです:
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>
);
}
}
これを解決するか、このコンポーネントをリファクタリングするための最良のアプローチは何ですか?
eSLintエラーが"Expected 'this' to be used by class method 'getUrlParams'
と言うので、関数をthis
にバインドする必要があります
getUrlParams = (queryString) => { .... }
レンダリング中にgetUrlParams
を使用していないため(onClick()
など)、上記の手法は適切であり、「クラスプロパティでの矢印関数の使用」と呼ぶことができます。
バインドには他の方法もあります。
this.getUrlParams=this.getUrlParams.bind(this)
onClick={()=>this.getUrlParams()}
関数にはパラメーターがないと想定されています。React.createClass
ES6では意味がありません:)これはESlintルールです。 class-methods-use-this を参照してください。
メソッドgetUrlParams
を抽出してhelperに入れるか、static
にすることができます。
また、メソッド内でthis.props.location.search
を移動し、パラメータなしでthis.getUrlParams()
メソッドを呼び出すこともできます。1回しか使用していないようです。
したがって、これは次のようになります。
getUrlParams() {
const queryString = this.props.location.search;
...
return params;
}
最後のオプションは、このESlintルールを無効にすることです。
getUrlParams = queryString => { ... }
別のユースケースが考えられます。
handlePasswordKeyUpというメソッドがあるとします。関数の本体はこのように見ることができます。
handlePasswordKeyUp() {
console.log('yes')
}
上記のコードはそのエラーをトリガーします。したがって、少なくともbody関数内でthisを使用します
handlePasswordKeyUp(){
this.setState({someState: someValue})
}
私の解決策は、クラス外でこの関数を使用し、この関数をクラスにバインドすることです。
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" );
}
}