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 .

49
demandé sur Community 2016-02-25 23:35:42

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.

64
répondu sfletche 2018-06-25 04:59:49

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.

22
répondu Useless Code 2017-02-22 18:51:21

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

18
répondu Gyandeep 2016-02-26 01:23:40

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.

2
répondu RH Becker 2016-12-09 22:26:38

vous pouvez également utiliser lodash assignIn qui mute l'objet. assignIn(obj, { someNewObj });

https://lodash.com/docs/4.17.2#assignIn

0
répondu Jazzy 2016-12-12 23:32:57

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;
});
0
répondu Viktor Antishov 2017-03-09 11:00:43

suivant la documentation :

function (el) {
  const element = el
  element.expando = {}
}
0
répondu Victor Santos 2017-11-13 09:44:06

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
});
0
répondu Justus Romijn 2018-05-15 09:35:05

vous pouvez utiliser:

(param) => {
  const data = Object.assign({}, param);
  data.element = 'some value';
}
-2
répondu Oliver 2016-12-06 03:20:30