Me gustaría saber cómo alternar un estado booleano de un componente de reacción. Por ejemplo:
Tengo una verificación de estado booleana en el constructor de mi componente:
constructor(props, context) {
super(props, context);
this.state = {
check: false
};
};
Estoy tratando de alternar el estado cada vez que se hace clic en mi casilla de verificación, usando el método this.setState:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !check.value})}/> Checkbox </label>
Por supuesto que tengo un error de referencia no detectado: la verificación no está definida . Entonces, ¿cómo puedo lograr esto?
Muchas gracias de antemano.
javascript
reactjs
reactjs-flux
novato
fuente
fuente
this.state.check
enthis.setState({check: !check.value})
. Y agregue la propiedad marcada para la casilla de verificación, que cambiaría según el estado del componente.checked={this.state.checked}
Respuestas:
Como nadie publicó esto, estoy publicando la respuesta correcta. Si la actualización de su nuevo estado depende del estado anterior, utilice siempre la forma funcional
setState
que acepta como argumento una función que devuelve un nuevo estado.En tu caso:
this.setState(prevState => ({ check: !prevState.check }));
Ver documentos
Dado que esta respuesta se está volviendo popular, agregando el enfoque que debería usarse para React Hooks (v16.8 +):
Si está utilizando el
useState
gancho, utilice el siguiente código (en caso de que su nuevo estado dependa del estado anterior):const [check, setCheck] = useState(false); // ... setCheck(prevCheck => prevCheck + 1);
fuente
this.setState({check: !this.state.check})
?increment = () => this.setState({count: this.state.count + 1});
y un bloque de código:increment(); increment(); increment();
Ahora, react puede agruparlos en algo análogo a: ¿setNewState = (oldState) => { newState.count = oldState.count + 1; newState.count = oldState.count + 1; newState.count = oldState.count + 1; return newState; }
Ves dónde está el problema?Deberías usar en
this.state.check
lugar decheck.value
aquí:this.setState({check: !this.state.check})
Pero de todos modos es una mala práctica hacerlo de esta manera. Es mucho mejor moverlo a un método separado y no escribir devoluciones de llamada directamente en el marcado.
fuente
setState
es asíncrono . Vea mi respuesta a continuación.Utilice
checked
para obtener el valor. DuranteonChange
,checked
serátrue
y será un tipo deboolean
.¡Espero que esto ayude!
class A extends React.Component { constructor() { super() this.handleCheckBox = this.handleCheckBox.bind(this) this.state = { checked: false } } handleCheckBox(e) { this.setState({ checked: e.target.checked }) } render(){ return <input type="checkbox" onChange={this.handleCheckBox} checked={this.state.checked} /> } } ReactDOM.render(<A/>, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="app"></div>
fuente
Aquí hay un ejemplo usando ganchos (requiere React> = 16.8.0)
// import React, { useState } from 'react'; const { useState } = React; function App() { const [checked, setChecked] = useState(false); const toggleChecked = () => setChecked(value => !value); return ( <input type="checkbox" checked={checked} onChange={toggleChecked} /> ); } const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement);
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div id="root"><div>
fuente
También puede usar el
useState
gancho de React para declarar el estado local de un componente de función. El estado inicial de la variabletoggled
se ha pasado como argumento al método.useState
.import { render } from 'react-dom'; import React from "react"; type Props = { text: string, onClick(event: React.MouseEvent<HTMLButtonElement>): void, }; export function HelloWorldButton(props: Props) { const [toggled, setToggled] = React.useState(false); // returns a stateful value, and a function to update it return <button onClick={(event) => { setToggled(!toggled); props.onClick(event); }} >{props.text} (toggled: {toggled.toString()})</button>; } render(<HelloWorldButton text='Hello World' onClick={() => console.log('clicked!')} />, document.getElementById('root'));
https://stackblitz.com/edit/react-ts-qga3vc
fuente
Tratar:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !this.state.check.value})}/> Checkbox </label>
Usar
check: !check.value
significa que está buscando elcheck
objeto, que no ha declarado.Debe especificar que desea el valor opuesto de
this.state.check
.fuente
Encontré que esto es lo más simple al alternar valores booleanos. En pocas palabras, si el valor ya es verdadero, lo establece en falso y viceversa. Tenga cuidado con los errores no definidos, asegúrese de que su propiedad esté definida antes de ejecutar
this.setState({ propertyName: this.propertyName = !this.propertyName });
fuente
Dependiendo de su contexto; esto le permitirá actualizar el estado dada la función mouseEnter. De cualquier manera, al establecer un valor de estado en verdadero: falso, puede actualizar ese valor de estado dada cualquier función estableciéndolo en el valor opuesto con
!this.state.variable
state = { hover: false } onMouseEnter = () => { this.setState({ hover: !this.state.hover }); };
fuente
Llegué a esta página cuando estaba buscando usar el estado de alternancia en el componente React usando Redux, pero no encuentro aquí ningún enfoque que use el mismo.
Entonces, creo que podría ayudar a alguien que estaba luchando por implementar el estado de alternancia usando Redux.
Mi archivo reductor va aquí. Obtengo el estado inicial falso por defecto.
const INITIAL_STATE = { popup: false }; export default (state = INITIAL_STATE, action) => { switch (action.type) { case "POPUP": return { ...state, popup: action.value }; default: return state; } return state; };
Cambio de estado al hacer clic en la imagen. Entonces, mi etiqueta img va aquí con la función onClick.
<img onClick={togglePopup} src={props.currentUser.image} className="avatar-image avatar-image--icon" />
Mi función Toggle Popup va a continuación, que llama a Dispatcher.
const togglePopup = ev => { ev.preventDefault(); props.handlePopup(!props.popup); };
Esta llamada va a la siguiente función mapDispatchToProps que refleja el estado activado.
const mapDispatchToProps = dispatch => ({ handlePopup: value => dispatch({ type: "POPUP", value }) });
Gracias.
fuente