Redux Forms - 忽略没有注册字段的 initialValues
Redux Forms - Ignore initialValues with no registered field
我从服务器获取了一个对象,其中包含许多与当前表单不相关的字段。我想将整个对象传递到我的表单上的 initialValues,但是当我提交时,我不想让额外的字段通过。
这是一个简单的表格:
const MyForm = ({ handleSubmit }) => (
<form onSubmit={handleSubmit}>
<Field name="name" component="input" placeholder="Name" />
<button type="submit">Submit</button>
</form>
);
export default reduxForm({
form: "foo",
onSubmit: values => {
console.log(values);
},
})(MyForm);
在它的父组件中,它是这样呈现的:
<MyForm initialValues={{ name: "bob", other: "thing" }} />
当我提交表单时,我希望值看起来像:
{name: "bob"}
并且不包括额外的 other
字段。这可能吗?
由于最终用户看不到额外的字段,因此它们不应成为表单最终补丁请求的一部分。我也不希望我的父组件与表单紧密耦合,所以我不想在该级别过滤字段。
我们最终通过用高阶组件包装表单来解决这个问题。然后,您可以包装传入的提交处理程序,并在表单返回的值发送到提交处理程序之前对它们执行一些逻辑:
export function specialForm(WrappedForm) {
return class extends Component {
submissionFilter(submitFunction) {
return function(values, dispatch, props) {
// Only let registered fields through.
if (props.registeredFields) {
values = _.pick(values, Object.keys(props.registeredFields));
}
return submitHandler(values, dispatch, props)
}
}
render() {
var submitHandler = this.props.onSubmit;
if (submitHandler) {
submitHandler = this.submissionFilter(submitHandler);
}
return <WrappedForm {...this.props} onSubmit={submitHandler} />;
}
};
}
这项工作的关键是表单的道具作为第三个参数传递给提交处理程序,道具有一个名为 registeredFields
的属性,它是表单本身的字段。
我从服务器获取了一个对象,其中包含许多与当前表单不相关的字段。我想将整个对象传递到我的表单上的 initialValues,但是当我提交时,我不想让额外的字段通过。
这是一个简单的表格:
const MyForm = ({ handleSubmit }) => (
<form onSubmit={handleSubmit}>
<Field name="name" component="input" placeholder="Name" />
<button type="submit">Submit</button>
</form>
);
export default reduxForm({
form: "foo",
onSubmit: values => {
console.log(values);
},
})(MyForm);
在它的父组件中,它是这样呈现的:
<MyForm initialValues={{ name: "bob", other: "thing" }} />
当我提交表单时,我希望值看起来像:
{name: "bob"}
并且不包括额外的 other
字段。这可能吗?
由于最终用户看不到额外的字段,因此它们不应成为表单最终补丁请求的一部分。我也不希望我的父组件与表单紧密耦合,所以我不想在该级别过滤字段。
我们最终通过用高阶组件包装表单来解决这个问题。然后,您可以包装传入的提交处理程序,并在表单返回的值发送到提交处理程序之前对它们执行一些逻辑:
export function specialForm(WrappedForm) {
return class extends Component {
submissionFilter(submitFunction) {
return function(values, dispatch, props) {
// Only let registered fields through.
if (props.registeredFields) {
values = _.pick(values, Object.keys(props.registeredFields));
}
return submitHandler(values, dispatch, props)
}
}
render() {
var submitHandler = this.props.onSubmit;
if (submitHandler) {
submitHandler = this.submissionFilter(submitHandler);
}
return <WrappedForm {...this.props} onSubmit={submitHandler} />;
}
};
}
这项工作的关键是表单的道具作为第三个参数传递给提交处理程序,道具有一个名为 registeredFields
的属性,它是表单本身的字段。