Tengo un método cuyo objetivo principal es establecer una propiedad en un objeto DOM
function (el) {
el.expando = {};
}
Utilizo el estilo de código de AirBnB que hace que ESLint arroje un no-param-reassign
error:
error Asignación al parámetro de función 'el' no-param-reassign
¿Cómo puedo manipular un objeto DOM pasado como argumento mientras se ajusta al estilo de código de AirBnB?
Alguien sugirió usar /* eslint react/prop-types: 0 */
refiriéndose a otro problema pero si no me equivoco, esto se aplica bien para reaccionar, pero no para la manipulación DOM nativa.
Además, no creo que cambiar el estilo del código sea una respuesta. Creo que uno de los beneficios de usar un estilo estándar es tener un código consistente en todos los proyectos y cambiar las reglas a voluntad se siente como un mal uso de un estilo de código importante como el de AirBnB.
Para que conste, le pregunté a AirBnB en GitHub, cuál creen que es el camino a seguir en estos casos en el número 766 .
fuente
Respuestas:
Como sugiere @Mathletics, puede deshabilitar la regla por completo agregando esto a su
.eslintrc.json
archivo:O puede deshabilitar la regla específicamente para propiedades de parámetros
Alternativamente, puede deshabilitar la regla para esa función
O solo para esa línea
También puede consultar esta publicación de blog sobre cómo deshabilitar las reglas de ESLint específicamente para adaptarse a la guía de estilo de AirBnB.
fuente
res.session
inmediatoComo explica este artículo , esta regla está destinada a evitar la mutación del
arguments
objeto . Si asigna un parámetro y luego intenta acceder a algunos de los parámetros a través delarguments
objeto, puede generar resultados inesperados.Puede mantener la regla intacta y mantener el estilo AirBnB usando otra variable para obtener una referencia al elemento DOM y luego modificar eso:
En JS, los objetos (incluidos los nodos DOM) se pasan por referencia, por lo que aquí
el
ytheElement
son referencias al mismo nodo DOM, pero la modificacióntheElement
no muta elarguments
objeto, ya quearguments[0]
sigue siendo solo una referencia a ese elemento DOM.Este enfoque se insinúa en la documentación de la regla :
Personalmente, solo usaría el
"no-param-reassign": ["error", { "props": false }]
enfoque en un par de otras respuestas mencionadas. La modificación de una propiedad del parámetro no cambia a qué se refiere ese parámetro y no debería generar los tipos de problemas que esta regla está tratando de evitar.fuente
arguments[0]
se transformó. ¿Qué estoy haciendo mal?... theElement.expando = { p: 2 }; return arguments[0].expando; ...
.Puede anular esta regla dentro de su
.eslintrc
archivo y deshabilitarla para propiedades de parámetros como estaDe esta forma, la regla sigue activa pero no advertirá sobre las propiedades. Más información: http://eslint.org/docs/rules/no-param-reassign
fuente
La
no-param-reassign
advertencia tiene sentido para funciones comunes, pero para un clásicoArray.forEach
bucle sobre una matriz que tiene la intención de mutar, no es apropiado.Sin embargo, para evitar esto, también puede usar
Array.map
con un nuevo objeto (si es como yo, no le gusta posponer advertencias con comentarios):fuente
Todo lo demás son trucos feos.
fuente
Aquellos que deseen desactivar selectivamente esta regla podrían estar interesados en una nueva opción propuesta para la
no-param-reassign
regla que permitiría una "lista blanca" de nombres de objetos con respecto a qué reasignación de parámetros debería ignorarse.fuente
Siguiendo la documentación :
fuente
También puede usar lodash
assignIn
que muta el objeto.assignIn(obj, { someNewObj });
https://lodash.com/docs/4.17.2#assignIn
fuente
Puede utilizar métodos para actualizar datos. P.ej. "res.status (404)" en lugar de "res.statusCode = 404"encontré la solución. https://github.com/eslint/eslint/issues/6505#issuecomment-282325903fuente
Puedes usar:
fuente
Object.assign
es para copiar de un objeto a un objeto de destino. Intentar copiar de un elemento DOM como ese da como resultado un objeto vacío.Object.assign
, no funcionará correctamente si está intentando reafirmar una propiedad en un objeto con referencias circulares (una conexión de socket, por ejemplo).Object.assign
por defecto es una copia superficial, y la clonación profunda está muy mal vista debido al impacto en el rendimiento.Si desea cambiar cualquier valor dentro de una matriz de objetos, puede usar
fuente