J'ai une méthode dont le but principal est de définir une propriété sur un objet DOM
function (el) {
el.expando = {};
}
J'utilise le style de code d'AirBnB qui fait qu'ESLint génère une no-param-reassign
erreur:
erreur Affectation au paramètre de fonction 'el' no-param-réassigner
Comment puis-je manipuler un objet DOM passé en argument tout en conformant le style de code d'AirBnB?
Quelqu'un a suggéré d'utiliser une /* eslint react/prop-types: 0 */
référence à un autre problème, mais si je ne me trompe pas, cela s'applique bien à react, mais pas à la manipulation native du DOM.
Je ne pense pas non plus que changer le style de code soit une réponse. Je pense que l'un des avantages de l'utilisation d'un style standard est d'avoir un code cohérent dans tous les projets et de changer les règles à volonté ressemble à une mauvaise utilisation d'un style de code majeur comme celui d'AirBnB.
Pour mémoire, j'ai demandé à AirBnB sur GitHub ce qu'ils pensent être la voie à suivre dans ces cas dans le numéro 766 .
la source
Réponses:
Comme @Mathletics le suggère, vous pouvez désactiver complètement la règle en l'ajoutant à votre
.eslintrc.json
fichier:Ou vous pouvez désactiver la règle spécifiquement pour les propriétés des paramètres
Vous pouvez également désactiver la règle pour cette fonction
Ou pour cette ligne seulement
Vous pouvez également consulter cet article de blog sur la désactivation des règles ESLint spécifiquement pour s'adapter au guide de style d'AirBnB.
la source
res.session
tout de suiteComme cet article l'explique , cette règle vise à éviter la mutation de l'
arguments
objet . Si vous affectez à un paramètre, puis essayez d'accéder à certains paramètres via l'arguments
objet, cela peut conduire à des résultats inattendus.Vous pouvez conserver la règle intacte et conserver le style AirBnB en utilisant une autre variable pour obtenir une référence à l'élément DOM, puis modifier cela:
Dans JS, les objets (y compris les nœuds DOM) sont passés par référence, donc ici
el
ettheElement
sont des références au même nœud DOM, mais la modificationtheElement
ne mute pas l'arguments
objet puisquearguments[0]
reste juste une référence à cet élément DOM.Cette approche est suggérée dans la documentation de la règle :
Personnellement, j'utiliserais simplement l'
"no-param-reassign": ["error", { "props": false }]
approche de quelques autres réponses mentionnées. La modification d'une propriété du paramètre ne modifie pas ce à quoi ce paramètre fait référence et ne devrait pas rencontrer les types de problèmes que cette règle tente d'éviter.la source
arguments[0]
été muté. Qu'est-ce que je fais mal?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Vous pouvez remplacer cette règle dans votre
.eslintrc
fichier et la désactiver pour des propriétés de paramètres comme celle-ciCette règle de façon est toujours active mais elle n'avertit pas les propriétés. Plus d'infos: http://eslint.org/docs/rules/no-param-reassign
la source
L'
no-param-reassign
avertissement a du sens pour les fonctions courantes, mais pour uneArray.forEach
boucle classique sur un tableau que vous avez l'intention de muter, il n'est pas approprié.Cependant, pour contourner cela, vous pouvez également utiliser
Array.map
avec un nouvel objet (si vous êtes comme moi, n'aimez pas répéter les avertissements avec des commentaires):la source
Tout le reste n'est que de vilains hacks.
la source
Ceux qui souhaitent désactiver sélectivement cette règle pourraient être intéressés par une nouvelle option proposée pour la
no-param-reassign
règle qui autoriserait une «liste blanche» de noms d'objet par rapport à la réaffectation des paramètres à ignorer.la source
Suite à la documentation :
la source
Vous pouvez également utiliser lodash
assignIn
qui mute l'objet.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
la source
Vous pouvez utiliser des méthodes pour mettre à jour les données. Par exemple. "res.status (404)" au lieu de "res.statusCode = 404"j'ai trouvé la solution. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903la source
Vous pouvez utiliser:
la source
Object.assign
s'agit de copier d'un objet vers un objet cible. Essayer de copier à partir d'un élément DOM comme celui-ci entraîne un objet vide.Object.assign
ne fonctionnera pas correctement si vous essayez de réassigner une propriété sur Object avec des références circulaires (une connexion socket par exemple).Object.assign
par défaut, il s'agit d'une copie superficielle, et le clonage profond est très mal vu en raison de la baisse des performances.Si vous souhaitez modifier une valeur dans un tableau d'objets, vous pouvez utiliser
la source