如何切换反应组件的布尔状态?

noo*_*oob 55 javascript reactjs reactjs-flux

我想知道如何切换反应组件的布尔状态.例如:

我在组件的构造函数中进行了布尔状态检查:

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

   this.state = {
      check: false
   };
};
Run Code Online (Sandbox Code Playgroud)

我试图在每次单击我的复选框时使用this.setState方法切换状态:

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

当然,我得到一个未捕获的ReferenceError:未定义检查.那我该怎么做呢?

提前谢谢了.

Dan*_*ane 182

由于没有人发布这个,我发布了正确的答案.如果新的状态更新取决于先前的状态,请始终使用函数形式setState作为参数接受返回新状态的函数.

在你的情况下:

this.setState(prevState => ({
  check: !prevState.check
}));
Run Code Online (Sandbox Code Playgroud)

查看文档

  • @SunnyPro阅读链接的文档,你会找到答案.TL; DR反应通过将它们一起批处理来优化对设置状态的调用.所以想象一个简单的递增函数`increment =()=> this.setState({count:this.state.count + 1});`和一段代码:`increment(); 增量(); increment();`现在反应可以将这些批处理类似于:`setNewState =(oldState)=> {newState.count = oldState.count + 1; newState.count = oldState.count + 1; newState.count = oldState.count + 1; return newState; 看到问题出在哪里? (7认同)
  • 完美的实施 (2认同)
  • 为什么这比直接使用`this.setState({check:!this.state.check})更好? (2认同)

Eug*_*akh 16

你应该使用this.state.check而不是在check.value这里:

this.setState({check: !this.state.check})
Run Code Online (Sandbox Code Playgroud)

但无论如何,这样做是不好的做法.将它移动到单独的方法并且不直接在标记中编写回调更好.

  • @公吨.但后来,我多年后回答.有那个:) (3认同)
  • 这不仅是不好的做法,而且你可能得不到想要的结果,因为 [`setState` 是异步的](https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be -异步)。看我下面的回答。 (2认同)

Pao*_*tti 8

这是一个使用钩子的例子(需要 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);
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Pra*_*avi 6

使用checked来获取值。期间onChangechecked将是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'))
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)