Eu gostaria de saber como alternar um estado booleano de um componente de reação. Por exemplo:
Eu tenho o estado booleano verificado no construtor do meu componente:
constructor(props, context) {
super(props, context);
this.state = {
check: false
};
};
Estou tentando alternar o estado cada vez que minha caixa de seleção é clicada, usando o método this.setState:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !check.value})}/> Checkbox </label>
É claro que recebo um ReferenceError não capturado: a verificação não está definida . Então, como posso conseguir isso?
Muito obrigado antecipadamente.
javascript
reactjs
reactjs-flux
novato
fonte
fonte
this.state.check
emthis.setState({check: !check.value})
. E adicione a propriedade marcada para a caixa de seleção, que mudaria de acordo com o estado do componente.checked={this.state.checked}
Respostas:
Como ninguém postou isso, estou postando a resposta correta. Se sua nova atualização de estado depende do estado anterior, sempre use a forma funcional
setState
que aceita como argumento uma função que retorna um novo estado.No seu caso:
this.setState(prevState => ({ check: !prevState.check }));
Veja a documentação
Uma vez que esta resposta está se tornando popular, adicionando a abordagem que deve ser usada para React Hooks (v16.8 +):
Se você estiver usando o
useState
gancho, use o seguinte código (caso seu novo estado dependa do estado anterior):const [check, setCheck] = useState(false); // ... setCheck(prevCheck => prevCheck + 1);
fonte
this.setState({check: !this.state.check})
?increment = () => this.setState({count: this.state.count + 1});
e um bloco de código:increment(); increment(); increment();
Agora, a reação pode agrupar isso em algo análogo a:setNewState = (oldState) => { newState.count = oldState.count + 1; newState.count = oldState.count + 1; newState.count = oldState.count + 1; return newState; }
Veja onde está o problema?Você deve usar em
this.state.check
vez decheck.value
aqui:this.setState({check: !this.state.check})
Mas, de qualquer maneira, é uma má prática fazer dessa maneira. É muito melhor movê-lo para um método separado e não escrever retornos de chamada diretamente na marcação.
fonte
setState
é assíncrono . Veja minha resposta abaixo.Use
checked
para obter o valor. DuranteonChange
,checked
serátrue
e será uma espécie deboolean
.Espero que isto ajude!
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>
fonte
Aqui está um exemplo usando ganchos (requer 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>
fonte
Você também pode usar o
useState
gancho do React para declarar o estado local de um componente de função. O estado inicial da variáveltoggled
foi passado como um argumento para o 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
fonte
Experimentar:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !this.state.check.value})}/> Checkbox </label>
Usar
check: !check.value
significa que está procurando ocheck
objeto, que você não declarou.Você precisa especificar que deseja o valor oposto de
this.state.check
.fonte
Achei isso mais simples ao alternar os valores booleanos. Simplificando, se o valor já for verdadeiro, ele o definirá como falso e vice-versa. Cuidado com os erros indefinidos, certifique-se de que sua propriedade foi definida antes de executar
this.setState({ propertyName: this.propertyName = !this.propertyName });
fonte
Dependendo do seu contexto; isso permitirá que você atualize o estado com a função mouseEnter. De qualquer maneira, ao definir um valor de estado para true: false, você pode atualizar esse valor de estado dado qualquer função, definindo-o para o valor oposto com
!this.state.variable
state = { hover: false } onMouseEnter = () => { this.setState({ hover: !this.state.hover }); };
fonte
Eu fui parar nesta página quando estou procurando usar o estado de alternância no componente React usando Redux, mas não encontro aqui nenhuma abordagem usando o mesmo.
Então, acho que pode ajudar alguém que estava lutando para implementar estado de alternância usando Redux.
Meu arquivo redutor vai aqui. Eu obtenho o estado inicial falso por padrão.
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; };
Eu mudo de estado clicando na imagem. Então, minha tag img vai aqui com a função onClick.
<img onClick={togglePopup} src={props.currentUser.image} className="avatar-image avatar-image--icon" />
Minha função Toggle Popup vai abaixo, que chama o Dispatcher.
const togglePopup = ev => { ev.preventDefault(); props.handlePopup(!props.popup); };
Essa chamada vai para a função mapDispatchToProps que reflete de volta o estado alternado.
const mapDispatchToProps = dispatch => ({ handlePopup: value => dispatch({ type: "POPUP", value }) });
Obrigado.
fonte