React sugiere no mutar accesorios. Estaba operando bajo la impresión de que cuando se pasan accesorios, serían inmutables o congelados.
El siguiente código no arroja ningún error y muta el accesorio. ¿Es esto un error?
try{ var a = this.props.a; a.push('one') a.push('two') a.push('three') console.log(a) }catch(err){ console.log(err) }No estoy seguro del razonamiento exacto detrás de esto o si eso está documentado en alguna parte, pero podría adivinar:
Congelar cualquier asignación a una variable no es fácil o incluso necesariamente posible fuera del uso de funciones de navegador nuevas o incluso aún no implementadas. Además, la congelación profunda de todos sus accesorios en su aplicación podría tener implicaciones en el rendimiento y, sin duda, debería eliminarse para las compilaciones de producción.
¿Se puede congelar la asignación de una variable primitiva? No me parece. Creo que babel lo hace con const comprobando estáticamente el código en tiempo de compilación.
¿Y puede congelar objetos sin Object.freeze o el proxy de ES7? Nuevamente, no lo creo, el archivo Léame de es5-shim dice:
que posiblemente no pueda obtener en motores heredados
¿Qué pasa si alguien muta algo? Estos accesorios se copian superficialmente, lo que significa que no afectará al accesorio principal a menos que modifique un objeto anidado. Sin embargo, incluso si lo hiciera, no afectaría a la aplicación, ya que se eliminaría en el siguiente renderizado (al igual que sus modificaciones).
Si tengo algo mal por favor házmelo saber! Este es solo mi razonamiento.
Parece que este es el mismo comportamiento que tiene const , no puede reasignar el valor, pero aún puede presionar la matriz o agregar claves a un objeto porque no están protegidos. De todos modos, a pesar de la posibilidad de hacer esas mutaciones, no deberías hacer esto.
this.props.a = [1,2,3]; no funcionará
this.props.a.push(123); trabajará.
this.props.a = {name: 'John Doe'} no funcionará
this.props.a.name = 'John Doe' funcionará
Si intenta reasignar un accesorio en su componente, se producirá un error de tipo.
TypeError no capturado: no se puede asignar a la propiedad de solo lectura un...
No arrojará ningún error a menos que congele el objeto (accesorios) explícitamente.
Los accesorios se reciben de los padres y son inmutables en lo que respecta al Componente que los recibe.
es decir, reaccionar de forma predeterminada, los props son inmutables en el sentido de que su componente se preocupa por mantenerlos como datos recibidos de los padres y usarlos tal como están. Donde podemos usar el state para mantener el local (datos de nivel de componente) que se puede cambiar en cualquier momento y mantener el contrato de accesorios con el padre.