给定一个数组,其字段的名称与Form对象中的名称匹配,我试图编写一个嵌套值,但由于某种原因,Formik不知道如何编写嵌套值,这只适用于从顶层开始的值​​

我会在 comments 中留下codesandbox的链接

export default function App() {
  const form = useFormik({
    initialValues: {
      name: "",
      login: "",
      about: {
        age: "",
        rank: "",
        car: {
          name: "",
          years: ""
        }
      }
    }
  });

  const fields = [
    {
      name: { title: "Your name", fields: {} },
      login: { title: "Your login", fields: {} },
      about: {
        title: "About",
        fields: {
          age: { title: "Your age", fields: {} },
          rank: { title: "Your rank", fields: {} },
          car: {
            title: "Your car",
            fields: {
              name: { title: "Car name", fields: {} },
              years: { title: "Car years", fields: {} }
            }
          }
        }
      }
    }
  ];
  const { values, handleChange } = form;

  console.log("VALUES", values);

  const itemsRender = (item, idx) => {
    const key = Object.keys(item).at(-1);
    return (
      <div key={idx}>
        <p>{item[key]?.title}</p>
        <input
          name={key}
          value={values[key]}
          onChange={handleChange}
          placeholder={item[key].title}
        />

        {!isEmpty(item[key]?.fields) && (
          <div style={{ marginLeft: 20 }}>
            {Object.entries(item[key]?.fields).map(itemsRender)}
          </div>
        )}
      </div>
    );
  };

  return <>{fields.map(itemsRender)}</>;
}

推荐答案

您需要更新namevalue属性以包含嵌套字段的完整路径

<input
  name={`${key}.${nestedFieldName}`} // Include the nested field's path
  value={getIn(values, `${key}.${nestedFieldName}`)} // Get nested value using getIn from formik
  onChange={handleChange}
  placeholder={fieldObj.title}
/>

您的代码仅处理一个级别的嵌套.
对于更深层次的嵌套,您需要递归呈现和处理嵌套字段

{Object.entries(item[key]?.fields).map(([nestedFieldName, fieldObj]) => (
  <div style={{ marginLeft: 20 }} key={nestedFieldName}>
    <p>{fieldObj.title}</p>
    <input
      name={`${key}.${nestedFieldName}`}
      value={getIn(values, `${key}.${nestedFieldName}`)}
      onChange={handleChange}
      placeholder={fieldObj.title}
    />
    {fieldObj.fields && (
      <div style={{ marginLeft: 20 }}>
        {Object.entries(fieldObj.fields).map(itemsRender)}
      </div>
    )}
  </div>
))}

最后,您应该使用Formik的setFieldValue来更新嵌套字段的值,而不是直接对嵌套字段使用handleChange.
您可以从您拥有的Form对象访问setFieldValue:

onChange={(e) => {
  form.setFieldValue(`${key}.${nestedFieldName}`, e.target.value);
}}

codesandbox

Reactjs相关问答推荐

react 导致不必要的回归

InfiniteScroll持续获取数据,直到超过最大更新深度

如何在Pivot模式下自定义标题?

如何在useEffect中使用useParams()

try 在Dockerfile中使用AWS CLI将React构建工件上传到S3时出错

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

下拉Tailwind CSS菜单与怪异beviour

Reaction上下文值无法传递给其他组件

使用Ionic 7和React 18,如何访问历史对象以在页面之间导航?

Antd V5组件自定义主题

有没有办法在用户离开页面时防止输入模糊?

Recharts 笛卡尔网格 - 垂直线和水平线的不同样式

虽然通过了身份认证,但并没有导航到请求的页面

需要在窗口调整大小时更新 React 组件

下一次导出:未捕获的语法错误:标识符注册表已被声明

调用 Statsig.updateUser 时 UI 不呈现

如何从一组对象映射 MUI 5 图标并更改其 colored颜色 ?

如何在 Cypress E2E 的站点上测试react 组件?

在react 钩子中将数组添加到数组状态给出一个数字

由于另一个子组件,如何在react 中渲染另一个子组件