Как переключить логическое состояние реагирующего компонента?
Я хотел бы знать, как переключить логическое состояние реагирующего компонента. Например:
У меня есть логическая проверка состояния в конструкторе моего компонента:
constructor(props, context) {
super(props, context);
this.state = {
check: false
};
};
Я пытаюсь переключить состояние каждый раз, когда мой флажок щелкнут, используя метод this.setState:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !check.value})}/> Checkbox </label>
Конечно, я получаю сообщение об ошибке "Нет данных": проверка не определена. Итак, как я могу это достичь?
Спасибо заранее.
Ответы
Ответ 1
Поскольку никто не опубликовал это, я отправляю правильный ответ. Если ваше новое обновление состояния зависит от предыдущего состояния, всегда используйте функциональную форму setState
которая принимает в качестве аргумента функцию, которая возвращает новое состояние.
В твоем случае:
this.setState(prevState => ({
check: !prevState.check
}));
См. Документы
Ответ 2
Вы должны использовать this.state.check
вместо check.value
здесь:
this.setState({check: !this.state.check})
Но так или иначе, это плохая практика. Гораздо лучше переместить его в отдельный метод и не писать обратные вызовы непосредственно в разметке.
Ответ 3
Используйте checked
чтобы получить значение. Во время onChange
checked
будет true
и он будет иметь тип boolean
.
Надеюсь это поможет!
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>
Ответ 4
Пытаться:
<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !this.state.check.value})}/> Checkbox </label>
Использование check: !check.value
означает, что он ищет объект check
, который вы еще не объявили.
Вам нужно указать, что вы хотите иметь противоположное значение this.state.check
.
Ответ 5
В зависимости от вашего контекста; это позволит вам обновить состояние с помощью функции mouseEnter. В любом случае, установив значение состояния на true: false, вы можете обновить это значение состояния для любой функции, установив для него противоположное значение с помощью !this.state.variable
state = {
hover: false
}
onMouseEnter = () => {
this.setState({
hover: !this.state.hover
});
};
Ответ 6
Я был приземлился на этой странице, когда я пытаюсь использовать режим переключения в компоненте React с помощью Redux, но я не нашел здесь никакого подхода, используя тот же самый.
Поэтому я думаю, что это может помочь кому-то, кто пытается реализовать режим переключения с помощью Redux.
Мой файл редуктора идет сюда. По умолчанию исходное состояние false.
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;
};
Я изменяю состояние при нажатии на изображение. Итак, мой тег img идет здесь с функцией onClick.
<img onClick={togglePopup} src={props.currentUser.image} className="avatar-image avatar-image--icon" />
Моя функция "Переключить всплывающие окна" ниже, что вызывает диспетчер.
const togglePopup = ev => {
ev.preventDefault();
props.handlePopup(!props.popup);
};
Этот вызов переходит к функции mapDispatchToProps, которая отражает обратно переключение состояния.
const mapDispatchToProps = dispatch => ({
handlePopup: value => dispatch({ type: "POPUP", value })
});
Спасибо.
Ответ 7
Я нашел это наиболее простым при переключении логических значений. Проще говоря, если значение уже истинно, оно устанавливает его в ложь и наоборот. Остерегайтесь неопределенных ошибок, убедитесь, что ваше свойство было определено перед выполнением
this.setState({
propertyName: this.propertyName = !this.propertyName
});