更改受控复选框的选中属性(React)

IT技术 javascript reactjs checkbox
2021-05-10 11:05:28

我是 React 的新手,可能缺乏正确的术语来找到我的问题的解决方案。不可能那么难。

我正在构建一个简单的应用程序,它显示一组问题,一次一个问题。回答完一个问题后,会显示下一个问题。

我有一个Question呈现 3 个复选框的组件,每个复选框代表一个可能answer的问题。

{this.props.question.answers.map((answer, index) => {
  return (
    <li className="Question__answer" key={answer.id}>
      <label className="Question__answer-label">
        <input
          className="Question__answer-checkbox"
          type="checkbox"
          value={index}
          onChange={this.props.setAnswer}
          defaultChecked={false} />
        {answer.answer}
      </label>
    </li>

    ...

    <button className="Question__next" type="button" onClick={this.props.onNext} disabled={this.props.isDisabled}>
        Next question
      </button>
  )
})}

在我的主要组件中,Quiz我像这样调用组件:

<Question step={this.state.step} question={this.state.questions[this.state.step]} setAnswer={this.setAnswer} onNext={this.onNext} isDisabled={this.isDisabled()} />

onNext是我的函数,它会增加this.state.step以显示下一个问题:

onNext(event) {
    this.setState({step: this.state.step + 1});
}

一切正常,除了:当显示下一个问题时,我希望再次取消选中所有 3 个复选框。目前,他们记得之前回答的问题中的选中状态。

2个回答

所以问题是 React 渲染其组件,以便仅渲染更改的组件。由于重新渲染后复选框的检查属性没有任何变化,因此它们保持以前的状态。

您应该做的是在setAnswer函数中单击时切换复选框状态,并将其作为props传递给 Question 组件。

就像是

this.state {
   checkedAttr: ["false", "false", "false"]
} 

传递它喜欢

<Question step={this.state.step} question={this.state.questions[this.state.step]} setAnswer={this.setAnswer} onNext={this.onNext} isDisabled={this.isDisabled()} checkedAttr={this.state.checkedAttr} />

在复选框状态中使用它们作为

{this.props.question.answers.map((answer, index) => {
  return (
    <li className="Question__answer" key={answer.id}>
      <label className="Question__answer-label">
        <input
          className="Question__answer-checkbox"
          type="checkbox"
          value={index}
          checked={this.props.checkedAttr[index]}
          onChange={this.props.setAnswer}
          defaultChecked={false} />
        {answer.answer}
      </label>
    </li>

    ...

    <button className="Question__next" type="button" onClick={this.props.onNext} disabled={this.props.isDisabled}>
        Next question
      </button>
  )
})}

onNext函数中,只需将状态重置checkedAttrfalse

Question组件上使用这样的componentWillReceiveProps方法:

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}

根据文档:

componentWillReceiveProps 将在组件接收新props时被调用。初始渲染不会调用此方法。

Question组件中获取接收到的步骤并更新其状态以显示新的Question.