我正在创建一个页面,供用户使用React Hook表单更新个人数据.

我将获取的值放入<Controller />中的defaultValue.

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"
  ...
}

我还try 在useEffect()中使用模拟数据创建setUserData,但它也不起作用.

推荐答案

你可以使用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]);

可以从表单中删除默认值.

编辑:如果这不起作用,请参阅下面的备选答案.

Reactjs相关问答推荐

如何使用mui为可重复使用的react 按钮应用不同的风格

如何使用React防止并发注册并处理Firestore数据库中的插槽可用性

为什么这个'Suspense'子组件在挂起promise解决后会丢失它的状态,而不是呈现?<>

构建next.js项目时状态不变,但在dev服务器中

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

Next.js:提交表单时状态尚未就绪

XChaCha20-Poly1305的解密函数

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

React,当我调用handleSubmit()函数时,我正在将application/json和multiform/data中的数据发送到后端,但student_image中没有数据:null

如何删除 bootstrap 手风琴上的边框

有没有办法在 React Router v6 中的路由匹配上运行一些逻辑/功能?

通过createRoot创建的React元素无法调用Provider值

无法读取未定义的属性(读取值)...TypeError:无法读取未定义的属性(读取值)

将 dict 值转换并插入到react 钩子的列表中

如何在 Reactjs 中判断受保护路由上的用户角色?

React Hooks 表单在日志(log)中显示未定义的用户名

哪个 PrivateRouter 实现更好:高阶组件还是替换?

在 redux 状态更改时更新react 按钮禁用状态

material uireact ,如何从表格中删除阴影?试图找到 api 但找不到正确的属性

如何从另一个切片中的不同切片获取状态并对其进行处理?