在页面渲染完成 React.useEffect 调用之前渲染 React Hook 表单
React Hook form is being rendered before React.useEffect call is being completed on page rendering
我正在尝试使用 React.useEffect 中的 API 调用在呈现页面时呈现特定用户信息。在同一页面上,我使用了一个 React Hook 表单,它根据来自 useEffect 的 API 调用设置默认值。
问题是 React Hook 表单首先在页面呈现时呈现,并将用户信息设置为未定义,然后仅发生设置用户信息的 React.useEffect 调用。这样,它将始终给我默认的用户值,而不是来自 API 调用的值。
这是代码
const [clients, setClients] = useState<Client>();
React.useEffect(()=>{
api.get<Client>('/clients/4').then(
(response)=> {
const clientResponse = response.data;
setClients(clientResponse);
},
error => {
console.log(error);
}
)
},[]);
const methods = useForm<Client>({
defaultValues: clients ? clients : defaultClientValues,
reValidateMode: 'onChange',
mode: 'onChange',
validationSchema: clientSchema,
});
关于这一点,我总是在 useForm 方法中的 defaultValues 中将客户端设置为未定义。
也尝试使用 React.useLayoutEffect() 但它似乎给了我同样的结果。
如评论中所述,By default, React runs the effects after every render — including the first render
。
如果子组件没有获得更新的值,您可以创建另一个 hook
,并将 clients
分配给 ref
并每次更新 ref
clients
值更改。
const clientsRef = React.useRef(defaultClientValues);
React.useEffect(() => {
api.get<Client>('/clients/4').then(
(response) => {
const clientResponse = response.data;
setClients(clientResponse);
},
error => {
console.log(error);
}
)
}, []);
React.useEffect(() => {
clientsRef.current = clients;
}, [clients);
const methods = useForm<Client>({
defaultValues: clientsRef.current ? clientsRef.current : defaultClientValues,
reValidateMode: 'onChange',
mode: 'onChange',
validationSchema: clientSchema,
});
我正在尝试使用 React.useEffect 中的 API 调用在呈现页面时呈现特定用户信息。在同一页面上,我使用了一个 React Hook 表单,它根据来自 useEffect 的 API 调用设置默认值。
问题是 React Hook 表单首先在页面呈现时呈现,并将用户信息设置为未定义,然后仅发生设置用户信息的 React.useEffect 调用。这样,它将始终给我默认的用户值,而不是来自 API 调用的值。
这是代码
const [clients, setClients] = useState<Client>();
React.useEffect(()=>{
api.get<Client>('/clients/4').then(
(response)=> {
const clientResponse = response.data;
setClients(clientResponse);
},
error => {
console.log(error);
}
)
},[]);
const methods = useForm<Client>({
defaultValues: clients ? clients : defaultClientValues,
reValidateMode: 'onChange',
mode: 'onChange',
validationSchema: clientSchema,
});
关于这一点,我总是在 useForm 方法中的 defaultValues 中将客户端设置为未定义。
也尝试使用 React.useLayoutEffect() 但它似乎给了我同样的结果。
如评论中所述,By default, React runs the effects after every render — including the first render
。
如果子组件没有获得更新的值,您可以创建另一个 hook
,并将 clients
分配给 ref
并每次更新 ref
clients
值更改。
const clientsRef = React.useRef(defaultClientValues);
React.useEffect(() => {
api.get<Client>('/clients/4').then(
(response) => {
const clientResponse = response.data;
setClients(clientResponse);
},
error => {
console.log(error);
}
)
}, []);
React.useEffect(() => {
clientsRef.current = clients;
}, [clients);
const methods = useForm<Client>({
defaultValues: clientsRef.current ? clientsRef.current : defaultClientValues,
reValidateMode: 'onChange',
mode: 'onChange',
validationSchema: clientSchema,
});