In meiner Klasse beschwert sich "eslint" "Erwartet, dass dieses von der Klassenmethode" getUrlParams "verwendet wird
Hier ist meine Klasse:
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>
);
}
}
Was ist der beste Ansatz, um diese Komponente zu lösen oder umzuformen?
sie sollten die Funktion an this
binden, da der ESLint-Fehler "Expected 'this' to be used by class method 'getUrlParams'
angibt.
getUrlParams = (queryString) => { .... }
da Sie getUrlParams
während des Renderns nicht verwenden (wie onClick()
), ist die obige Technik gut, die wir "Verwendung der Pfeilfunktion in der Klasseneigenschaft" nennen können.
es gibt auch andere Bindungsmöglichkeiten:
this.getUrlParams=this.getUrlParams.bind(this)
onClick={()=>this.getUrlParams()}
, davon ausgegangen, dass die Funktion keine Parameter hat.React.createClass
was mit ES6 nicht sinnvoll ist :)Dies ist eine ESlint-Regel, siehe class-Methods-use-this .
Sie können die Methode getUrlParams
extrahieren und in einen helper einfügen oder static
machen.
Sie können auch den this.props.location.search
innerhalb der Methode verschieben und daher die this.getUrlParams()
-Methode ohne Parameter aufrufen, da Sie sie anscheinend nur einmal verwenden.
Daher könnte dies so aussehen:
getUrlParams() {
const queryString = this.props.location.search;
...
return params;
}
Eine letzte Option wäre das Deaktivieren dieser ESlint-Regel.
getUrlParams = queryString => { ... }
Meine Lösung besteht darin, diese Funktion außerhalb der Klasse zu verwenden und diese Funktion an die Klasse zu binden.
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" );
}
}
Ein anderer Anwendungsfall könnte sein.
Angenommen, Sie haben eine Methode namenshandlePasswordKeyUp. Der Funktionskörper kann so gesehen werden.
handlePasswordKeyUp() {
console.log('yes')
}
Der obige Code löst diesen Fehler aus. Verwenden Sie also mindestens this innerhalb der Körperfunktion
handlePasswordKeyUp(){
this.setState({someState: someValue})
}