React:在 parent 和 child onClick 中更改状态
React: change a state in parent and in child onClick
我有一个用于多项选择题的 parent 组件,它使用 map
为每个答案生成按钮。按钮本身是另一个组件。
我希望能够根据答案是否正确改变每个按钮的颜色,同时也希望能够统计 parent.
中的总尝试次数
使用回调,我可以获得颜色变化或尝试计数,但不能同时获得两者。谁能解释我做错了什么?
Parent
const MCQuiz = (props) => {
const [answer, setAnswer] = React.useState('');
const [attempts, setAttempts] = React.useState(0)
const renderFeedback = (ans) => {
if (ans === props.question[props.questionNumber].correct) {
return "yes"
} else if (ans === '') {
return ''
} else {
return "no"
}
}
const parentOnClick = (ans) => {
setAnswer(ans)
setAttempts(attempts + 1)
}
return (
<div className={styles.question}>
<h2>{props.question[props.questionNumber].desc}</h2>
<ol>
{props.question[props.questionNumber].options.map((ans) => {
return (
<li key={uuid()} className={`${styles.questionItem}`}>
<MCButton
ans={ans}
correct={props.question[props.questionNumber].correct}
onClick={parentOnClick}
name={ans}
/>
</li>
)
})}
</ol>
<span>{renderFeedback(answer)}</span>
<br />
<p>attempts: {attempts}</p>
</div>
)
}
Child
const MCButton = (props) => {
const [color, setColor] = useState(constants.accentBrown)
const clickHandler = (ans, correct) => {
ans === correct ? setColor(constants.accentBlue) : setColor(constants.accentRed);
props.onClick()
}
return (
<button
className={styles.answerButton}
style={{ backgroundColor: color }}
onClick={() => clickHandler(props.ans, props.correct)}
>
{props.name}
</button>
)
};
我认为您想将 ans 传递给按钮内的 onClick 回调。
const clickHandler = (ans, correct) => {
setColor(ans === correct ? constants.accentBlue : constants.accentRed)
props.onClick(ans)
}
我有一个用于多项选择题的 parent 组件,它使用 map
为每个答案生成按钮。按钮本身是另一个组件。
我希望能够根据答案是否正确改变每个按钮的颜色,同时也希望能够统计 parent.
中的总尝试次数使用回调,我可以获得颜色变化或尝试计数,但不能同时获得两者。谁能解释我做错了什么?
Parent
const MCQuiz = (props) => {
const [answer, setAnswer] = React.useState('');
const [attempts, setAttempts] = React.useState(0)
const renderFeedback = (ans) => {
if (ans === props.question[props.questionNumber].correct) {
return "yes"
} else if (ans === '') {
return ''
} else {
return "no"
}
}
const parentOnClick = (ans) => {
setAnswer(ans)
setAttempts(attempts + 1)
}
return (
<div className={styles.question}>
<h2>{props.question[props.questionNumber].desc}</h2>
<ol>
{props.question[props.questionNumber].options.map((ans) => {
return (
<li key={uuid()} className={`${styles.questionItem}`}>
<MCButton
ans={ans}
correct={props.question[props.questionNumber].correct}
onClick={parentOnClick}
name={ans}
/>
</li>
)
})}
</ol>
<span>{renderFeedback(answer)}</span>
<br />
<p>attempts: {attempts}</p>
</div>
)
}
Child
const MCButton = (props) => {
const [color, setColor] = useState(constants.accentBrown)
const clickHandler = (ans, correct) => {
ans === correct ? setColor(constants.accentBlue) : setColor(constants.accentRed);
props.onClick()
}
return (
<button
className={styles.answerButton}
style={{ backgroundColor: color }}
onClick={() => clickHandler(props.ans, props.correct)}
>
{props.name}
</button>
)
};
我认为您想将 ans 传递给按钮内的 onClick 回调。
const clickHandler = (ans, correct) => {
setColor(ans === correct ? constants.accentBlue : constants.accentRed)
props.onClick(ans)
}