Comment éviter no-param-reassign lors de la configuration d'une propriété sur un objet DOM
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 ESLint jeter un no-param-reassign
erreur:
erreur d'Affectation de paramètre de la fonction " el " non-param-réaffecter
Comment puis-je manipuler un objet DOM passé en argument tout en se conformant au style de code D'AirBnB?
Quelqu'un a suggéré utilisez /* eslint react/prop-types: 0 */
en faisant référence à un autre problème mais si Je ne me trompe pas cela s'applique bien pour react, mais pas pour la manipulation DOM native.
aussi je ne pense pas que changer le style de code est 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 à un abus d'un style de code majeur comme Airbn's.
pour info, J'ai demandé à AirBnB GitHub, ce qu'ils pensent est la voie à suivre dans ces cas dans le numéro #766 .
9 réponses
comme @Mathletics suggère, vous pouvez désactiver la règle entièrement en ajoutant ceci à votre .eslintrc.json
fichier:
"rules": {
"no-param-reassign": 0
}
ou vous pourriez désactiver la règle spécifiquement pour les propriétés param
"rules": {
"no-param-reassign": [2, { "props": false }]
}
sinon, vous pourriez désactiver la règle pour cette fonction
/* eslint-disable no-param-reassign */
function (el) {
el.expando = {};
}
/* eslint-enable no-param-reassign */
ou pour cette ligne seulement
function (el) {
el.expando = {}; // eslint-disable-line no-param-reassign
}
vous pourriez également consulter ce blog post sur la désactivation de la ESLint règles spécialement pour accueillir AirBnB du guide de style.
Comme cet article explique , cette règle vise à éviter la mutation de la arguments
objet . Si vous assignez à un paramètre puis essayez d'accéder à certains paramètres via l'objet arguments
, cela peut conduire à des résultats inattendus.
vous pouvez garder la règle intacte et maintenir le style AirBnB en utilisant une autre variable pour obtenir une référence à L'élément DOM et puis modifier que:
function (el) {
var theElement = el;
theElement.expando = {};
}
dans les objets JS (y compris les noeuds DOM) sont passés par référence, donc ici el
et theElement
sont des références au même noeud DOM, mais Modifier theElement
ne mute pas l'objet arguments
car arguments[0]
reste juste une référence à cet élément DOM.
cette approche est suggérée dans la documentation pour la règle :
exemples de code correct pour ce la règle:
/*eslint no-param-reassign: "error"*/
function foo(bar) {
var baz = bar;
}
personnellement, j'utiliserais simplement l'approche "no-param-reassign": ["error", { "props": false }]
quelques autres réponses mentionnées. Modifier une propriété du paramètre ne mute pas ce à quoi se réfère ce paramètre et ne devrait pas entraîner les types de problèmes que cette règle essaie d'éviter.
vous pouvez outrepasser cette règle à l'intérieur de votre fichier .eslintrc
et la désactiver pour les propriétés param comme ceci
{
"rules": {
"no-param-reassign": [2, {
"props": false
}]
},
"extends": "eslint-config-airbnb"
}
cette règle est toujours active mais ne prévient pas pour les propriétés. Plus de renseignements: http://eslint.org/docs/rules/no-param-reassign
ceux qui souhaitent désactiver cette règle de façon sélective pourraient être intéressés par une nouvelle option proposée pour la règle no-param-reassign
qui permettrait une" liste blanche " de noms d'objets pour lesquels la réaffectation des paramètres devrait être ignorée.
vous pouvez également utiliser lodash assignIn
qui mute l'objet.
assignIn(obj, { someNewObj });
vous pouvez utiliser des méthodes pour mettre à jour les données. Par exemple. "res.statut (404) "au lieu de" res.statusCode = 404"
J'ai trouvé la solution. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903
/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsFor": ["$scope"] }]*/
app.controller('MyCtrl', function($scope) {
$scope.something = true;
});
suivant la documentation :
function (el) {
const element = el
element.expando = {}
}
l'avertissement no-param-reassign
a du sens pour les fonctions communes, mais pour une boucle Array.forEach
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 m'aimez, n'aimez pas les avertissements de ronflement avec des commentaires):
someArray = someArray.map((_item) => {
let item = Object.assign({}, item); // decouple instance
item.foo = "bar"; // assign a property
return item; // replace original with new instance
});
vous pouvez utiliser:
(param) => {
const data = Object.assign({}, param);
data.element = 'some value';
}