【问题标题】:Change checked attribute of controlled checkbox (React)更改受控复选框的选中属性(反应)
【发布时间】:2017-01-06 17:08:56
【问题描述】:

我是 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 中,我这样调用组件:

&lt;Question step={this.state.step} question={this.state.questions[this.state.step]} setAnswer={this.setAnswer} onNext={this.onNext} isDisabled={this.isDisabled()} /&gt;

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

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

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

【问题讨论】:

标签: javascript reactjs checkbox


【解决方案1】:

Question 组件上使用componentWillReceiveProps 方法,如下所示:

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

根据文档:

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

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

【讨论】:

  • 感谢您的回答!所以我应该在我的Questions 组件中引入一个状态?我认为最好让这个组件保持无状态并通过父Quiz 组件的props 将所有信息传递给它?我不太确定如何实施您的建议。
  • @maze 当然可以!但在这种情况下,您的 Question 组件会随着每一步的变化而不断变化,因此您应该拥有多个无状态 Questions 或拥有一个有状态的。
  • 所以,我将 this.state.step 添加到 Question 组件;然后componentWillReceiveProps(nextProps) { this.setState({step: nextProps.step }); 但结果是一样的:问题确实发生了变化,但复选框记住了它们以前的状态......我做错了什么?
【解决方案2】:

所以事情是 React 渲染它的组件,这样只有改变的组件才会被渲染。由于重新渲染后复选框的选中属性没有任何变化,因此它们保持以前的状态。

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

类似

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 函数中,只需将状态checkedAttr 重置为false

【讨论】:

  • @maze 乐于助人:)
猜你喜欢
  • 2022-07-16
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2015-05-01
  • 1970-01-01
  • 2016-04-06
相关资源
最近更新 更多