Как переключить логическое состояние компонента react?

Я хотел бы знать, как переключать логическое состояние компонента react. Например:

у меня есть логическая проверка состояния в конструкторе моего компонента:

constructor(props, context) { 
   super(props, context);

   this.state = {
      check: false
   };
};

Я пытаюсь переключать состояние каждый раз, когда мой флажок нажат, используя это.способ выполнении функция setState:

<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !check.value})}/> Checkbox </label>

конечно, я получаю Uncaught ReferenceError: проверка не определена. Так как же я могу достичь этого?

заранее большое спасибо.

5 ответов


поскольку никто не опубликовал это, я публикую правильный ответ. Если обновление нового состояния зависит от предыдущего состояния, всегда используйте функциональную форму setState который принимает в качестве аргумента функцию, возвращающую новое состояние.

в вашем случае:

this.setState(prevState => ({
  check: !prevState.check
}));

посмотреть docs


вы должны использовать this.state.check вместо check.value здесь:

this.setState({check: !this.state.check})

но в любом случае это плохая практика сделать это таким образом. Гораздо лучше переместить его в отдельный метод и не писать обратные вызовы непосредственно в разметке.


использовать 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>

попробуй:

<label><input type=checkbox" value="check" onChange = {(e) => this.setState({check: !this.state.check.value})}/> Checkbox </label>

используя check: !check.value означает, что он ищет check объект, который вы не объявляли.

вы должны указать, что вы хотите противоположное значение this.state.check.


Я приземлился на этой странице, когда я ищу, чтобы использовать состояние переключения в компоненте 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 })
});

спасибо.