如何使用 useEffect() 更改 React-Hook-Form defaultValue?

2024-01-04

我正在创建一个页面,供用户使用 React-Hook-Form 更新个人数据。 加载分页后,我使用useEffect获取用户当前的个人数据并将其设置为表单的默认值。

我将获取的值放入defaultValue of <Controller />。 但是,它只是没有显示在文本框中。 这是我的代码:

import React, {useState, useEffect, useCallback} from 'react';
import { useForm, Controller } from 'react-hook-form'
import { URL } from '../constants';

const UpdateUserData = props => {
    const [userData, setUserData] = useState(null);
    const { handleSubmit, control} = useForm({mode: 'onBlur'});

    const fetchUserData = useCallback(async account => {
        const userData = await fetch(`${URL}/user/${account}`)
                            .then(res=> res.json());
        console.log(userData);
        setUserData(userData);
    }, []);

    useEffect(() => {
        const account = localStorage.getItem('account');
        fetchUserData(account);
    }, [fetchUserData])

    const onSubmit = async (data) => {
        // TODO
    }

    return (
        <div>
            <form onSubmit={handleSubmit(onSubmit)}>
                <div>
                    <label>User Name:</label>
                    <Controller
                        as={<input type='text' />}
                        control={control}
                        defaultValue={userData ? userData.name : ''}
                        name='name'
                    />
                </div>
                
                <div>
                    <label>Phone:</label>
                    <Controller
                        as={<input type='text' />}
                        control={control}
                        defaultValue={userData ? userData.phone : ''}
                        name='phone'
                    />
                </div>
                <button>Submit</button>
            </form>
        </div>
    );
}

export default UpdateUserData;

调用的API运行良好,该值实际上设置为userData state.

{
  name: "John",
  phone: "02-98541566"
  ...
}

我也尝试过setUserData与模拟数据useEffect(),而且它也不起作用。 我上面的代码有问题吗?


@tam 的答案是使其与 6.8.3 版本一起工作所需的一半。

您需要提供默认值,还需要使用Effect 来重置。如果您有一个使用另一个实体重新加载的表单,则需要这种特殊的区别。我有一个完整的例子代码沙箱在这里 https://codesandbox.io/s/usereacthookformdefaultvalue-h6d71?file=/src/MyForm.tsx.

简而言之,你需要定义你的defaultValues in the useForm:

const { register, reset, handleSubmit } = useForm({
    defaultValues: useMemo(() => {
        return props.user;
    }, [props])
});

然后你需要倾听潜在的变化。

useEffect(() => {
    reset(props.user);
}, [props.user]);

代码沙箱中的示例允许在两个用户之间交换并让表单更改其值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 useEffect() 更改 React-Hook-Form defaultValue? 的相关文章

随机推荐

  • 如何在稳定基线3中获得action_propability()

    我刚刚开始自学稳定基线 3 的强化学习 我的长期目标是训练代理玩特定的回合制棋盘游戏 不过 目前我对新事物感到非常不知所措 我已经实现了一个健身房环境 我可以用它来手动玩游戏或让它选择随机动作 目前 我一直在尝试让一个模型根据观察结果向我提
  • Play 框架将 HTTP 重定向到 https

    我使用 play 框架版本 2 2 3 并使用以下命令运行 activator 以使用 https 访问站点 activator run Dhttp port disabled Dhttps port 9043 我在浏览器中输入了 URL
  • Prolog 和逻辑难题

    我似乎对 Prolog 中事实的统一有疑问 但无法确认 一切看起来都像这样should工作 并且考虑到 Prolog 的相对稀有性 我查找了使用 Prolog 解决逻辑难题的示例 但没有实际效果 This is额外的学分作业 所以我不确定它
  • Android 4.4 SDK 更新后 android-support-v7-appcombat jar 不匹配和应用程序崩溃

    过去几个月我已经在我的应用程序中成功使用 android support v7 appcompat 库来支持旧设备中的操作栏 最近我从 SDK Manager 下载了 Android 4 4 kitkat 更新以及系统映像和 SDK 平台
  • 理解自然连接的困难[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何确保在数据加载之前我不会访问数据?

    我是编程新手 我的代码收到错误 致命错误 在展开可选值时意外发现 nil 2017 10 27 16 06 16 755817 0200 Inspireme1 0 836 85307 致命错误 在展开可选值时意外发现 nil LLDB 新错
  • 卷曲 ssl 证书

    我总是在curl中关闭CURLOPT SSL VERIFYPEER 但我真的想在我的php centos curl检查其证书的地方进行升级 我有 CENTOS 4 7 i686 PHP 5 2 16 我从 stripe com 得到了一个不
  • 如何在 Apache CXF 中引发 403 错误 - Java

    我基于拦截器使用以下代码 当 check 返回 true 时 我想抛出 403 错误 Override public void handleMessage Message arg0 throws Fault HttpServletReque
  • 将 bg 和 fg 与给定 PID 一起使用

    我正在使用Ubuntu 如果给我一个作业的 PID 我怎样才能将暂停的作业转到后台 前台和运行状态 I know bg fg但他们要求job id not PID 另外 我暂停工作 kill STOP
  • Boost::Spirit 表达式解析器

    我的 boost spirit 解析器还有另一个问题 template
  • 在方法开始和结束时进行错误处理的优缺点是什么

    根据我的程序员的经验 我混合了所有可能的错误处理方式 我创建了我的个人风格 不过 我想听听您认为的优点和缺点方法开始时与方法结束时的错误处理 一开始的处理 public String GenerateSomeStringData Strin
  • ReactJS - 如何使用 javascript 访问组件的 displayName?

    我正在构建一些 React 组件 有时想将正在渲染的组件类型记录到控制台 方法是displayName JSX 在显示组件名称时使用它 从组件的上下文中 我如何访问displayName财产 例如我怎样才能使console log本例中的语
  • IE 11 于 22 年 6 月终止生命后,VBA 互联网控制功能还会起作用吗?

    正如标题所问 我使用的某些工具依赖于带有 Internet Control 的 VBA 代码来进行网页抓取和控制 IE 页面 随着 IE11 明年即将终止 有谁知道这将如何影响 VBA 中的 Internet 控制或者它是否仍然有效 试图弄
  • PHP - 具有相对路径的 include() 或 require() 在 Windows 上不起作用,即使附加 __DIR__ 也是如此

    我在这里阅读有关 PHP 使用 include 或 required 与相对路径时出现的问题 我看到的所有解决方案都是附加DIR 我目前正在 Windows 上工作 即使错误消息显示了当前值DIR 那么相对路径似乎是作为字符串添加的 而不是
  • 使用 Twig 使两个数组相交

    我有两个想要相交的数组 我得到了这两个数组 转储 数组1 array 6 0 gt array 2 id gt int 121 text gt string 3 uno 1 gt array 2 id gt int 122 text gt
  • 如何测量 SQL 填充因子值

    通常 当我在表上创建索引时 我通常会猜测Fill Factor应基于对表的使用方式 多次读取或多次写入 的有根据的猜测 有没有更科学的方法来判断更准确Fill Factor value 您可以尝试运行大量实际操作并查看 IO 队列以了解不同
  • Visual Studio 2008 中的 .NET 2.0 安装项目

    我开发了一个针对 net 2 0 的 win forms 应用程序 所有这些都在 Visual Studio 2008 sp1 中 我这样做是因为我并不真正需要应用程序中的 3 0 功能 我不希望客户在可以安装半大型框架的情况下必须安装一个
  • Kotlin:Kotlin 脚本 (.kts) 无法使用常规代码?

    在我的库的代码库中 我有这个包函数 fun sayHello println Hello there 该函数在包中定义org jire pomade 我想在一个 kts像这样的文件 sayHello 不幸的是 我似乎无法让除了 Kotlin
  • 在从 VSTS 进行新部署之前删除 Azure 上的文件和文件夹

    作为 VSTS 中构建过程的一部分 我想在新部署之前从我的 Azure 站点中删除所有文件和文件夹 除了少数几个 我的猜测是 使用 Azure Powershell 脚本将是一个好主意 我更喜欢制作内联脚本 我使用 Azure 资源管理器作
  • 如何使用 useEffect() 更改 React-Hook-Form defaultValue?

    我正在创建一个页面 供用户使用 React Hook Form 更新个人数据 加载分页后 我使用useEffect获取用户当前的个人数据并将其设置为表单的默认值 我将获取的值放入defaultValue of