首页 > 解决方案 > Formik 复选框不改变值

问题描述

我正在尝试使用 Formik 创建一个表单,它本质上是一系列复选框。这是我正在做的简化版本,

我有一些看起来像这样的道具:

"settings" : {
    "email_addresses":
    [
        "a@b.com",
        "c@b.com",
    ],
        "alerts":
    {
        "SYSTEM": {
            "UP": {
                "enabled": true,
                    "states": ["UP"]
            },
            "DOWN": {
                "enabled": false,
                    "states": ["DOWN"]
            }
        }
    }
}

这是表格

...
return (
    <Formik
        initialValues={this.props.settings}
        onSubmit={(values) => {
            console.log('values', values)
        }}
    >
        {props => {
            return (

                <Form>
                    {
                        Object.keys(props.values.alerts).map((alert) => {
                            Object.keys(props.values.alerts[alert]).map((state) =>
                                <Field name={props.values.alerts[alert][state].enabled}>
                                    {({ field, form, meta }) =>
                                        <input
                                            type="checkbox"
                                            id={props.values.alerts[alert][state]}
                                            checked={props.values.alerts[alert][state].enabled}
                                        />
                                    }</Field>
                            )
                        }
                        )
                    }

                </Form >
            )
        }}
    </Formik >
)
...

呈现页面时,复选框会根据“启用”的值正确呈现和勾选/未勾选。单击复选框时的行为不起作用不添加/删除刻度并且不更改值。

我根据两个假设解决了这个问题:

知道问题可能出在哪里吗?

标签: reactjscheckboxformik

解决方案


事实证明,我在许多示例中发现的语法对于我需要做的事情来说是不必要的复杂。

另一个问题是我定义“名称”值的“路径”的方式。似乎正如我所分配props.settingsinitialValues那样,我只需要指出相对路径。

使用以下简单的语法,它立即生效。

<Field name={`alerts[${alert}][${state}].enabled`} type="checkbox" />

推荐阅读