You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-redux结合react-hook-form表单提交生成对象ID重复如何解决?

问题原因

问题确实和你猜测的一致,uuidv4()放在useForm的defaultValues中时,只会在组件首次渲染时执行一次,生成的ID会被后续所有表单提交复用,因此所有新增元素ID都相同。而且你的表单中没有ID对应的输入字段,完全不需要将ID放在表单默认值里。

修复方案

提交表单时再生成新ID插入到表单数据中即可,修改后的完整代码如下:

import React from "react";
import { v4 as uuidv4 } from "uuid";
import { useForm } from "react-hook-form";
import { connect } from "react-redux";
import { addTodos } from "../redux/reducer";

const mapStateToProps = (state) => ({
    todos: state,
});

const mapDispatchToProps = (dispatch) => ({
    addTodo: (obj) => dispatch(addTodos(obj)),
});

const TodoForm = (props) => {
    const { register, handleSubmit, reset } = useForm({
        defaultValues: {
            name: "",
            date: "",
            done: false,
        },
    });

    const onSubmit = (data) => {
        // 每次提交时生成全新ID
        const newTodo = {
            ...data,
            id: uuidv4()
        };
        props.addTodo(newTodo);
        // 可选:提交后重置表单方便下次输入
        reset();
    };

    return (
        <form onSubmit={handleSubmit(onSubmit)}>
            <input
                type="text"
                placeholder="Name"
                name="name"
                {...register("name", { required: true })}
            />
            <input
                type="date"
                placeholder="Date"
                name="date"
                {...register("date", { required: true })}
            />

            <input type="submit" />
        </form>
    );
};

export default connect(mapStateToProps, mapDispatchToProps)(TodoForm);

内容的提问来源于stack exchange,提问作者learningbtw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 14:36:05