Ocasionalmente tengo componentes de reacción que tienen un estado conceptual que quiero restablecer. El comportamiento ideal sería equivalente a eliminar el componente antiguo y leer un componente nuevo y prístino.
React proporciona un método setState
que permite establecer el propio estado explícito de los componentes, pero que excluye el estado implícito, como el enfoque del navegador y el estado del formulario, y también excluye el estado de sus hijos. Capturar todo ese estado indirecto puede ser una tarea complicada, y prefiero resolverlo de manera rigurosa y completa en lugar de jugar a whack-a-mole con cada nuevo estado sorprendente.
¿Existe una API o patrón para hacer esto?
Editar: hice un ejemplo trivial que demuestra el this.replaceState(this.getInitialState())
enfoque y lo contrasta con el this.setState(this.getInitialState())
enfoque: jsfiddle - replaceState
es más robusto.
key
en este caso).replaceState()
ygetInitialState()
son a la vez obsoleto en los nuevos reactjs ES6-estilo de clase. Úselo en suthis.setState(this._getInitialState())
lugar. Además, no puede nombrar su propia función de inicializador de estadogetInitialState()
: reaccionar arroja una advertencia, llámelo de cualquier otra manera y hágalo explícitamentestate = this._getInitialState()
en el nivel superior de la clase.En realidad, debería evitarlo
replaceState
y utilizarlosetState
en su lugar.Los documentos dicen que
replaceState
"puede eliminarse por completo en una versión futura de React". Creo que definitivamente se eliminará porquereplaceState
realmente no concuerda con la filosofía de React. Facilita hacer que un componente de React comience a sentirse como un cuchillo suizo. Esto contrarresta el crecimiento natural de un componente de React de volverse más pequeño y más hecho a propósito.En React, si tiene que pecar de generalización o especialización: apunte a la especialización. Como corolario, el árbol de estado de su componente debe tener cierta parsimonia (sin embargo, está bien romper con buen gusto esta regla si está construyendo un nuevo producto flamante).
De todos modos así es como lo haces. Similar a la respuesta de Ben (aceptada) anterior, pero así:
Además (como también dijo Ben) para restablecer el "estado del navegador", debe eliminar ese nodo DOM. Aproveche el poder del vdom y use un nuevo
key
accesorio para ese componente. El nuevo render reemplazará ese componente al por mayor.Referencia: https://facebook.github.io/react/docs/component-api.html#replacestate
fuente
this.replaceState
? Porque lo es.getInitialState()
(digamos, en un controlador onClick). En este caso, esa nueva propiedad aún estaría presente después del 2dogetInitialState()
.getInitialState
. Al igual que declarar todas sus variables en una función JS en la parte superior de la función. Nota al margen: la solución de Ben Alpert es casi idéntica a la mía ... ¡y él es un mantenedor oficial de React!Agregar un
key
atributo al elemento que necesita reinicializar, lo recargará cada vez que elprops
ostate
asociado al elemento cambie.Aquí hay un ejemplo:
fuente