Javascript 在下一次渲染中获取数据时出现钩子
我使用SendFormData创建了一个钩子,当我使用它时,会得到无效的钩子调用Javascript 在下一次渲染中获取数据时出现钩子,javascript,reactjs,optimization,react-hooks,Javascript,Reactjs,Optimization,React Hooks,我使用SendFormData创建了一个钩子,当我使用它时,会得到无效的钩子调用 钩取 来自SubmitForm的数据 url:string 方法:邮寄或邮寄 成功:如果消息成功,则成功消息 id:不是必需的,但如果项具有id,则将i添加到api调用中 auth default false 问题是它会在渲染时丢失数据,我不知道如何更好地描述它,所以我制作了console.log ss 正如你们在第二次通话中看到的,我得到了数据,但后来它消失了 我的代码是: const
- 钩取
- 来自SubmitForm的数据
- url:string
- 方法:邮寄或邮寄
- 成功:如果消息成功,则成功消息
- id:不是必需的,但如果项具有id,则将i添加到api调用中
- auth default false
const sendFormData = async ({
formData,
url,
method,
success,
id,
auth = false,
}) => {
const setPartData = (partialData) => setData({ ...data, ...partialData });
try {
let response;
if (method === "post") {
response = await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
} else if (method === "put") {
response = auth
? await fetchContext.authAxios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
)
: await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
}
setPartData({
data: response.data,
loading: false,
success,
error: null,
});
} catch (err) {
const { data } = err.response;
setPartData({
error: data.error,
success: null,
loading: false,
});
}
return data;
};
return {
sendFormData,
};
};
在哪里使用它,它从SubmitForm获取数据并使用它进行api调用,正如您在ss i get Three undefined中看到的:
const { sendFormData } = useSendFormData()
const handleForm = async (info) => {
// here you have your response.data returned
const data = await sendFormData({
formData: info,
url: "auth/forgot-password",
method: "post",
success: "A password reset message has been sent to your email",
});
console.log(data);
reset();
};
如果你能帮忙,那就太棒了。如果你有任何关于这个钩子的优化建议,请告诉我。谢谢你的时间
Edit:编辑钩子,但不返回末尾的数据值TL;DR
const setPartData=(partialData)=>setData({…data,…partialData});
应改为
const setPartData=(partialData)=>setData(data=>({…data,…partialData}));
解释
setState
callback可以采用新的状态(您所做的),也可以采用另一个回调(应该做的)。您应该像这样传递回调,以确保sendFormData
中对setPartialData(someData)
的多个调用使用最新的data
状态来更新自身(组合partialData
)。这种方法是必要的,因为声明了const sendFormData=()=>{}
,其中使用的data
变量是函数块之外的任何data
变量(从const[data,setData]=useState()
)。此数据
不会在sendFormData()
运行时更新,而仅在组件渲染周期结束时更新
换句话说,
const[data,setData]=useState(initialData);
const sendFormData=()=>{
const setPartData=(partialData)=>setData({…data,…partialData});
setPartData(data1);//与initialData组合
setPartData(data2);//也与initialData组合
}
请注意,声明const setPartData
的位置无关紧要,只要它可以访问data
范围
另一方面,
const setPartData=(partialData)=>setData(data=>({…data,…partialData}));
当需要运行setData()
时,通过内部回调访问最新的data
状态
由于您构建的钩子可以返回数据
状态,因此一旦正确更新,您现在可以以更好的方式使用它
//App.js
const{data,sendFormData}=useSendFormData();
const sendAction=async(arg)=>wait-sendFormData(arg);
返回
发送数据
{data.success | | someCondition?数据:null}
重新发明轮子可能不是一个好主意,但我建议您努力使代码干燥。您能否明确说明是什么导致渲染,即丢失数据的渲染?它是否与
handleForm
末尾的reset()
调用有关?reset()
实际上做什么?reset()来自react hook表单,它是提交后唯一的重置表单值。我认为这可能只是简单的变量混淆。请注意,sendFormData
函数仅返回undefined
,而与成功/错误的api调用无关。因此data=wait sendFormData()
中的data
将始终是undefined
(位于控制台日志中)。显示带有实际内容的数据的控制台日志可能来自控制台。在useSendFormData
钩子中调用log(data)
,然后返回数据本身。我建议稍微重命名变量,并仔细检查哪些函数返回什么类型的内容。进行了更改,但没有help@98sean98添加对代码的编辑但steal不起作用非常感谢您的回答,但我有一个问题,我是否可以只返回sendFormData中的状态(数据)而不使用sendFormData?是的。只需在使用sendFormData
的末尾返回{data,sendFormData}
。但是请注意,数据
状态不会在不同组件中的多个useSendFormData()
实例之间共享。如果需要共享数据
,请使用或。如果要使用sendFormData
,则为所做的挂钩返回数据
,可以帮助您避免每次在不同组件中声明const[data,setData]=useState()。