【发布时间】:2016-09-19 10:02:03
【问题描述】:
我觉得这是一个“错误”的问题,但无论如何:
我正在制作某种测验应用程序(使用 redux 进行状态管理)。 (此处显示重要部分)
quiz.js
<Slider {...sliderSettings} slideIndex={currentQuestionIndex}>
<Start onStart={() => onNextQuestion()} topicId={topicId} />
{
questions.map((question, ndx) => {
return (
<Question {...question} done={onDone} key={`question-${question.id}`} />
);
})
}
<Result score={score} onRestart={() => onRestart()}/>
</Slider>
question.js
<div className="question">
<h2 className="question__text">{ question }</h2>
<MultipleChoice options={answers} onChange={done} />
</div>
多项选择.js
const
initialState = {
selectedValue: null
};
class MultipleChoice extends Component {
constructor(props) {
super(props);
this.state = initialState;
}
handleChange(value, correct) {
this.setState({
selectedValue: value
});
this.props.onChange(correct);
}
render() {
const
{ options } = this.props,
getStateClass = (option, ndx) => {
let sc = '';
if (this.state.selectedValue !== null) {
if (this.state.selectedValue === ndx) {
sc = option.correct ? 'is-correct' : 'is-incorrect';
} else if (option.correct) {
sc = 'is-correct';
}
}
return sc;
};
return (
<ul className="multiple-choice">
{ options.map((option, ndx) => {
return (
<li key={`option-${ndx}`} className={cx('multiple-choice__option', getStateClass(option, ndx))}>
<button className="multiple-choice__button" onClick={() => this.handleChange(ndx, option.correct)}>{option.answer}</button>
</li>
);
}) }
</ul>
);
};
}
export default MultipleChoice;
问题在于 MultipleChoice 的呈现。它使用内部状态来显示哪个答案是错误的和正确的。
在 quiz.js 中,onRestart 调度一个 redux 操作,它更新 store 以获取一些新问题并将 currentQuestionIndex 重置为 0。这一切都有效。 但不知何故,有时 MultipleChoice 元素被“重用”并且仍然显示它在上一轮问题中的状态。换句话说,大多数情况下会安装一个新的 MultipleChoice,但有时不会。这是反应和解,如果我理解正确的话?
但是我该如何解决这个问题呢?在我看来,MultipleChoice 需要它的内部状态。那么我应该以某种方式重置此状态吗?或者确保每次都安装一个新的 MultipleChoice?还是我在这里问错了问题?
【问题讨论】: