разрешение сообщения об ошибке Ошибка: схема не содержит путь: шпинат. (сбой: undefined, тип: объект)

  1. это форма пиццы.
  2. Когда я нажимаю на радио, чтобы выбрать соус, страница вылетает.
  3. желание состоит в том, чтобы пользователь назвал заказ.
  4. тогда можно будет выбрать только 1 тип соуса.
  5. затем выберите начинку
  6. затем отправьте.
  7. должна иметь возможность отправлять только после того, как поле имени и выбраны выбранные.
  8. затем проверить форму?

    импортировать React, {useState, useEffect} из "react";

    import * as yup from "yup";

    const formSchema = yup.object (). shape ({

    id: yup.string (). required ("Обязательно"),

    имя: да

    .string()
    
    .min(2, "You name should have 2 characters")
    
    .required("You don't have a name?"),
    

    тип: да

    .string()
    
    .min(3, "Must be at least 3 characters")
    
    .required("Required"),
    

    значение: yup.string (). required ("Обязательно"),

    });

    const PizzaForm = () => {

    // управление состоянием формы

    const [formState, setFormState] = useState ({

    id: "",
    
    name: "",
    
    type: "",
    
    value: "",
    
    addOns: "",
    

    });

    const [ошибки, setErrors] = useState ({

    id: "",
    
    name: "",
    
    type: "",
    
    value: "",
    
    addOns: "",
    

    });

    const [buttonDisabled, setButtonDisabled] = useState (истина);

    const validate = (e) => {

    значение const =

    e.target.type === "флажок"? e.target.checked: e.target.name;

    yup
    
      .reach(formSchema, e.target.name)
    
      .validate(e.target.value)
    
      .then((valid) => {
    
        setErrors({
    
          ...errors,
    
          [e.target.name]: "",
    
        });
    
      })
    
      .catch((err) => {
    
        setErrors({
    
          ...errors,
    
          [e.target.name]: err.errors[0],
    
        });
    
      });
    

    };

    // функция formSubmit

    const formSubmit = (e) => {

    e.preventDefault();
    
    console.log("form submitted!", formState);
    

    };

    // функция onChange

    const onChange = (e) => {

    e.persist();
    
    validate(e); /*something wrong here, crashes when a radio is selected*/
    
    console.log(e.target.value, e.target.checked);
    
    const value = e.target.type === "radio" ? e.target.checked : 
    
    e.target.value;
    
    setFormState({ ...formState, [e.target.name]: value });
    

    };

    // функция handleChange

    const handleChange = (e) => {

    e.persist();
    
    setFormState({
    
      ...formState,
    
      addOns: [formState.addOns, e.target.value],
    
    });
    

    };

    // использовать функцию эффекта

    useEffect (() => {

    formSchema.isValid(formState).then((valid) => {
    
      setButtonDisabled(!valid);
    
    });
    

    }, [formState]);

    возвращение (

    <div>
    
      <form onSubmit={formSubmit}>
    
        <label htmlFor="name">
    
          Name Your Pizza:
    
          <input
    
            type="text"
    
            name="name"
    
            id="name"
    
            placeholder="Save for future orders!"
    
            value={formState.name}
    
            onChange={onChange}
    
          />
    
          {errors.name.length > 0 ? (
    
            <p className="error">{errors.name}</p>
    
          ) : null}
    
        </label>
    
        <h1> Build Your Own Pizza! </h1>
    
        <label htmlFor="size">
    
          <h3> What Size Pizza? </h3>
    
          Pizza Size:
    
          <select id="psize" name="psize">
    
            <option value="Small">Small</option>
    
            <option value="Medium">Medium</option>
    
            <option value="Large">Large</option>
    
            <option value="Extralarge">Extra Large</option>
    
          </select>
    
        </label>
    
        <h3> Select Your Sauce: </h3>
    
        <label htmlFor="redsauce" className="redsauce">
    
          <input
    
            type="radio"
    
            name="redsauce"
    
            value={formState.name}
    
            onChange={onChange}
    
          />
    
          Original Red
    
        </label>
    
        <label htmlFor="garlic" className="garlic">
    
          <input
    
            type="radio"
    
            name="garlic"
    
            value={formState.name}
    
            onChange={onChange}
    
          />
    
          Garlic Ranch
    
        </label>
    
    
        <label htmlFor="bbq" className="bbq">
    
          <input
    
            type="radio"
    
            name="bbq"
    
            value={formState.name}
    
            onChange={onChange}
    
          />
    
          BBQ Sauce
    
        </label>
    
        <label htmlFor="spinach" className="spinach">
    
          <input
    
            type="radio"
    
            name="spinach"
    
            value={formState.name}
    
            onChange={onChange}
    
          />
    
          Spinach Alfredo
    
        </label>
    
        <h3> Select Your Toppings: </h3>
    
        <label htmlFor="toppings">
    
          Toppings: Plain
    
          <input
    
            id="toppings1"
    
            type="checkbox"
    
            name="addOns"
    
            value={formState.name}
    
            onChange={handleChange}
    
          />
    
          <h3> Select Your Cheese: </h3>
    
          Chedder
    
          <input
    
            id="toppings2"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Cheese
    
          <input
    
            id="toppings3"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Three Cheese
    
          <input
    
            id="toppings4"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          ExtraCheese
    
          <input
    
            id="toppings5"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          <h3> Select Your Meat: </h3>
    
          Pepporoni
    
          <input
    
            id="toppings6"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Sausage
    
          <input
    
            id="toppings7"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Canadian Bacon
    
          <input
    
            id="toppings8"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Spicy Italian Sausage
    
          <input
    
            id="toppings9"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          GrilledChicken
    
          <input
    
            id="toppings10"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          <h3> Select Other Toppings: </h3>
    
          Onions
    
          <input
    
            id="toppings11"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Green Peppers
    
          <input
    
            id="toppings12"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Diced Tomatoes
    
          <input
    
            id="toppings13"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Black Olives
    
          <input
    
            id="toppings14"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Roasted Garlic
    
          <input
    
            id="toppings15"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Artichoke Hearts
    
          <input
    
            id="toppings16"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
          Pineapple
    
          <input
    
            id="toppings17"
    
            type="checkbox"
    
            name="addOns"
    
            onChange={handleChange}
    
          />
    
        </label>
    
        <h3>Any Special Instructions?</h3>
    
        <label htmlFor="instructions">
    
          Special Instructions:
    
          <textarea name="instructions" />
    
        </label>
    
        <button disabled={buttonDisabled}>Submit</button>
    
      </form>
    
    </div>
    

    ); };

    экспорт по умолчанию PizzaForm;


person chappie    schedule 19.05.2020    source источник
comment
Думаю, тебе стоит отредактировать свой вопрос. Код на самом деле трудно читать   -  person    schedule 19.05.2020


Ответы (1)


const formSchema = yup.object().shape({
  id: yup.string().required("Required"),
  name: yup.string().min(2, "You name should have 2 characters")
        .required("You don't have a name?"),
  type: yup.string().min(3, "Must be at least 3 characters").required("Required"),
  value: yup.string().required("Required"),
});

Ваша схема выглядит так. Я исправил эту ошибку в своем коде, добавив свойство, на которое жалуется yup, и определив его тип в соответствии с типом, который вызывает ошибка. В вашем случае это объект типа "шпинат"

поэтому добавьте следующую строку в свою схему yup:

spinach: yup.object()

установите его как требуется, если вы считаете это необходимым

spinach: yup.object().required("Required"),

Ваша форма содержит это поле, а схема да - нет.

Обычно я не замечал, что в схеме должны быть указаны все имена свойств. У меня была эта ошибка, когда я переключался между двумя схемами для отправки полного объекта или черновой версии. В черновой версии не было перечисленных свойств, на которые вы жаловались.

person Ferhat Avdic    schedule 26.02.2021