javascript - React js,根据值设置类
问题描述
我正在做一个测验,我想这样做,所以当用户点击正确答案时,如果用户点击错误答案,它会变成绿色,它会变成红色。
这就是我现在得到的:
state = {
answerClass: false,
};
handleVoting(answer) {
if (answer == this.props.questions[this.props.questionIndex].answer) {
this.setState({
answerClass: 'green'
});
} else {
this.setState({
answerClass: 'red'
});
}
var options = [];
if (this.props.options) {
for (var i = 0; i < this.props.options.length; i++) {
options.push( < div className = {
this.state.answerClass
} >
<
img onClick = {
this.handleVoting.bind(this, this.props.options.value)
}
src = {
url
}
/></div > );
}
}
因此,这会创建两个用于投票的图像按钮,当我单击其中一个时,我正在向 handleVoting 函数发送一个值,该函数检查单击的值是否与我正在为类名设置状态的问题的答案相同。
这个问题是,如果我点击正确的选项,两个都会变成绿色,如果我点击错误的选项,它就会变成红色。
解决方案
你很近!发生的事情是您将相同的状态部分应用于所有按钮。解决此问题所需要做的就是为每个按钮设置一个单独的状态部分。对于这种情况,我建议使用一个数组来保存每个按钮的状态。然后,您只需将选项的索引传递给您的 handleVoting 函数,并使用它来确定要设置的状态部分。
此外,不确定是否只是复制/粘贴不正确,但请确保您的状态在渲染方法中分配给 UI。我还建议在动态分配数组时使用 map 函数。
见下文...
state = {
answerClasses: [],
};
handleVoting(answer, index) {
if (answer == this.props.questions[this.props.questionIndex].answer) {
let newAnswerClasses = this.state.answerClasses;
newAnswerClasses[index] = 'green';
this.setState({
answerClasses: newAnswerClasses
});
} else {
let newAnswerClasses = this.state.answerClasses;
newAnswerClasses[index] = 'red';
this.setState({
answerClasses: newAnswerClasses
});
}
}
render() {
let options = this.props.options.map(function(option, i) {
return (< div className = {
this.state.answerClasses[i]
} >
<
img onClick = {
this.handleVoting.bind(this, this.props.options.value, i)
}
src = {
url
}
/></div > );
}.bind(this));
return <div>{options}</div>
}
编辑评论
state = {
answerClasses: [],
};
handleVoting(answer, index) {
let newAnswerClasses = this.state.answerClasses;
if (answer == this.props.questions[this.props.questionIndex].answer) {
newAnswerClasses[index] = 'green';
this.setState({
answerClasses: newAnswerClasses
});
} else {
// for loop method
for(let i=0; i < this.props.options.length; i++) {
if(this.props.options[i].value === answer) {
newAnswerClasses[i] = 'red';
break;
}
}
// OR passing index to component via props method
newAnswerClasses[this.props.answerIndex] = 'green';
newAnswerClasses[index] = 'red';
this.setState({
answerClasses: newAnswerClasses
});
}
}
render() {
let options = this.props.options.map(function(option, i) {
return (< div className = {
this.state.answerClasses[i]
} >
<
img onClick = {
this.handleVoting.bind(this, this.props.options.value, i)
}
src = {
url
}
/></div > );
}.bind(this));
return <div>{options}</div>
}
推荐阅读
- javascript - 基于背景图像的黑白文本和css
- excel - 如何在 Codeigniter 的特定工作表中导入 Excel
- plasticscm - 塑料单片机命令行日期分支修改
- .net-core - 特定版本的 .NET Core 依赖关系树
- javascript - 从 HTML 导出表单时如何在 PDF 中创建书签
- java - JavaFX:如果节点等于节点
- android - Firebase 覆盖单个文档问题
- php - 通过准备好的语句更新sql中的行的一部分
- python - 如何遍历列表内的json字典
- swift5 - 实现 ImagePicker 以从图库或相机中设置图像?