subproperty single read react property not cannot reactjs redux state setstate

reactjs - single - this setstate undefined react



Reaccionar setState no se actualiza inmediatamente (8)

Estoy trabajando en una aplicación de todo. Esta es una versión muy simplificada del código ofensivo. Tengo una casilla de verificación:

<p><input type="checkbox" name="area" checked={this.state.Pencil} onChange={this.checkPencil}/> Writing Item </p>

Aquí está la función que llama a la casilla de verificación:

checkPencil(){ this.setState({ pencil:!this.state.pencil, }); this.props.updateItem(this.state); }

updateItem es una función asignada para despachar a redux

function mapDispatchToProps(dispatch){ return bindActionCreators({ updateItem}, dispatch); }

Mi problema es que cuando llamo a la acción updateItem y console.log el estado, siempre está un paso atrás. Si la casilla de verificación no está marcada y no es verdadera, todavía obtengo el estado de verdadero que se pasa a la función updateItem. ¿Debo llamar a otra función para forzar la actualización del estado?


Ben tiene una gran respuesta sobre cómo resolver el problema inmediato, sin embargo, también recomendaría evitar duplicar el estado

Si un estado está en redux, su casilla de verificación debería estar leyendo su propio estado desde un accesorio o tienda en lugar de realizar un seguimiento del estado de verificación tanto en su propio componente como en la tienda global

Haz algo como esto:

<p> <input type="checkbox" name="area" checked={this.props.isChecked} onChange={this.props.onChange} /> Writing Item </p>

La regla general es que si encuentra que se necesita un estado en varios lugares, úselo a un padre común (no siempre redux) para mantener una sola fuente de verdad


Cuando actualiza su estado utilizando una propiedad del estado actual, la documentación de React le recomienda utilizar la versión de llamada de función de setState lugar del objeto.

Entonces setState((state, props) => {...}) lugar de setState(object) .

La razón es que setState es más una solicitud para que el estado cambie en lugar de un cambio inmediato. React setState por lotes esas llamadas de setState para mejorar el rendimiento.

Lo que significa que la propiedad del estado que está comprobando podría no ser estable. Este es un peligro potencial a tener en cuenta.

Para obtener más información, consulte la documentación aquí: https://facebook.github.io/react/docs/react-component.html#setstate

Para responder a su pregunta, haría esto.

checkPencil(){ this.setState((prevState) => { return { pencil: !prevState.pencil }; }, () => { this.props.updateItem(this.state) }); }


Debe invocar su segunda función como devolución de llamada a setState, ya que setState ocurre de forma asincrónica. Algo como:

this.setState({pencil:!this.state.pencil}, myFunction)

Sin embargo, en su caso, ya que desea que se llame a esa función con un parámetro, tendrá que ser un poco más creativo y quizás crear su propia función que llame a la función en los accesorios:

myFunction = () => { this.props.updateItem(this.state) }

Combina esos juntos y debería funcionar.


Es porque sucede de forma asincrónica , por lo que en ese momento podría no actualizarse aún ...

De acuerdo con la documentación de React v.16, debe usar una segunda forma de setState() que acepte una función en lugar de un objeto:

Las actualizaciones de estado pueden ser asincrónicas

React puede agrupar múltiples llamadas setState () en una única actualización para el rendimiento.

Debido a que this.props y this.state pueden actualizarse de forma asincrónica, no debe confiar en sus valores para calcular el siguiente estado.

Por ejemplo, este código puede fallar al actualizar el contador:

// Wrong this.setState({ counter: this.state.counter + this.props.increment, });

Para solucionarlo, use una segunda forma de setState () que acepte una función en lugar de un objeto. Esa función recibirá el estado anterior como primer argumento, y los accesorios en el momento en que se aplique la actualización como segundo argumento:

// Correct this.setState((prevState, props) => ({ counter: prevState.counter + props.increment }));


Llamar a setState() en React es asíncrono, por varias razones (principalmente rendimiento). Debajo de las cubiertas, React setState() múltiples llamadas para setState() en una sola mutación de estado, y luego volverá a representar el componente una sola vez, en lugar de volver a representar cada cambio de estado.

Afortunadamente, la solución es bastante simple: setState acepta un parámetro de devolución de llamada:

checkPencil(){ this.setState({ pencil:!this.state.pencil, }, function () { this.props.updateItem(this.state); }.bind(this)); }


Primero establezca su valor. Después de proceder sus trabajos.

this.setState({inputvalue: e.target.value}, function () { this._handleSubmit(); }); _handleSubmit() { console.log(this.state.inputvalue); //Do your action }


Usé las sugerencias de rossipedia y Ben Hare e hice lo siguiente:

checkPencil(){ this.setState({ pencil:!this.state.pencil, }, this.updatingItem); } updatingItem(){ this.props.updateItem(this.state) }


prueba esto

this.setState({inputvalue: e.target.value}, function () { console.log(this.state.inputvalue); this.showInputError(inputs[0].name); });

Función showInputError para validación si se usa algún formulario