【问题标题】:How to set MenuSelect value to a boolean in a Formik form?如何将 MenuSelect 值设置为 Formik 表单中的布尔值?
【发布时间】:2021-08-08 20:26:49
【问题描述】:

我正在使用 Formik 表单,并且我有一个非常简单的材质 UI 选择下拉列表:

<FormControlLabel 
     control={
        (
          <Field component={Select} type="checkbox" name="isFoundationalSupport">
               <MenuItem value="yes">Yes</MenuItem>
               <MenuItem value="no">No</MenuItem>
               <MenuItem value="null">Unknown</MenuItem>
           </Field>
         )
      }
      label="Foundational support"
      labelPlacement="top"
 />

对于三个菜单项,我希望值为 true、false 或 null,但对于 MenuItem 中的 value 字段,这些值是不可接受的。是我使用组件状态的唯一途径吗?我希望保持简单并坚持使用 Formik 状态和值,但不确定在这种情况下是否可行。

【问题讨论】:

    标签: reactjs material-ui formik formik-material-ui


    【解决方案1】:

    因为MenuItem 的属性value 只接受字符串或数字,所以您必须在onChange 处理程序中对其进行转换。

    你不需要任何额外的状态来执行这个,你可以简单地使用formik的函数setFieldValue()

    // define all the options
    const selectOptions = [
      { id: true, text: "Yes" },
      { id: false, text: "No" },
      { id: null, text: "Unknown" }
    ];
    
    // and in the component
    <FormControlLabel
      control={
        <Field
          component={Select}
          placeholder="Select One"
          type="checkbox"
          value={
            selectOptions.find(
              ({ id }) => id === values.isFoundationalSupport
            ).text
          }
          name="isFoundationalSupport"
          onChange={(e) => {
            if (e.target.value) {
              const { id } = selectOptions.find(
                ({ text }) => text === e.target.value
              );
              setFieldValue("isFoundationalSupport", id);
            }
          }}
        >
          {selectOptions.map(({ text }) => (
            <MenuItem key={text} value={text}>
              {text}
            </MenuItem>
          ))}
        </Field>
      }
      label="Foundational support"
      labelPlacement="top"
    />
           
    

    Working Example

    【讨论】:

    • 效果很好,非常感谢。我的应用程序最初在选择“未知”(“找不到未定义”时的值上的值崩溃)所以我将NULL的ID更改为undefined并确切地给了我所想要的。再次感谢!
    猜你喜欢
    • 2014-06-29
    • 2018-04-01
    • 1970-01-01
    • 2021-09-09
    • 2021-02-10
    • 1970-01-01
    • 2013-06-22
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多