Mam metodę, której głównym celem jest ustawienie właściwości obiektu DOM
function (el) {
el.expando = {};
}
Używam stylu kodu AirBnB, co sprawia, że ESLint no-param-reassign
wyświetla błąd:
error Przypisanie do parametru funkcji „el” no-param-re assigning
Jak mogę manipulować obiektem DOM przekazanym jako argument, zachowując zgodność ze stylem kodu AirBnB?
Ktoś zasugerował użycie w /* eslint react/prop-types: 0 */
odniesieniu do innego problemu, ale jeśli się nie mylę, to odnosi się to dobrze do reagowania, ale nie do manipulacji natywnym DOM.
Nie sądzę też, żeby zmiana stylu kodu była odpowiedzią. Uważam, że jedną z zalet używania standardowego stylu jest posiadanie spójnego kodu we wszystkich projektach, a zmiana zasad do woli wydaje się być nadużyciem głównego stylu kodu, takiego jak AirBnB.
Dla przypomnienia, zapytałem AirBnB na GitHubie, co ich zdaniem jest dobrym rozwiązaniem w tych przypadkach w numerze 766 .
źródło
Odpowiedzi:
Jak sugeruje @Mathletics, możesz całkowicie wyłączyć regułę , dodając to do swojego
.eslintrc.json
pliku:"rules": { "no-param-reassign": 0 }
Możesz też wyłączyć regułę specjalnie dla właściwości parametrów
"rules": { "no-param-reassign": [2, { "props": false }] }
Alternatywnie możesz wyłączyć regułę dla tej funkcji
/* eslint-disable no-param-reassign */ function (el) { el.expando = {}; } /* eslint-enable no-param-reassign */
Albo tylko dla tej linii
function (el) { el.expando = {}; // eslint-disable-line no-param-reassign }
Możesz również zapoznać się z tym wpisem na blogu dotyczącym wyłączania reguł ESLint, aby dostosować się do przewodnika stylistycznego AirBnB.
źródło
res.session
od razuJak wyjaśnia ten artykuł , ta reguła ma na celu uniknięcie mutacji
arguments
obiektu . Jeśli przypiszesz parametr, a następnie spróbujesz uzyskać dostęp do niektórych parametrów za pośrednictwemarguments
obiektu, może to prowadzić do nieoczekiwanych wyników.Możesz zachować regułę nienaruszoną i zachować styl AirBnB, używając innej zmiennej w celu uzyskania odniesienia do elementu DOM, a następnie zmodyfikuj to:
function (el) { var theElement = el; theElement.expando = {}; }
W JS obiekty (w tym węzły DOM) są przekazywane przez odniesienie, więc tutaj
el
itheElement
są referencjami do tego samego węzła DOM, ale modyfikowanietheElement
nie powoduje mutacjiarguments
obiektu, ponieważarguments[0]
pozostaje tylko odniesieniem do tego elementu DOM.Takie podejście jest zasugerowane w dokumentacji reguły :
/*eslint no-param-reassign: "error"*/ function foo(bar) { var baz = bar; }
Osobiście użyłbym tylko
"no-param-reassign": ["error", { "props": false }]
kilku innych wymienionych odpowiedzi. Modyfikacja właściwości parametru nie powoduje mutacji tego, do czego odnosi się ten parametr i nie powinna powodować problemów, których ta reguła stara się uniknąć.źródło
Możesz nadpisać tę regułę w swoim
.eslintrc
pliku i wyłączyć ją dla takich właściwości parametrów{ "rules": { "no-param-reassign": [2, { "props": false }] }, "extends": "eslint-config-airbnb" }
W ten sposób reguła jest nadal aktywna, ale nie będzie ostrzegać o właściwościach. Więcej informacji: http://eslint.org/docs/rules/no-param-re assign
źródło
no-param-reassign
Ostrzeżenie sens dla typowych funkcji, ale za to klasycznyArray.forEach
pętli nad tablicy którym zamierzasz go zmutować nie jest właściwe.Aby jednak to obejść, możesz również użyć
Array.map
nowego obiektu (jeśli jesteś podobny do mnie, nie lubisz odkładania ostrzeżeń z komentarzami):someArray = someArray.map((_item) => { let item = Object.assign({}, _item); // decouple instance item.foo = "bar"; // assign a property return item; // replace original with new instance });
źródło
function (el) { el.setAttribute('expando', {}); }
Wszystko inne to po prostu brzydkie hacki.
źródło
Ci, którzy chcą selektywnie dezaktywować tę regułę, mogą być zainteresowani proponowaną nową opcją dla
no-param-reassign
reguły, która umożliwiłaby „białą listę” nazw obiektów, w odniesieniu do których ponowne przypisanie parametrów powinno zostać zignorowane.źródło
Zgodnie z dokumentacją :
function (el) { const element = el element.expando = {} }
źródło
Możesz także użyć lodash,
assignIn
który mutuje obiekt.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2# assignIn
źródło
Możesz użyć metod aktualizacji danych. Na przykład. „res.status (404)” zamiast „res.statusCode = 404”znalazłem rozwiązanie. 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; });
źródło
Możesz użyć:
(param) => { const data = Object.assign({}, param); data.element = 'some value'; }
źródło
Object.assign
służy do kopiowania z obiektu do obiektu docelowego. Próba skopiowania z takiego elementu DOM skutkuje pustym obiektem.Object.assign
nie będzie działać poprawnie, jeśli próbujesz ponownie przypisać właściwość Object z odwołaniami cyklicznymi (na przykład połączenie z gniazdem).Object.assign
domyślnie jest to płytka kopia, a głębokie klonowanie jest bardzo mile widziane z powodu wysokiej wydajności.Jeśli chcesz zmienić dowolną wartość w tablicy obiektów, możesz użyć
array.forEach(a => ({ ...a, expando: {} }))
źródło