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

标签 javascript reactjs react-hooks react-hook-form

我正在创建一个页面供用户使用 React-Hook-Form 更新个人数据。
加载分页后,我使用 useEffect获取用户当前的个人数据并将其设置为表单的默认值。
我将获取的值放入 defaultValue<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状态。
{
  name: "John",
  phone: "02-98541566"
  ...
}
我也试过setUserData模拟数据在 useEffect() ,它也不起作用。
我上面的代码有什么问题吗?

最佳答案

@tam 答案是使它与 6.8.3 版一起工作所需的一半。
你需要提供默认值还要使用Effect来重置。如果您有一个与另一个实体一起重新加载的表单,则需要这种特殊的区别。我在 CodeSanbox here 中有一个完整的示例.
简而言之:
您需要在 userForm 中定义默认值.

 const { register, reset, handleSubmit } = useForm({
    defaultValues: useMemo(() => {
      return props.user;
    }, [props])
  });
然后你需要倾听潜在的变化。
  useEffect(() => {
    reset(props.user);
  }, [props.user]);
代码沙箱中的示例允许在两个用户之间进行交换并让表单更改其值。

关于javascript - 如何使用 useEffect() 更改 React-Hook-Form defaultValue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62242657/

相关文章:

javascript - ESLint 希望 setSate 作为 useEffect 的依赖项,但这会导致无限循环(react-hooks/exhaustive-deps)

javascript - Yeoman/Grunt 不编译 Compass

javascript - Node JS在ejs文件中加载js和css文件

javascript - 如何编写仅在多次单击时才有效的按钮

reactjs - 没有当前用户 AWS Amplify 身份验证错误 - 无需登录即可访问

javascript - 不带钩子(Hook)地更新文档标题

javascript - 在jsp中打开模态窗口

reactjs - React Hook 并获取 : How to update a table based on a user input from an API search

css - 不变违规 : Text strings must be rendered within a Text component

reactjs - useState 和 useImmer 有什么区别?