iXdi - Σύγχρονος προγραμματισμός

Η επικύρωση Formik και yup επικυρώνει ένα μη απαιτούμενο πεδίο εισαγωγής αρχείου

Έχω ένα πεδίο εισαγωγής (αρχείο τύπου) που για κάποιο λόγο επικυρώνεται παρόλο που δεν απαιτείται. Με τον σειριακό αριθμό έχω επικύρωση και δεν απαιτείται και φαίνεται να λειτουργεί καλά, δεν υπάρχουν σφάλματα κατά την υποβολή του κενού πεδίου. Για το πεδίο εισαγωγής αρχείου θέλω μόνο το πεδίο εισαγωγής να επικυρώνεται όταν γίνεται αποστολή ενός αρχείου. Τι κάνω λάθος;, το αντιλαμβάνομαι (δείτε την παρακάτω εικόνα) όταν κάνω κλικ στην υποβολή για να δοκιμάσω την επικύρωση.

εδώ είναι ο κωδικός μου:

const validationSchema = Yup.object({
    title: Yup.string()
      .required("Title is required")
      .min(8, "Title must be at least 8 characters")
      .max(100, "Title cannot be more than 100 characters"),
    description: Yup.string()
      .required("Description is required")
      .min(8, "Description must be at least 8 characters")
      .max(100, "Description cannot be more than 100 characters"),
    serialNumber: Yup.string()
      .min(4, "Serial number must be at least 4 characters")
      .max(16, "Serial number cannot be more than 16 characters"),
    productStatus: Yup.number().required("A Status is required"),
    productType: Yup.number().required("A type is required"),
    img: Yup.mixed()
      .test(
        "fileSize",
        "File size too large, max file size is 1 Mb",
        (file) => file && file.size <= 1100000
      )
      .test(
        "fileType",
        "Incorrect file type",
        (file) =>
          file && ["image/png", "image/jpg", "image/jpeg"].includes(file.type)
      ),
  });
{formik.errors["img"] && formik.touched["img"] && (
                  <div style={{ color: "#B2484D", fontSize: ".8rem" }}>
                    {formik.errors.img}
                  </div>
                )}

           <Field name="img">
                  {() => {
                    // < - this will take fieldProps.. not used in this case, using formik instead
                    return (
                      <>
                        <input
                          onBlur={formik.handleBlur}
                          onChange={({ currentTarget }) => {
                            const file = currentTarget.files![0];
                            const reader = new FileReader();

                            if (file) {
                              reader.onloadend = () => {
                                setSelectedFile({
                                  file,
                                  previewURI: reader.result!,
                                });

                                setuploadbtnLabel(
                                  `You selected: ${file.name} - click again to change`
                                );
                              };
                              reader.readAsDataURL(file);
                              formik.setFieldValue("img", file);
                            }
                          }}
                          ref={inputFile}
                          type="file"
                          style={{ display: "none" }}
                          accept=".png,.jpg,.jpeg"
                        />
                      </>
                    );
                  }}
                </Field>

ΕΠΕΞΕΡΓΑΣΙΑ: εδώ είναι ένα codesandbox https://codesandbox.io/s/thirsty-chandrasekhar-34q1q?file=/src/App.js


Απαντήσεις:


1

Νομίζω ότι θα πρέπει να προσπαθήσετε να προσθέσετε notRequired() ή ακόμα και nullable() στο πεδίο img στον ορισμό του σχήματος YUP. Από Yup έγγραφα:

Επισημάνετε το σχήμα ως μη απαραίτητο. Η μεταβίβαση απροσδιόριστης (ή μηδενικής τιμής για μηδενικό σχήμα) ως τιμής δεν θα αποτύχει στην επικύρωση.

Επεξεργασία: Με βάση το sandbox που παρείχατε, μπόρεσα να το καταλάβω. Το πρόβλημα προέρχεται από τη δοκιμή που προσθέσατε. Βασικά το ζήτημα είναι ότι το file είναι ακαθορισμένο όταν δεν επιλέγεται κανένα αρχείο, επομένως η επικύρωση αποτυγχάνει πάντα.

Για παράδειγμα, μπορείτε να αλλάξετε αυτό:

 .test(
    "fileSize",
    "File size too large, max file size is 1 Mb",
    (file) => file && file.size <= 1100000
  )

Σ 'αυτό:

.test(
    "fileSize",
    "File size too large, max file size is 1 Mb",
    (file) => {
      if (file) {
        return file.size <= 1100000;
      } else {
        return true;
      }
    }
  )

Τα notRequired() ή nullable() δεν είναι καν απαραίτητα για να λειτουργήσει με τον τρόπο που περιμένετε. Εδώ είναι ο σύνδεσμος για το περιβάλλον δοκιμών με αυτήν την επιδιόρθωση. Εάν αυτό λειτουργεί για εσάς, σημειώστε την απάντηση ως αποδεκτή.

Καλή τύχη!

14.12.2020
  • Προστέθηκε notRequired και χωρίς επιτυχία, στη συνέχεια προστέθηκαν και τα δύο nonRequired και nullable, αλλά ούτε και με αυτό. 15.12.2020
  • Διακλάδωσα αυτό το αρχικό sandbox ώστε να μπορείτε να δοκιμάσετε τη συμπεριφορά του notRequired() εδώ Δοκιμάστε να αλλάξετε τη γραμμή 76. Ελπίζω να σας βγει σε καλό! 15.12.2020
  • ευχαριστώ, αλλά και πάλι δεν διορθώνει το πρόβλημα.. συνεχίζει να εμποδίζει την υποβολή της φόρμας και εμφανίζει το σφάλμα εάν δεν αγγίξετε το πεδίο αρχείου ή αφήσετε κενό. 15.12.2020
  • Γεια! Πρόσθεσα μια λειτουργική λύση στην αρχική απάντηση, ελέγξτε την! 16.12.2020
  • Άλλαξα το (file) => file && file.size <= 1100000 σε (file) => file ? file.size <= 1100000 : true και φαίνεται να λειτουργεί. Θα κάνω περισσότερες δοκιμές, ΕΥΧΑΡΙΣΤΩ! 19.12.2020
  • Νέα υλικά

    Το Python Selenium Web Scraping σας κατέβασε το 2023; Εκκαθαρίστε την προσωρινή μνήμη και ενισχύστε τα αποτελέσματά σας!
    Η απόξεση ιστού με το Python Selenium είναι ένα εξαιρετικό εργαλείο για την εξαγωγή δεδομένων από ιστοσελίδες. Ωστόσο, περιστασιακά, οι ιστοσελίδες ενδέχεται να αποτύχουν να φορτώσουν ή να..

    Έννοιες JavaScript που πρέπει να γνωρίζετε για να ξεκινήσετε με το React
    Αφού είδα αυτή την ερώτηση να τίθεται αμέτρητες φορές, πιστεύω ότι μπορεί να είναι χρήσιμο σε πολλούς ανθρώπους εκεί έξω να έχουν μια σαφή κατανόηση του τι χρειάζεται να είναι γνωστό στο..

    Χρήση της C++ ως γλώσσας δέσμης ενεργειών, μέρος 8
    Βελτίωση κλήσεων λειτουργιών API με χρήση ενσωματωμένης συναρμολόγησης Έχω πειραματιστεί με την ενσωματωμένη συναρμολόγηση στο παρελθόν με κάποια επιτυχία. Είναι περίπλοκο και εύκολο να κάνεις..

    5 αμυχές που πρέπει να γνωρίζετε για να γίνετε σπουδαίος προγραμματιστής.
    5 αμυχές που πρέπει να γνωρίζετε για να γίνετε σπουδαίος προγραμματιστής. Αυτές τις μέρες, πολλοί φιλοδοξούν να εργαστούν ως προγραμματιστές. Αλλά το να γίνεις σπουδαίος προγραμματιστής δεν..

    Πώς να εφαρμόσετε το Deep Learning σε δομημένα δεδομένα
    Η βαθιά μάθηση είναι ένα καυτό και περιζήτητο θέμα τώρα ως μέρες. Η επιτυχία του προέρχεται από το γεγονός ότι είναι εξαιρετικά αποτελεσματικό στην επίλυση σύνθετων προβλημάτων και στην επίτευξη..

    Είναι το AI καλύτερο από τα ζώα στο να βλέπουν στο σκοτάδι;
    Τέχνη Μηχανικής Εκμάθησης Είναι η τεχνητή νοημοσύνη καλύτερη από τα ζώα στο να βλέπουν στο σκοτάδι; Τα όρια της όρασης ρομπότ στο ακραίο σκοτάδι Μελέτη της συμπεριφοράς των ζώων τη..

    Νέα δυνατότητα: Αναπτύξτε περισσότερο τον ανοιχτό κώδικα με το IssueHunt Upvotes
    Είμαστε στην ευχάριστη θέση να σας παρουσιάσουμε τη νεότερη λειτουργία μας: IssueHunt Upvote , τον τέλειο τρόπο υποστήριξης, κοινής χρήσης και παρακολούθησης του αγαπημένου σας ανοιχτού..