Mein Code funktioniert in der App korrekt, mein Eslint mag ihn jedoch nicht und sagt, ich solle den Auftrag nicht zurückgeben. Was ist daran falsch?
<div ref={(el) => this.myCustomEl = el} />
Mein Code funktioniert in der App korrekt, mein Eslint mag ihn jedoch nicht und sagt, ich solle den Auftrag nicht zurückgeben. Was ist daran falsch?
<div ref={(el) => this.myCustomEl = el} />
Aidan Hoolachan
Die Reparatur:
<div ref={(el) => { this.myCustomEl = el }} />
Die Erklärung:
Ihr aktueller Code entspricht:
<div ref={(el) => { return this.myCustomEl = el }} />
Sie geben das Ergebnis von this.myCustomEl = el zurück. In Ihrem Code ist dies nicht wirklich ein Problem — jedoch tritt einer der frustrierendsten Fehler beim Programmieren auf, wenn Sie versehentlich eine Zuweisung (=) anstelle eines Komparators (== oder ===) verwenden, zum Beispiel:
// This function will always return **true**, surprisingly
function isEqual(a, b) {
// The warning would be thrown here, because you probably meant to type "a===b". The below function will always return true;
return a=b;
}
let k=false;
let j=true;
if(isEqual(k,j)){
// You'll be very, very, very confused as to why this code is reached because you literally just set k to be false and j to be true, so they should be different, right? Right?
thisWillExecuteUnexpectedly();
}
Im obigen Fall ist die Compiler-Warnung sinnvoll, weil k=true
wird als wahr ausgewertet (im Gegensatz zu k===true
, was Sie wahrscheinlich eingeben wollten) und verursacht unbeabsichtigtes Verhalten. Daher bemerkt eshint, wenn Sie eine Aufgabe zurückgeben, geht davon aus, dass Sie einen Vergleich zurückgeben wollten, und weist Sie darauf hin, dass Sie vorsichtig sein sollten.
In Ihrem Fall können Sie dies lösen, indem Sie das Ergebnis einfach nicht zurückgeben, was durch Hinzufügen von einschließenden Klammern {} und ohne Rückgabeanweisung erfolgt:
<div ref={(el) => { this.myCustomEl = el }} />
Sie können die Eshint-Warnung auch wie folgt anpassen:
https://eslint.org/docs/rules/no-return-assign
Kyle Richardson
Sie geben implizit eine Aufgabe zurück. this.myCustomEl = el
ist ein Auftrag. Sie können diesen Linting-Fehler beheben, indem Sie Ihre Pfeilfunktion auf ändern (el) => { this.myCustomEl =el }
das nicht mehr implizit zurückkehrt, weil Sie es eingepackt haben {}
Anstatt von ()
.
Randnotiz: Das Deklarieren einer Pfeilfunktion inline innerhalb einer Rendermethode wird a unterbrechen PureComponent
denn jedes Mal, wenn Ihre Komponente rendert, muss sie eine neue anonyme Funktion deklarieren, also der Vergleich mit flachen Requisiten, dass a PureComponent
tut, ist dadurch kaputt und wird immer neu gerendert.
Versuchen Sie, dies zu einer Methode Ihrer Komponente zu machen.
class MyClass extends React.PureComponent {
getRef = (el) => { this.ref = el; }
render() {
return <div ref={this.getRef} />;
}
}
Wenn die obige Syntax für Sie nicht funktioniert, können Sie Folgendes verwenden:
class MyClass extends React.PureComponent {
constructor(props) {
super(props);
this.ref = null;
this.getRef = this.getRef.bind(this);
}
getRef(el) {
this.ref = el;
}
render() {
return <div ref={this.getRef} />;
}
}
Zu Ihrer Information, dieser Fehler w “Eigenschaft ‘appendChild’ von undefiniert kann nicht gelesen werden”
– AnnaSm
24. Januar 2018 um 17:00 Uhr
Sie können sehen, wie es funktioniert Code-Sandbox-Beispiel.
– Kyle Richardson
24. Januar 2018 um 19:53 Uhr
Wollte nur etwas anmerken, auf das ich gestoßen bin. Ich habe Prettier installiert und es hat immer wieder meine Eltern entfernt, was zu einem Eslint-Fehler führte: Um dies zu bestätigen, habe ich ein hübscheres Ignorieren hinzugefügt:
<div>
{/*prettier-ignore*/}
<Map
ref={(m) => {
this.leafletMap = m;
}}
center={mapCenter}
zoom={zoomLevel}
>
<TileLayer
attribution={stamenTonerAttr}
url={stamenTonerTiles}
/>
</Map>
</div>
hinzufügen
{ }
um es herum– escarello
24. Januar 2018 um 1:00 Uhr
Es ist eine Warnung, versuchen Sie es
<div ref={(el) => (this.myCustomEl = el)} />
– Jaromanda X
24. Januar 2018 um 1:01 Uhr
Gleiche Warnung. Obwohl es eine Warnung ist, kann ich Tests mit der Warnung nicht bestehen
– AnnaSm
24. Januar 2018 um 1:09 Uhr
<div ref={(el) => { this.myCustomEl = e}l} />
– escarello
24. Januar 2018 um 1:11 Uhr
@epascarello Tippfehler mit dem e}l ?
– AnnaSm
24. Januar 2018 um 1:13 Uhr