Saya memiliki metode yang tujuan utamanya adalah menyetel properti pada objek DOM
function (el) {
el.expando = {};
}
Saya menggunakan gaya kode AirBnB yang membuat ESLint membuat no-param-reassign
kesalahan:
error Assignment to function parameter 'el' no-param-reassign
Bagaimana cara memanipulasi objek DOM yang diteruskan sebagai argumen sambil menyesuaikan gaya kode AirBnB?
Seseorang menyarankan untuk menggunakan /* eslint react/prop-types: 0 */
merujuk ke masalah lain tetapi jika saya tidak salah, ini berlaku dengan baik untuk bereaksi, tetapi tidak untuk manipulasi DOM asli.
Saya juga tidak berpikir mengubah gaya kode adalah sebuah jawaban. Saya percaya salah satu manfaat menggunakan gaya standar adalah memiliki kode yang konsisten di seluruh proyek dan mengubah aturan sesuka hati terasa seperti penyalahgunaan gaya kode utama seperti milik AirBnB.
Sebagai catatan, saya bertanya pada AirBnB di GitHub, menurut mereka apa yang harus dilakukan dalam kasus ini di edisi # 766 .
sumber
Jawaban:
Seperti yang disarankan @Mathletics, Anda dapat menonaktifkan aturan sepenuhnya dengan menambahkan ini ke
.eslintrc.json
file Anda :"rules": { "no-param-reassign": 0 }
Atau Anda dapat menonaktifkan aturan khusus untuk properti param
"rules": { "no-param-reassign": [2, { "props": false }] }
Atau, Anda dapat menonaktifkan aturan untuk fungsi itu
/* eslint-disable no-param-reassign */ function (el) { el.expando = {}; } /* eslint-enable no-param-reassign */
Atau hanya untuk jalur itu
function (el) { el.expando = {}; // eslint-disable-line no-param-reassign }
Anda juga dapat melihat posting blog ini tentang menonaktifkan aturan ESLint secara khusus untuk mengakomodasi panduan gaya AirBnB.
sumber
res.session
langsung memodifikasinyaSeperti yang dijelaskan artikel ini , aturan ini dimaksudkan untuk menghindari mutasi
arguments
objek . Jika Anda menetapkan ke parameter dan kemudian mencoba dan mengakses beberapa parameter melaluiarguments
objek, ini dapat menyebabkan hasil yang tidak diharapkan.Anda bisa menjaga aturan tetap utuh dan mempertahankan gaya AirBnB dengan menggunakan variabel lain untuk mendapatkan referensi ke elemen DOM dan kemudian mengubahnya:
function (el) { var theElement = el; theElement.expando = {}; }
Dalam objek JS (termasuk node DOM) diteruskan oleh referensi, jadi di sini
el
dantheElement
adalah referensi ke node DOM yang sama, tetapi memodifikasitheElement
tidak mengubaharguments
objek karenaarguments[0]
tetap hanya referensi ke elemen DOM tersebut.Pendekatan ini diisyaratkan dalam dokumentasi untuk aturan tersebut :
/*eslint no-param-reassign: "error"*/ function foo(bar) { var baz = bar; }
Secara pribadi, saya hanya akan menggunakan
"no-param-reassign": ["error", { "props": false }]
pendekatan beberapa jawaban lain yang disebutkan. Memodifikasi properti parameter tidak mengubah apa yang dirujuk parameter tersebut dan tidak boleh mengalami jenis masalah yang coba dihindari aturan ini.sumber
arguments[0]
dimutasi. Apa yang saya lakukan salah?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Anda dapat mengganti aturan ini di dalam
.eslintrc
file Anda dan menonaktifkannya untuk properti param seperti ini{ "rules": { "no-param-reassign": [2, { "props": false }] }, "extends": "eslint-config-airbnb" }
Aturan cara ini masih aktif tetapi tidak akan memperingatkan untuk properti. Info lebih lanjut: http://eslint.org/docs/rules/no-param-reassign
sumber
The
no-param-reassign
peringatan masuk akal untuk fungsi-fungsi umum, tapi untuk klasikArray.forEach
loop atas sebuah array yang Anda berniat untuk bermutasi itu tidak untuk tepat.Namun, untuk menyiasati ini, Anda juga dapat menggunakan
Array.map
dengan objek baru (jika Anda seperti saya, tidak suka menunda peringatan dengan komentar):someArray = someArray.map((_item) => { let item = Object.assign({}, _item); // decouple instance item.foo = "bar"; // assign a property return item; // replace original with new instance });
sumber
function (el) { el.setAttribute('expando', {}); }
Yang lainnya hanyalah peretasan yang jelek.
sumber
Mereka yang ingin menonaktifkan aturan ini secara selektif mungkin tertarik dengan opsi baru yang diusulkan untuk
no-param-reassign
aturan yang akan memungkinkan "daftar putih" nama objek sehubungan dengan penugasan ulang parameter mana yang harus diabaikan.sumber
Berikut dokumentasinya :
function (el) { const element = el element.expando = {} }
sumber
Anda juga bisa menggunakan lodash
assignIn
yang mengubah objek.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
sumber
Anda dapat menggunakan metode untuk memperbarui data. Misalnya. "res.status (404)" alih-alih "res.statusCode = 404"Saya menemukan solusinya. 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; });
sumber
Kamu bisa memakai:
(param) => { const data = Object.assign({}, param); data.element = 'some value'; }
sumber
Object.assign
untuk menyalin dari sebuah objek ke objek target. Mencoba menyalin dari elemen DOM seperti itu menghasilkan objek kosong.Object.assign
tidak akan berfungsi dengan baik jika Anda mencoba untuk menilai kembali properti di Objek dengan referensi melingkar (koneksi soket misalnya).Object.assign
secara default adalah salinan yang dangkal, dan kloning yang dalam sangat tidak disukai karena kinerja yang buruk.Jika Anda ingin mengubah nilai apa pun di dalam larik objek, Anda dapat menggunakan
array.forEach(a => ({ ...a, expando: {} }))
sumber