Eu tenho um método cujo objetivo principal é definir uma propriedade em um objeto DOM
function (el) {
el.expando = {};
}
Eu uso o estilo de código do AirBnB, o que faz o ESLint gerar um no-param-reassign
erro:
Erro de atribuição ao parâmetro de função 'el' no-param-reassign
Como posso manipular um objeto DOM passado como um argumento enquanto conforma o estilo de código do AirBnB?
Alguém sugeriu usar /* eslint react/prop-types: 0 */
referindo-se a outro problema, mas se não me engano, isso se aplica bem para reagir, mas não para manipulação de DOM nativo.
Além disso, não acho que mudar o estilo do código seja uma resposta. Acredito que um dos benefícios de usar um estilo padrão é ter um código consistente entre os projetos e alterar as regras à vontade parece um uso indevido de um estilo de código importante como o do AirBnB.
Para registro, perguntei ao AirBnB no GitHub, o que eles acham que é o caminho a seguir nesses casos na edição # 766 .
fonte
Respostas:
Como @Mathletics sugere, você pode desativar a regra inteiramente adicionando isto ao seu
.eslintrc.json
arquivo:Ou você pode desativar a regra especificamente para propriedades param
Como alternativa, você pode desativar a regra para essa função
Ou apenas para essa linha
Você também pode verificar esta postagem do blog sobre a desativação das regras ESLint especificamente para acomodar o guia de estilo do AirBnB.
fonte
res.session
imediatamenteComo este artigo explica , essa regra tem o objetivo de evitar a mutação do
arguments
objeto . Se você atribuir a um parâmetro e, em seguida, tentar acessar alguns dos parâmetros por meio doarguments
objeto, isso pode levar a resultados inesperados.Você pode manter a regra intacta e manter o estilo AirBnB usando outra variável para obter uma referência ao elemento DOM e, em seguida, modificá-lo:
Em JS, os objetos (incluindo nós DOM) são passados por referência, então aqui
el
etheElement
estão referências ao mesmo nó DOM, mas modificartheElement
não altera oarguments
objeto, poisarguments[0]
permanece apenas uma referência a esse elemento DOM.Essa abordagem é sugerida na documentação da regra :
Pessoalmente, eu usaria apenas a
"no-param-reassign": ["error", { "props": false }]
abordagem de algumas outras respostas mencionadas. Modificar uma propriedade do parâmetro não altera o que esse parâmetro se refere e não deve gerar os tipos de problemas que esta regra está tentando evitar.fonte
arguments[0]
foi mutado. O que estou fazendo de errado?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Você pode substituir esta regra dentro do seu
.eslintrc
arquivo e desativá-la para propriedades de parâmetros como esteDessa forma, a regra ainda está ativa, mas não avisará para propriedades. Mais informações: http://eslint.org/docs/rules/no-param-reassign
fonte
O
no-param-reassign
aviso faz sentido para funções comuns, mas para umArray.forEach
loop clássico sobre uma matriz que você pretende modificar, não é apropriado.No entanto, para contornar isso, você também pode usar
Array.map
com um novo objeto (se você for como eu, não gosta de adiar avisos com comentários):fonte
Todo o resto são apenas hacks feios.
fonte
Aqueles que desejam desativar esta regra seletivamente podem estar interessados em uma nova opção proposta para a
no-param-reassign
regra que permitiria uma "lista branca" de nomes de objetos com relação a quais reatribuições de parâmetros deveriam ser ignoradas.fonte
Seguindo a documentação :
fonte
Você também pode usar o lodash,
assignIn
que transforma o objeto.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
fonte
Você pode usar métodos para atualizar dados. Por exemplo. "res.status (404)" em vez de "res.statusCode = 404"Encontrei a solução. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903fonte
Você pode usar:
fonte
Object.assign
é para copiar de um objeto para um objeto de destino. Tentar copiar de um elemento DOM como esse resulta em um objeto vazio.Object.assign
, não funcionará apropriadamente se você estiver tentando reajustar uma propriedade em Object com referências circulares (uma conexão de socket, por exemplo).Object.assign
por padrão, é uma cópia superficial, e a clonagem profunda é muito desaprovada por causa do impacto no desempenho.Se você quiser alterar qualquer valor dentro de uma matriz de objeto, você pode usar
fonte