主な目的は、DOMオブジェクトにプロパティを設定することです
function (el) {
el.expando = {};
}
ESLintがno-param-reassign
エラーをスローするAirBnBのコードスタイルを使用します。
エラーパラメータ 'el'への割り当てno-param-reassign
AirBnBのコードスタイルを適合させながら、引数として渡されたDOMオブジェクトを操作するにはどうすればよいですか?
誰かが 別の問題 を参照して/* eslint react/prop-types: 0 */
を使用することを提案しましたが、私が間違っていない場合、これは反応にうまく適用されますが、ネイティブDOM操作には適用されません。
また、コードのスタイルを変更することが答えだとは思いません。標準スタイルを使用する利点の1つは、プロジェクト全体で一貫したコードを持つことと、ルールを自由に変更することは、AirBnBのような主要なコードスタイルの誤用のように感じると思います。
記録のために、私はGitHubでAirBnBに尋ねました。彼らはこれらのケースで進むべき方法だと思います 問題#766 。
@Mathleticsが示唆するように、これを.eslintrc.json
ファイルに追加することで、完全に ルールを無効化 できます:
"rules": {
"no-param-reassign": 0
}
または、paramプロパティ専用のルールを無効にすることもできます
"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
}
また、AirBnBのスタイルガイドに対応するためにESLintルールを無効にすることについて、これを確認することもできます ブログ投稿 。
この記事では説明しています のように、このルールは arguments
オブジェクト の変更を避けるためのものです。パラメーターに割り当てた後、arguments
オブジェクトを介していくつかのパラメーターにアクセスしようとすると、予期しない結果が生じる可能性があります。
別の変数を使用してDOM要素への参照を取得し、それを変更することで、ルールをそのまま維持し、AirBnBスタイルを維持できます。
function (el) {
var theElement = el;
theElement.expando = {};
}
JSオブジェクト(DOMノードを含む)は参照によって渡されるため、ここでel
とtheElement
は同じDOMノードへの参照ですが、arguments[0]
はそのDOM要素への参照のままなので、theElement
を変更してもarguments
オブジェクトは変更されません。
このアプローチは ルールのドキュメント で示唆されています:
このルールの正しいコードの例:
/*eslint no-param-reassign: "error"*/
function foo(bar) {
var baz = bar;
}
個人的に、私は"no-param-reassign": ["error", { "props": false }]
アプローチを他のいくつかの答えに言及して使用します。パラメーターのプロパティを変更しても、そのパラメーターが参照するものが変更されることはなく、このルールが回避しようとしている種類の問題に遭遇するべきではありません。
.eslintrc
ファイル内でこのルールをオーバーライドし、このようなparamプロパティに対して無効にすることができます
{
"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
});
このルールを選択的に無効にする場合は、パラメータの再割り当てを無視するオブジェクト名の「ホワイトリスト」を許可するno-param-reassign
ルールの 提案された新しいオプション に関心があるかもしれません。
オブジェクトを変更するlodash assignIn
を使用することもできます。 assignIn(obj, { someNewObj });
データを更新するためのメソッドを使用できます。例えば。 「res.statusCode = 404」ではなく「res.status(404)」 私は解決策を見つけました。 https://github.com/eslint/eslint/issues/6505#issuecomment-2823259
/*eslint no-param-reassign: ["error", { "props": true, "ignorePropertyModificationsFor": ["$scope"] }]*/
app.controller('MyCtrl', function($scope) {
$scope.something = true;
});
ドキュメント の後に:
function (el) {
const element = el
element.expando = {}
}