javascript - React:SubmitForm 中的无效钩子调用,自定义钩子 useSendFormData
问题描述
我做了一个钩子useSendFormData,当我使用它时,我得到了无效的钩子调用。
钩取
来自 SubmitForm 的数据
网址:字符串,
方法:post 或 put
成功:如果成功则成功消息
id:不是必需的,但如果项目有 id 我被添加到 api 调用。
代码:
export const useSendFormData = async ({
formData,
url,
method,
success,
id,
}) => {
const [data, setData] = useState({
error: "",
loading: true,
success: "",
data: [],
});
const setPartData = (partialData) => setData({ ...data, ...partialData });
try {
if (method === "post") {
const { data } = await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
setPartData({ data, success, error: null });
} else if (method === "put") {
const { data } = await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
setPartData({ data, success, error: null });
}
setPartData({
loading: false,
});
} catch (err) {
const { data } = err.response;
setPartData({
error: data.error,
success: null,
loading: false,
});
}
return {
data,
};
};
我在提交表单中调用它,我不知道这件事,但我使用 react-hook-forms 来处理表单
const sendFormData = useSendFormData
const handleForm = async (info) => {
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();
};
如果我改变
const sendFormData = useSendFormData
至
const sendFormData = useSendFormData()
我收到一个错误:
无法解构“未定义”的属性“formData”,因为它未定义
我怎样才能完成这项工作,如果您看到任何改进此自定义挂钩的方法,我将非常感谢您的帮助和时间。
解决方案
一旦调用钩子,您设计钩子的方式就会完成获取。相反,您应该sendFormData
在钩子中定义一个函数并将其与数据状态(或您需要的任何其他变量)一起返回。既然你想response.data
被退回,我将函数调整为 return response.data
:
export const useSendFormData = () => {
const [data, setData] = useState({
error: "",
loading: true,
success: "",
data: [],
});
const sendFormData = async ({
formData,
url,
method,
success,
id,
}) => {
const setPartData = (partialData) => setData({ ...data, ...partialData });
try {
let response
if (method === "post") {
response = await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
setPartData({ data: response.data, success, error: null });
} else if (method === "put") {
response = await axios.post(
`${SERVER_API}api/v1/${url}/${id ?? ""}`,
formData
);
setPartData({ data: response.data, success, error: null });
}
setPartData({
loading: false,
});
return response.data
} catch (err) {
const { data } = err.response;
setPartData({
error: data.error,
success: null,
loading: false,
});
return data
}
}
return {
data, sendFormData
};
};
有了它,您可以在组件主体上正确调用您的钩子,提取data
和sedFormData
:
// here you have your data state and sendFormData extracted
const { data, 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();
};
推荐阅读
- css - 最好在 CSS 的末尾对类似的媒体查询进行分组,还是在 CSS 中将它们分开?
- html - 当它是文本元素时,我怎么能将元素与其内容分开并改变它们的单独大小,而不是当它是图像时?
- php - MySQL 数据库没有保存我插入的数据,而是 0
- wordpress - wordpress如何将文件上传到ftp服务器
- sql - 如何在 microsoft access 查询中将多个条目合并为一个新值?
- sql-server - 不使用工具的 SQL Server 过程到 Oracle 过程
- python - 不预测所有给定的类opencv
- azure - Azure <> 本地 DNS 转发器解析
- java - 类型安全:来自 Class 的未经检查的强制转换
上课 - kotlin - Kotlin - 使用 SimpleXml 解析带有列表的 Xml 响应