【发布时间】:2019-03-27 18:02:31
【问题描述】:
我用React 编写了一个Checkbox 组件,它被重用于生成复选框列表。我知道反应元素在状态方面与DOM 不同。但是如何检查用户在React 提交的表单中是否至少选择了1个复选框?
我在 SO 和 Google 中搜索过,但所有示例都使用 jQuery 或 vanilla JS。对于我的情况,我想要一个 React 示例。
组件
const Checkbox = ({ title, options, id, name, onChange }) => {
return (
<div className="checkbox-group">
<h4>{title}</h4>
{options.map(option => (
<label htmlFor={`${name}-${index}`} key={`${name}-${index}`}>
<input
type="checkbox"
name={name}
value={option}
onChange={onChange}
id={`${name}-${index}`}
/>
<span> {option}</span>
</label>
))}
</div>
);
};
class Form extends Component {
...
handleChange(event) {
let newSelection = event.target.value;
let newSelectionArray;
newSelectionArray = [
...this.state.sureveyResponses.newAnswers,
newSelection,
];
this.setState(prevState => {
return {
surveyResponse: {
...this.state.surveyResponse,
newAnswers: newSelectionArray,
}
)
}
handleSubmit() {
// I'm guessing this doesn't work in React as it's using its own state!
let checkboxes = document.querySelectorAll('[name="quiz-0"]:checked');
for (let chk in checkboxes) {
if (chk.checked) {
return true;
}
}
alert('Please choose at least one answer.');
return false;
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<h4>Choose</>
{this.state.surveyQuiz.map((quiz, index) => {
return (
<div key={index}>
<Checkbox
title={quiz.question}
options={quiz.answers}
name={`quiz-${index + 1}`}
onChange={this.handleChange}
/>
</div>
);
})};
<button>Save answer(s)</span>
</form>
);
}
}
当用户提交表单时,它应该检查是否至少有一个复选框被选中,如果没有被选中则阻止表单提交,即返回 false!
【问题讨论】:
-
复选框应该precisely reflect an array of booleans in your state;这样做,检查复选框就像在数组上调用
.some(...)一样简单。
标签: javascript reactjs checkbox