У меня есть метод, основная цель которого - установить свойство объекта DOM.
function (el) {
el.expando = {};
}
Я использую стиль кода AirBnB, из-за которого ESLint выдает no-param-reassign
ошибку:
ошибка Присваивание параметру функции 'el' no-param-reassign
Как я могу управлять объектом DOM, переданным в качестве аргумента, в соответствии со стилем кода AirBnB?
Кто-то предложил использовать /* eslint react/prop-types: 0 */
ссылку на другую проблему, но, если я не ошибаюсь, это хорошо подходит для реакции, но не для собственных манипуляций с DOM.
Также я не думаю, что изменение стиля кода - это ответ. Я считаю, что одним из преимуществ использования стандартного стиля является наличие согласованного кода в разных проектах, а изменение правил по желанию кажется неправильным использованием основного стиля кода, такого как AirBnB.
Для протокола, я спросил AirBnB на GitHub, что они думают о том, как поступить в этих случаях в выпуске № 766 .
источник
Ответы:
Как предлагает @Mathletics, вы можете полностью отключить правило , добавив его в свой
.eslintrc.json
файл:"rules": { "no-param-reassign": 0 }
Или вы можете отключить правило специально для свойств параметров
"rules": { "no-param-reassign": [2, { "props": false }] }
В качестве альтернативы вы можете отключить правило для этой функции
/* eslint-disable no-param-reassign */ function (el) { el.expando = {}; } /* eslint-enable no-param-reassign */
Или только для этой строки
function (el) { el.expando = {}; // eslint-disable-line no-param-reassign }
Вы также можете проверить это сообщение в блоге об отключении правил ESLint специально для соответствия руководству по стилю AirBnB.
источник
res.session
прямо сейчасКак объясняется в этой статье , это правило предназначено для предотвращения изменения
arguments
объекта . Если вы назначаете параметр, а затем пытаетесь получить доступ к некоторым параметрам черезarguments
объект, это может привести к неожиданным результатам.Вы можете сохранить правило без изменений и сохранить стиль AirBnB, используя другую переменную, чтобы получить ссылку на элемент DOM, а затем изменить ее:
function (el) { var theElement = el; theElement.expando = {}; }
В JS объекты (включая узлы DOM) передаются по ссылке, поэтому здесь
el
иtheElement
есть ссылки на один и тот же узел DOM, но изменениеtheElement
не изменяетarguments
объект, посколькуarguments[0]
остается просто ссылкой на этот элемент DOM.На этот подход намекают в документации к правилу :
/*eslint no-param-reassign: "error"*/ function foo(bar) { var baz = bar; }
Лично я бы просто использовал
"no-param-reassign": ["error", { "props": false }]
подход, упомянутый в нескольких других ответах. Изменение свойства параметра не изменяет то, на что указывает этот параметр, и не должно вызывать проблем, которых пытается избежать это правило.источник
arguments[0]
мутировал. Что я делаю не так?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Вы можете переопределить это правило внутри своего
.eslintrc
файла и отключить его для таких свойств параметров, как это{ "rules": { "no-param-reassign": [2, { "props": false }] }, "extends": "eslint-config-airbnb" }
Таким образом, правило остается активным, но не будет предупреждать о свойствах. Дополнительная информация: http://eslint.org/docs/rules/no-param-reassign
источник
no-param-reassign
Предупреждение имеет смысл для общих функций, но для классическогоArray.forEach
цикла по массиву , который вы собираетесь мутировать это не присваивать.Однако, чтобы обойти это, вы также можете использовать
Array.map
с новым объектом (если вы похожи на меня, не любите откладывать предупреждения с комментариями):someArray = someArray.map((_item) => { let item = Object.assign({}, _item); // decouple instance item.foo = "bar"; // assign a property return item; // replace original with new instance });
источник
function (el) { el.setAttribute('expando', {}); }
Все остальное - просто уродливые хаки.
источник
Те, кто желает выборочно деактивировать это правило, могут быть заинтересованы в предлагаемой новой опции для
no-param-reassign
правила, которая разрешает «белый список» имен объектов, переназначение параметров которых следует игнорировать.источник
Следуя документации :
function (el) { const element = el element.expando = {} }
источник
Вы также можете использовать lodash,
assignIn
который изменяет объект.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
источник
Вы можете использовать методы для обновления данных. Например. «res.status (404)» вместо «res.statusCode = 404»Я нашел решение. 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; });
источник
Ты можешь использовать:
(param) => { const data = Object.assign({}, param); data.element = 'some value'; }
источник
Object.assign
это для копирования из объекта в целевой объект. Попытка скопировать из такого элемента DOM приводит к пустому объекту.Object.assign
не будет работать должным образом, если вы пытаетесь повторно присвоить свойство объекта с круговыми ссылками (например, соединение сокета).Object.assign
по умолчанию это неглубокая копия, а глубокое клонирование очень не одобряется из-за снижения производительности.Если вы хотите изменить какое-либо значение внутри массива объектов, вы можете использовать
array.forEach(a => ({ ...a, expando: {} }))
источник