Reactjs 无状态组件中的“反应”复选框未立即更新

Reactjs 无状态组件中的“反应”复选框未立即更新,reactjs,checkbox,Reactjs,Checkbox,我使用复选框创建了一个基本的界面,该复选框使用了一种react设计模式,这种模式以前对我很有用,而且我认为效果很好——即提升状态并将道具传递给UI组件。我的复选框组件被传递一个值、一个度量、一个状态更改方法和一个用于选中的布尔值。问题是复选框不会立即更新,即使您可以在React dev工具中看到它们正在更新。它们仅在下一次单击时更新,如选中另一个复选框时。代码如下: class App extends React.Component { constructor(props) { super

我使用复选框创建了一个基本的界面,该复选框使用了一种react设计模式,这种模式以前对我很有用,而且我认为效果很好——即提升状态并将道具传递给UI组件。我的复选框组件被传递一个值、一个度量、一个状态更改方法和一个用于选中的布尔值。问题是复选框不会立即更新,即使您可以在React dev工具中看到它们正在更新。它们仅在下一次单击时更新,如选中另一个复选框时。代码如下:

class App extends React.Component {
 constructor(props) {
  super(props);
  this.state = {
   metricsSelected: []
  }
  this.selectMetric = this.selectMetric.bind(this)
 }

selectMetric(metric) {
 const metricsSelected = this.state.metricsSelected
 const index = metricsSelected.indexOf(metric)
 if (index !== -1){
  metricsSelected.splice(index, 1)
 }
 else {
  metricsSelected.push(metric)
 }
 this.setState({
  metricsSelected,
 });
}

render() {
 return (
  <div>
    <Sidebar
      metricsSelected={this.state.metricsSelected}
      selectMetric={this.selectMetric}/>
    <SomethingElse/>
   </div>
  )
 }
}

const SomethingElse = () => (<div><h2>Something Else </h2></div>)

const Sidebar = ({ metricsSelected, selectMetric }) => {
 const metrics = ['first thing', 'second thing', 'third thing']
 return (
  <div>
   <h3>Select Metrics</h3>
   { metrics.map( (metric, i) =>
    <Checkbox
      key={i}
      metric={metric}
      selectMetric={selectMetric}
      checked={metricsSelected.includes(metric)}/>
    )}
   </div>
  )
 }

const Checkbox = ({ metric, selectMetric, checked }) => {

const onChange = e => {
 e.preventDefault()
 selectMetric(e.target.value)
}
return (
  <ul>
   <li>{metric}</li>
   <li><input
   type='checkbox'
   value={metric}
   checked={checked}
   onChange={onChange} /></li>
  </ul>
 )
}
我已经阅读了几乎所有关于react复选框的资料,大多数复选框的应用程序都与我想做的不同。我已经尝试将状态添加到Checkbox组件,但这似乎没有帮助,因为选中的值仍然需要从其他地方输入。我想当道具换了以后,我们会重新招标的。有什么好处


这是一个代码笔:

这是一个工作版本:

导致问题的两个原因是您在selectMetric中改变了状态,并且您的复选框输入的onChange函数使用了e.target.value而不是e.target.checked


我将metricsSelected状态更改为一个对象,因为我认为这使它的管理变得更加简单。

做了一些更改,请选中此项。它将非常快:。主要问题是e。
class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      metricsSelected: {}
    }
    this.selectMetric = this.selectMetric.bind(this)
  }

  selectMetric(metric) {
    this.setState(({ metricsSelected }) => ({
      metricsSelected: {
        ...metricsSelected,
        [metric]: !metricsSelected[metric]
      }
    }))
  }

  render() {
    return (
      <div>
        <Sidebar
          metricsSelected={this.state.metricsSelected}
          selectMetric={this.selectMetric}/>
        <SomethingElse/>
      </div>
    )
  }
}

const SomethingElse = () => (<div><h2>Something Else </h2></div>)

const Sidebar = ({ metricsSelected, selectMetric }) => {
  const metrics = ['first thing', 'second thing', 'third thing']
  return (
    <div>
      <h3>Select Metrics</h3>
      { metrics.map( (metric, i) =>
        <Checkbox
          key={i}
          metric={metric}
          selectMetric={selectMetric}
          checked={Boolean(metricsSelected[metric])}/>
        )}
    </div>
  )
}

const Checkbox = ({ metric, selectMetric, checked }) => {
  return (
  <ul>
    <li>{metric}</li>
    <li>
      <input
        type='checkbox'
        name={metric}
        checked={checked}
        onChange={() => selectMetric(metric)} 
       />
     </li>
   </ul>
  )
}


ReactDOM.render(
  <App />,
  document.getElementById('root')
);