reactjs - 在渲染方法中设置状态 - Reactjs
问题描述
我有一个包含几个问题的表格。有些问题有一组子问题。这些是使用以下代码呈现的。
{
Object.keys(this.props.moduleDetails.questions).map((questionInfo, index) => (
<div key={index}>
<QuestionAnswers
questionInfo={this.props.moduleDetails.questions[questionInfo]}
generateStepData={this.props.generateStepData}
states={this.props.states}
userEnteredValues={this.props.formValues}
errors={this.props.errors}
setQuestionAnswers={this.setQuestionAnswers}
/>
{this.props.moduleDetails.questions[questionInfo].question_group &&
this.props.moduleDetails.questions[questionInfo].has_grouped_questions ===
1 ? (
<div className="sub-questions">
{this.props.moduleDetails.questions[questionInfo].question_group ? (
<span>
{this.renderQuestionGroup(questionInfo)}
<input
type="button"
onClick={e => {
this.addQuestionGroup(questionInfo)
}}
value="Add"
className="btn"
/>
</span>
) : null}
</div>
) : null}
</div>
))
}
如您所见,问题组是使用 renderQuestionGroup(questionInfo) 方法呈现的。
renderQuestionGroup(questionInfo) {
let input = [];
this.state.groupedQuestions[questionInfo] = (this.state.groupedQuestions[questionInfo]) ?
this.state.groupedQuestions[questionInfo]
: [];
let answerId = this.props.formValues[questionInfo];
let groupedQuestions = this.props.moduleDetails.questions[questionInfo].question_group[answerId];
if((groupedQuestions != null && this.state.groupedQuestions[questionInfo].length == 0) || this.state.isAddPressed) {
this.state.groupedQuestions[questionInfo].push(groupedQuestions);
}
input = this.display(questionInfo)
return input;
}
这里的问题是我不能在这个方法中设置状态,因为这个方法在渲染方法中被调用
关于如何解决这个问题的任何想法?
有没有其他方法可以解决这个问题?
解决方案
您不能在渲染函数中设置状态,因为它会导致副作用。
确切的情况是,每次更新状态时,react 都会调用渲染函数,因此如果您要在渲染函数中更新状态,那么它将卡在无限循环中。
一般来说,这绝不应该发生;您不应该做任何与在渲染函数中修改任何组件状态相关的远程操作。
推荐阅读
- selenium - Selenium:无法找到电子邮件类型框,不在任何 iframe 中
- ios - 我如何将文件夹从项目复制到文档目录 ios swift
- angular - 未捕获的 TypeError:r.existsSync 不是 Angular 6 和 Electron 桌面应用程序中的函数
- c# - 在字符串中查找特定数字
- python - 无法打开位于子目录 python 内的文件
- java - 在 tomcat 中部署后,出现异常:已建立的连接被主机中的软件中止
- python - Post API——创建代码后需要遵循哪些步骤,以便我可以通过此 API 将数据添加到 txt 文件中
- python - 无法加载库“C:/Program Files/PostgreSQL/9.4/lib/plpython3.dll”:找不到指定的模块
- reactjs - React - 将菜单选项从子元素传递到父菜单
- javascript - 我有办法从浏览器后退按钮历史记录中删除 URL?