代码之家  ›  专栏  ›  技术社区  ›  Hannan Yusuf Khan

无法呈现,REACT

  •  0
  • Hannan Yusuf Khan  · 技术社区  · 2 年前

    我是网络开发和学习React的新手。我已经将ZOD用于表单实现。我的IDE并没有显示任何错误,但当我点击提交按钮时,屏幕不会被重新渲染。如果有人能帮我就好了。我知道这是个小问题,但我已经挠头一天多了。

    APP.TSX
    import { useEffect, useState } from "react";
    import StudentGradingEvaluationForm, {
      StudentFormData,
    } from "./Components/StudentGradingEvaluationForm";
    import GPACalculator from "./Components/GPACalculator";
    import "./Components/Courses";
    
    const App = () => {
      const [formData, setFormData] = useState<StudentFormData | null>(null);
      const [isFormSubmitted, setIsFormSubmitted] = useState(false);
    
      const handleFormSubmitted = (data: StudentFormData) => {
        if (data) {
          setFormData(data);
          setIsFormSubmitted(true);
        }
      };
    
      const resetForm = () => {
        setFormData(null);
        setIsFormSubmitted(false);
      };
    
      return (
        <>
          <div style={{ textAlign: "center" }}>
            <h1>GPA Calculator for Individual Student</h1>
          </div>
          <div>
            {!isFormSubmitted && (
              <StudentGradingEvaluationForm onSubmit={handleFormSubmitted} />
            )}
            {isFormSubmitted && !formData && (
              <p className="text-danger">Enter correct credentials</p>
            )}
          </div>
          {formData && (
            <button className="btn btn-outline-danger" onClick={resetForm}>
              Reset Form
            </button>
          )}
          {formData && formData.courses && (
            <GPACalculator
              subject={formData.courses}
              number={formData.number}
              name={formData.name}
            />
          )}
        </>
      );
    };
    
    export default App;
    
    StudentGradingEvaluationForm.tsx
    
    import { z } from "zod";
    import { useForm } from "react-hook-form";
    import { zodResolver } from "@hookform/resolvers/zod";
    import courses from "./Courses";
    
    const schema = z.object({
      name: z
        .string()
        .min(3, { message: "Description should be atleast 3 characters." }),
      number: z.number().min(0).max(100),
      courses: z.enum(courses, {
        errorMap: () => ({ message: "Course is required." }),
      }),
    });
    
    export type StudentFormData = z.infer<typeof schema>;
    
    interface Props {
      onSubmit: (data: StudentFormData) => void;
    }
    
    const StudentGradingEvaluationForm = ({ onSubmit }: Props) => {
      const { register, handleSubmit } = useForm<StudentFormData>({
        resolver: zodResolver(schema),
      });
    
      return (
        <form
          onSubmit={handleSubmit((data) => {
            onSubmit(data);
            console.log(onSubmit);
          })}
        >
          <div className="mb-3">
            <label htmlFor="studentName" className="form-label">
              Name of Student
            </label>
            <input
              id="studentName"
              type="text"
              className="form-control"
              {...register("name")}
            />
          </div>
          <div className="mb-3">
            <label htmlFor="courseName" className="form-label">
              Name of Course
            </label>
            <div>
              <select
                id="courseName"
                className="select-control"
                {...register("courses")}
              >
                <option value=""></option>
                {courses.map((course) => (
                  <option key={course} value={course}>
                    {course}
                  </option>
                ))}
              </select>
            </div>
          </div>
          <div className="mb-3">
            <label htmlFor="number" className="form-label">
              Enter Number
            </label>
            <input
              id="number"
              type="number"
              className="form-control"
              {...register("number")}
            />
          </div>
          <button type="submit" className="btn btn-primary">
            Submit
          </button>
        </form>
      );
    };
    
    export default StudentGradingEvaluationForm;
    
    Courses.ts
    
    const courses = [
      "Mechanics of Materials - I",
      "Fluid Dynamics - I",
      "Ordinary Differential Equations",
      "Thermodynamics - II",
      "Basic Electrical and Electronics Engineering",
    ] as const;
    
    export default courses;
    
    GPACalculator.tsx
    
    interface Props {
      subject: string;
      name: string;
      number: number;
    }
    const GPACalculator = ({ subject, number, name }: Props) => {
      const calculateGpa = () => {
        if (number < 100 && number >= 80) return "A";
        else if (number < 80 && number >= 65) return "B";
        else if (number < 65 && number >= 55) return "C";
        else if (number < 55 && number >= 40) return "D";
        else return "FAIL";
      };
      return (
        <div>
          <h2>GPA Calculator Result for {name}</h2>
          <p>Subject: {subject}</p>
          <p>Number: {number}</p>
          <p>GPA: {calculateGpa()}</p>
        </div>
      );
    };
    
    

    导出默认的GPACalculator;

    我使用了以下依赖项:

    npm创建 [email protected] npm i引导程序npm i zod npm i [email protected] npm i@hookform/ [email protected]

    VS代码没有显示任何错误。我一点击提交按钮,什么也没发生。我相信我的代码简单明了。期待帮助。

    2 回复  |  直到 2 年前
        1
  •  0
  •   Ganesh Shinde    2 年前

    默认情况下,react钩子形式将输入值视为字符串

    我将Schema z.number()更新为z.convorce.number()

    const schema = z.object({
      name: z.string().min(3, { message: "Description should be atleast 3 characters." }),
      number: z.coerce
        .number()
        .min(1, { message: "number is less than 1" })
        .max(100, { message: "number is more than 100" }),
      courses: z.enum(courses, {
        errorMap: () => ({ message: "Course is required." }),
      }),
    });
    

    我添加信息是为了更好地理解

      <form
          onSubmit={handleSubmit((data) => {
            onSubmit(data);
            console.log(onSubmit);
          })}>
          <div className='mb-3'>
            <label htmlFor='studentName' className='form-label'>
              Name of Student
            </label>
            <input id='studentName' type='text' className='form-control' {...register("name")} />
            <span className='text-danger d-block  mt-2'>{formState.errors?.name?.message}</span>
          </div>
          <div className='mb-3'>
            <label htmlFor='courseName' className='form-label'>
              Name of Course
            </label>
            <div>
              <select id='courseName' className='select-control' {...register("courses")}>
                <option value=''></option>
                {courses.map((course) => (
                  <option key={course} value={course}>
                    {course}
                  </option>
                ))}
              </select>
    
              <span className='text-danger d-block  mt-2'>{formState.errors?.courses?.message}</span>
            </div>
          </div>
          <div className='mb-3'>
            <label htmlFor='number' className='form-label'>
              Enter Number
            </label>
            <input id='number' type='number' className='form-control' {...register("number")} />
            <span className='text-danger d-block  mt-2'>{formState.errors?.number?.message}</span>
          </div>
          <button type='submit' className='btn btn-primary'>
            Submit
          </button>
        </form>
    
        2
  •  0
  •   Obydul Islam Khan    2 年前

    所以问题是,您的代码没有错误。您的代码运行良好。但是您有zod解析器的表单验证错误。由于您没有显示任何表单错误,您在这里看不到问题。

    附加当前代码中的错误- enter image description here

    如何修复:

    <input
          id="number"
          type="text"
          className="form-control"
          {...register("number", {
            valueAsNumber: true,
          })}
        />
    

    只需注册 数字 输入,如我在这里所示。

    还有一件事:

    const { register, handleSubmit, formState: { errors } } = useForm({
    resolver: zodResolver(schema),});
    console.log("errors =====>", errors)
    

    在的顶部更新代码中的这些行 学生毕业评估表 组件,以查看错误状态日志。

    如果这有帮助,请投赞成票!

    如果你有任何问题,请告诉我。