【问题标题】:React: Invalid hook call in SubmitForm, custom hook useSendFormDataReact:SubmitForm 中的无效钩子调用,自定义钩子 useSendFormData
【发布时间】:2021-01-28 13:52:24
【问题描述】:

我做了一个钩子useSendFormData,当我使用它时,我得到了无效的钩子调用。

上钩

  • 来自 SubmitForm 的数据

  • 网址:字符串,

  • 方法:发布或放置

  • 成功: 成功时的成功消息

  • id:不需要,但如果项目有 id i 被添加到 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”,因为它是未定义的

我怎样才能完成这项工作,如果您发现任何改进此自定义挂钩的方法,我将非常感谢您的帮助和时间。

【问题讨论】:

    标签: javascript reactjs optimization react-hooks react-hook-form


    【解决方案1】:

    你设计你的钩子的方式,一旦钩子被调用,获取就完成了。相反,您应该在您的钩子中定义一个sendFormData 函数并将其与数据状态(或您需要的任何其他变量)一起返回。由于您希望返回response.data,因此我调整了函数以返回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();
    };
    

    【讨论】:

    • 但我希望 axios 的响应设置在 setData useState hook 中是不是可能?
    • 现在是否正常工作,还是有其他问题?
    • 我不知道为什么我们不能只在 sendFormData 中返回数据状态。
    • 如果您实际上是指函数 sendFormData,setPartData 是异步的,因此您不会立即获得更新的状态。如果你从它返回 data 而不是 response.data,你将得到一个过时的状态值。
    • 如果我将在 useEffect 中使用它,它会起作用吗?只在 sendFormData 中返回它?
    猜你喜欢
    • 2020-12-02
    • 2019-08-17
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2021-09-05
    • 2021-09-29
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多