У меня есть ощущение, что это «неправильно» задать вопрос, но здесь идет так или иначе:Убедитесь, новый экземпляр определенного компонента используется
Делаю какое-то викторина приложения (используя 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>
множественные-choice.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;
Проблема заключается в оказании Большой выбор. Он использует внутреннее состояние, чтобы показать, какой ответ неправильный и правильный.
in quiz.js, onRestart отправляет редукционное действие, которое обновляет хранилище, чтобы получить новые вопросы и сбросить currentQuestionIndex на 0. Это все работает. Но почему-то иногда элемент MultipleChoice «повторно используется» и по-прежнему показывает состояние, которое он имел в предыдущем раунде вопросов. Другими словами, большую часть времени монтируется новый MultipleChoice, но иногда это не так. Это реакция примирения, если я правильно понимаю?
Но как решить эту проблему? На мой взгляд, MultipleChoice нуждается в его внутреннем состоянии. Так что я должен как-то сбросить это состояние? Или убедитесь, что новый MultipleChoice монтируется каждый раз? Или я задаю здесь неправильные вопросы?
вы правильно поняли думаю. Я уже думал о предложенном вами решении, но для меня это довольно странно. Теперь я остаюсь с чувством: «Если это не относится к внутреннему состоянию, то что?» – ThomasM