[英]How to initialize standalone Radio Button Group component checked property state with redux \ redux-form
我正在学习反应,我被卡住了。 我正在尝试在 Edit 和 Create 组件之间共享一个表单。 我很难弄清楚我做错了什么来初始化收音机组的选中属性的值。 页面加载后,我可以切换单选按钮。 然而,最初,两者都没有被检查。
我开始认为我在表单上错误地设置了我的检查属性。
编辑组件(表单父组件):
class CompanyMasterEdit extends React.Component {
componentDidMount() {this.props.fetchCompany(this.props.match.params.companyId,this.props.match.params.companyName)}
onSubmit = (formValues) => { this.props.editCompany(this.props.match.params.companyId, formValues) }
render() {
return (
<div style={{ padding: 50 }}>
<h1 style={{ textAlign: "center" }}>Edit Company Master Record</h1>
<h5 style={{ textAlign: "center" }}>
<span style={{ color: "red" }}>*</span> indicates required field
</h5>
<CompanyMasterForm
initialValues={_.pick(
this.props.company,
"isKeyCompany",...
)}
onSubmit={this.onSubmit}
/>
const mapStateToProps = (state, ownProps) => {
return { company: state.companies[ownProps.match.params.companyId] }
}
export default connect(mapStateToProps, { fetchCompany, editCompany })( CompanyMasterEdit)
形式:
class CompanyMasterForm extends React.Component {
<form
className="ui form error"
onSubmit={this.props.handleSubmit(this.onSubmit)}
>
<Field
label="Is This a Key Company?"
component={RadioGroup}
name="isKeyCompany"
required={true}
options={[
{ title: "Yes", value: true },
{ title: "No", value: false },
]}
checked={this.props.initialValues.isKeyCompany}
// onClick={this.setIsKeyCompany}
//onClick={(e) => this.setState({ isKeyCompany: e.target.checked })}
onClick={() => {this.setState((prevState) => {return {checked: !this.props.initialValues.isKeyCompany,}})
}}
/>
<button className="ui button primary">Submit</button>
</form>
RadioButtonGroup作为一个单独的组件:
class RadioGroup extends React.Component {
render() {
return (
<div className={className}>
<div className="inline fields">
<div className={labelClassName}>
<label>{label}</label>
</div>
{options.map((o) => {
const isChecked = o.value ? "true" : "false"
console.log("o.value :", o.value)
return (
<label key={o.title}>
<input
type="radio"
{...input}
value={o.value}
checked={isChecked === input.value}
/>
{o.title}
</label>
)
})}
</div>
</div>
)
}
}
// const mapStateToProps = (state) => {
// console.log("radio group state : ", state)
// return { isKeyCompany: state.form.companyMasterForm.values.isKeyCompany }
// }
// export default connect(mapStateToProps)(RadioGroup)
// export default connect(null)(RadioGroup)
export default RadioGroup
我有一个密码箱。 我觉得我很接近并在它周围跳舞,但我无法得到它。 任何帮助表示赞赏。
选项的值是文本(input.value 是文本但 o.value 是布尔值)。 选中的属性是 boolean。 ===
永远不会是完全正确的,除非你修复其中的一件事。
此更改会显示一个选项。 并不是说这真的是正确的改变。 我们可能应该对已检查的属性进行更稳健的比较。
checked={o.value == input.value}
当前是 boolean 因为你在这里设置
options={[
{ title: "Yes", value: true },
{ title: "No", value: false },
]}
+1 来自@Nikki9696 的研究,但更好的解决方案是使用严格的===
检查保留比较并将选项配置更改为具有字符串值:
options={[
{ title: "Yes", value: 'true' },
{ title: "No", value: 'false' },
]}
那是因为"true" != true
(字符串值 "true" 不等于 boolean 值true
,即使使用类型强制)。 对于"false"
和false
之间的比较也可以这样说。
几点说明:
name
prop。 所以我们可以为一组选项写一个硬编码的字符串。value
属性不能确定单选按钮是否处于活动状态。 这是通过checked
/ defaultChecked
来完成的。 如果我们有两个以上的选项(对于 label 每个选项), value
属性特别有用。input
在做什么?"true"
和"false"
作为字符串值。 在这种情况下,boolean( true
或false
,不带引号)更合适。 这是表示您的 state 的最简单方法,并且诸如"True"
之类的拼写错误不会漏掉(当您使用字符串时,此类拼写错误 go 不会被注意到)。defaultChecked
而不是checked
。您的RadioGroup组件将如下所示:
class RadioGroup extends React.Component {
state = { isKeyCompany: true } // initial value
render() {
return (
<div className={className}>
<div className="inline fields">
<div className={labelClassName}>
{label /* note: not wrapped in `<label>...</label>`, because it’s not the description of one option, but rather of the entire set. */}
</div>
{options.map((o) => (
<label key={o.title}>
<input
type="radio"
name="isKeyCompany" // for example
checked={this.state.isKeyCompany === o.value} // or passed down via props
onChange={() => this.setState({ isKeyCompany: o.value }))
/>
{o.title}
</label>
))}
</div>
</div>
)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.