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

新手上路,请多包涵

我正在创建一个页面供用户使用 React-Hook-Form 更新个人数据。加载 paged 后,我使用 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() ,它也不起作用。我上面的代码有什么问题吗?

原文由 theedchen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

您可以使用 setValue ( https://react-hook-form.com/api/useform/setvalue )。

从 useForm 导入它:

 const { handleSubmit, control, setValue} = useForm({ mode: 'onBlur' });

然后在收到用户数据后调用它:

 useEffect(() => {
    if (userData) {
        setValue([
            { name: userData.name },
            { phone: userData.phone }
        ]);
    }
}, [userData]);

您可以从表单中删除默认值。

编辑:如果这不起作用,请参阅下面的替代答案。

原文由 user10182688 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

您需要提供默认值,还要使用 Effect 进行重置。如果您有一个用另一个实体重新加载的表单,则需要这种特殊区别。我在 这里的 CodeSanbox 中有一个完整的示例。

简而言之: 您需要在 userForm 中定义默认值。

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

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

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

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

原文由 Patrick Desjardins 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题