Ich habe eine Methode, deren Hauptzweck darin besteht, eine Eigenschaft für ein DOM-Objekt festzulegen
function (el) {
el.expando = {};
}
Ich verwende den Code-Stil von AirBnB, wodurch ESLint einen no-param-reassign
Fehler auslöst :
Fehler Zuordnung zum Funktionsparameter 'el' no-param-Neuzuweisung
Wie kann ich ein als Argument übergebenes DOM-Objekt manipulieren und dabei den Codestil von AirBnB anpassen?
Jemand schlug vor, /* eslint react/prop-types: 0 */
auf ein anderes Problem zu verweisen, aber wenn ich mich nicht irre, gilt dies gut für die Reaktion, aber nicht für die native DOM-Manipulation.
Ich denke auch nicht, dass das Ändern des Codestils eine Antwort ist. Ich glaube, einer der Vorteile der Verwendung eines Standardstils besteht darin, dass projektübergreifender Code konsistent ist und das Ändern der Regeln nach Belieben wie ein Missbrauch eines wichtigen Codestils wie AirBnBs wirkt.
Für die Aufzeichnung habe ich AirBnB auf GitHub gefragt, was ihrer Meinung nach der richtige Weg in diesen Fällen in Ausgabe 766 ist .
quelle
Antworten:
Wie @Mathletics vorschlägt, können Sie die Regel vollständig deaktivieren, indem Sie sie Ihrer
.eslintrc.json
Datei hinzufügen :Oder Sie können die Regel speziell für param-Eigenschaften deaktivieren
Alternativ können Sie die Regel für diese Funktion deaktivieren
Oder nur für diese Zeile
Sie können auch diesen Blog-Beitrag zum Deaktivieren von ESLint-Regeln lesen, um den AirBnB-Styleguide zu berücksichtigen.
quelle
res.session
sofort Änderungen vornehmen möchtenWie in diesem Artikel erläutert , soll mit dieser Regel eine Mutation des
arguments
Objekts vermieden werden . Wenn Sie einem Parameter zuweisen und dann versuchen, über dasarguments
Objekt auf einige der Parameter zuzugreifen , kann dies zu unerwarteten Ergebnissen führen.Sie können die Regel beibehalten und den AirBnB-Stil beibehalten, indem Sie eine andere Variable verwenden, um einen Verweis auf das DOM-Element abzurufen, und dann Folgendes ändern:
In JS werden Objekte (einschließlich DOM-Knoten) als Referenz übergeben, also hier
el
undtheElement
Verweise auf denselben DOM-Knoten, aber das ÄnderntheElement
mutiert dasarguments
Objekt nicht, da esarguments[0]
nur eine Referenz auf dieses DOM-Element bleibt.Dieser Ansatz wird in der Dokumentation zur Regel angedeutet :
Persönlich würde ich nur
"no-param-reassign": ["error", { "props": false }]
einige andere Antworten verwenden. Das Ändern einer Eigenschaft des Parameters ändert nicht, worauf sich dieser Parameter bezieht, und sollte nicht auf die Art von Problemen stoßen, die diese Regel zu vermeiden versucht.quelle
arguments[0]
war mutiert. Was mache ich falsch?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Sie können diese Regel in Ihrer
.eslintrc
Datei überschreiben und für solche Parametereigenschaften deaktivierenAuf diese Weise ist die Regel weiterhin aktiv, warnt jedoch nicht vor Eigenschaften. Weitere Informationen: http://eslint.org/docs/rules/no-param-reassign
quelle
Die
no-param-reassign
Warnung ist für allgemeine Funktionen sinnvoll, aber für eine klassischeArray.forEach
Schleife über ein Array, das Sie mutieren möchten, ist sie nicht geeignet.Um dies zu
Array.map
umgehen , können Sie es jedoch auch mit einem neuen Objekt verwenden (wenn Sie wie ich sind, mögen Sie es nicht, Warnungen mit Kommentaren zu dösen):quelle
Alles andere sind nur hässliche Hacks.
quelle
Diejenigen, die diese Regel selektiv deaktivieren möchten, könnten an einer vorgeschlagenen neuen Option für die
no-param-reassign
Regel interessiert sein , die eine "weiße Liste" von Objektnamen ermöglicht, in Bezug auf die die Neuzuweisung von Parametern ignoriert werden sollte.quelle
Befolgen Sie die Dokumentation :
quelle
Sie können auch lodash verwenden,
assignIn
das das Objekt mutiert.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
quelle
Sie können Methoden zum Aktualisieren von Daten verwenden. Z.B. "res.status (404)" anstelle von "res.statusCode = 404"Ich habe die Lösung gefunden. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903quelle
Sie können verwenden:
quelle
Object.assign
dient es zum Kopieren von einem Objekt auf ein Zielobjekt. Der Versuch, aus einem solchen DOM-Element zu kopieren, führt zu einem leeren Objekt.Object.assign
funktioniert nicht ordnungsgemäß, wenn Sie versuchen, eine Eigenschaft für Object mit Zirkelverweisen (z. B. eine Socket-Verbindung) neu zuzuweisen.Object.assign
Standardmäßig handelt es sich um eine flache Kopie, und das tiefe Klonen ist aufgrund des Leistungseinbruchs sehr verpönt.Wenn Sie einen Wert innerhalb eines Objektarrays ändern möchten, können Sie verwenden
quelle