将函数导入 React 组件并在 onSubmit 中使用

Import function into react component and use it in onSubmit

我希望生成一个使用 formData(来自表单输入)和数据(来自 react 上下文)的 pdf。因此,不同来源的数据汇集在 pdf 中。

我有一个组件表单,它有一个 onSubmit 函数,它基本上有一个任务来生成这个 pdf。下面只是它的相关部分:

export const Form = () => {
  const onSubmit = (formData) => {
    generatePdf(formData);
  };
}

在另一个文件中,我有我的 pdf 逻辑,我将其导入到表单组件中:

import { jsPDF } from "jspdf";

import { useFormData } from "../context";

export default function generatePdf (formData) {
    const data = useFormData();
    const chosenContract = Object.values(data.contract);
    const doc = new jsPDF();
    doc.setFontSize(14)
    doc.setFont('undefined', 'bold'),
    doc.text(10, 20, 'Hallo! Folgender Vertrag wurde gerade online abgeschlossen: ');
    doc.setFontSize(10);
    doc.setFont('undefined', 'normal'),
    doc.text(chosenContract[1] + ',', 10, 35);
    doc.text(chosenContract[2] + ' ' + '€/monatlich' + ',', 10, 40);
    doc.text(chosenContract[4], 10, 45);
    doc.setFontSize(14)
    doc.setFont('undefined', 'bold'),
    doc.text(10, 60, 'Der Nutzer hat folgende Daten hinterlassen:');
    doc.setFontSize(10);
    doc.setFont('undefined', 'normal'),
    doc.text(JSON.stringify(formData), 10, 70);
    window.open(URL.createObjectURL(doc.output("blob")))
    { console.log(formData);} 
}

因为我是初学者,所以我有点迷茫,如何以及将哪些参数传递给 generatePdf,以便它在我的表单组件中工作。现在我只收到 Error: Invalid hook call。钩子只能在函数组件的主体内部调用。这可能由于以下原因之一而发生:

我还尝试将数据和 formData 传递到 generatePdf 函数 function generatePdf (data,formData) 并在 Form 组件中定义数据,但后来我在 generatePdf 中得到了 undefined for const chosenContract = Object.values(data.contract);.

最初我的代码全部在 Form 中并且它显然有效,但是随着 Form 组件变长,我打算遵循干净的代码规则并外包我的 pdf 逻辑。原代码如下:

export const Form = () => {
  const { data } = useFormData();

  const onSubmit = (formData) => {
    const chosenContract = Object.values(data.contract);
    const doc = new jsPDF();
    doc.setFontSize(14)
    doc.setFont('undefined', 'bold'),
    doc.text(10, 20, 'Hallo! Folgender Vertrag wurde gerade online abgeschlossen: ');
    doc.setFontSize(10);
    doc.setFont('undefined', 'normal'),
    doc.text(chosenContract[1] + ',', 10, 35);
    doc.text(chosenContract[2] + ' ' + '€/monatlich' + ',', 10, 40);
    doc.text(chosenContract[4], 10, 45);
    doc.setFontSize(14)
    doc.setFont('undefined', 'bold'),
    doc.text(10, 60, 'Der Nutzer hat folgende Daten hinterlassen:');
    doc.setFontSize(10);
    doc.setFont('undefined', 'normal'),
    doc.text(JSON.stringify(formData), 10, 70);
    window.open(URL.createObjectURL(doc.output("blob")))
    console.log(formData)
    //makeContract();
  };
}

你可以使用两者之间的东西。 useFormData 钩子必然需要在 React 组件中调用,即 Form 组件。

我建议将实用程序逻辑分开以实现可维护性和关注点分离,并从挂钩中传入 data

generatePdf 实用程序

import { jsPDF } from "jspdf";

export default function generatePdf (formData, data) {
  const chosenContract = Object.values(data.contract);
  const doc = new jsPDF();

  doc.setFontSize(14);
  doc.setFont('undefined', 'bold');
  doc.text(10, 20, 'Hallo! Folgender Vertrag wurde gerade online abgeschlossen: ');
  doc.setFontSize(10);
  doc.setFont('undefined', 'normal');
  doc.text(chosenContract[1] + ',', 10, 35);
  doc.text(chosenContract[2] + ' ' + '€/monatlich' + ',', 10, 40);
  doc.text(chosenContract[4], 10, 45);
  doc.setFontSize(14);
  doc.setFont('undefined', 'bold');
  doc.text(10, 60, 'Der Nutzer hat folgende Daten hinterlassen:');
  doc.setFontSize(10);
  doc.setFont('undefined', 'normal');
  doc.text(JSON.stringify(formData), 10, 70);
  window.open(URL.createObjectURL(doc.output("blob")));
}

表格

import { useFormData } from "../context";

export const Form = () => {
  const { data } = useFormData();

  const onSubmit = (formData) => {
    generatePdf(formData, data);
  };

  ...
}