Добавление дополнительных входных данных по щелчку внутри моей формы в крючке ReactJS

#javascript #reactjs #react-hooks

Вопрос:

У меня есть несколько проблем внутри моего приложения React, в настоящее время я создаю многоступенчатый интерфейс для in ReactJS с помощью Hook, но я новичок в этой технологии. Проблема в следующем : когда я добавляю входные данные в свою форму и перехожу к следующему шагу, данные теряются. С кем я могу это исправить ?

Чтобы начать все сначала на более разумной основе, чем мои попытки, я не стал передавать вам код, который генерирует входные данные, зная, что он не сохранит данные, если я перейду к следующему шагу.

Form.js

 const [formData, setFormData] = useState({
    stepOne: {
        lastName: {
            value: '',
            required: true,
            type: 'input',
            placeholder: 'Nom du client',
            label: 'Nom*',
            classField: 'col-lg-6'
        }
    },
    stepTwo: {
        quantity: {
            value: '',
            required: true,
            type: 'input',
            placeholder: '3',
            label: 'Quantité*',
            classField: 'col-lg-2'
        }
    },
    stepThree: {
        origine: {
            value: '',
            required: true,
            type: 'input',
            placeholder: 'Sélectionnez l'origine',
            label: 'Origine*',
            classField: 'col-lg-6'
        }
    },
});
const [errors, setErrors] = useState(1);

const changeHandler = (step, e) => {
    e.persist();

    setFormData(prev => ({
        ...prev,
        [step]: {
            ...prev[step],
            [e.target.name]: {
                ...prev[step][e.target.name],
                value: e.target.value
            }
        }
    }));
}

const stepChangeHandler = (values, e) => {

    e.preventDefault();
    const newErrors = validate(values);

    setErrors(newErrors);
    if (Object.keys(newErrors).length === 0) {
        setStep(step   1);
    }
}


const submitHandler = (e) => {
    e.preventDefault();

    const data = new FormData();
    // Nous pouvons envoyer la donnée à une API
    console.log(formData);
}
 

Step.js

 const Step = ({data, onChange, onStepChange, errors, stepKey, step, onPrevStep}) => {
let output = [];

for (const [key, val] of Object.entries(data)) {
        if (val.type.split(':')[0] === 'input') {
            output.push(
                <Input
                    key={key}
                    placeholder={val.placeholder}
                    name={key}
                    label={val.label}
                    classField={val.classField}
                    value={val.value}
                    onChange={(e) => onChange(stepKey, e)}
                    error={errors[key]}
                    type={val.type.split(':')[1]}
                />
            );
        } else if (val.type === 'select') {
            output.push(
                <Select
                    key={key}
                    name={key}
                    label={val.label}
                    classField={val.classField}
                    value={val.value}
                    onChange={(e) => onChange(stepKey, e)}
                    error={errors[key]}
                    choices={val.choices}
                />
            );
        } else if (val.type === 'date') {
            output.push(
                <Date
                    key={key}
                    name={key}
                    label={val.label}
                    classField={val.classField}
                    value={val.value}
                    onChange={(e) => onChange(stepKey, e)}
                    error={errors[key]}
                    type={val.type.split(':')[1]}
                />
            );
        } else if (val.type === 'checkbox') {
            output.push(
                <Checkbox
                    key={key}
                    name={key}
                    label={val.label}
                    classField={val.classField}
                    value={val.value}
                    onChange={(e) => onChange(stepKey, e)}
                    error={errors[key]}
                    type={val.type.split(':')[1]}
                />
            );
        }
}

return (
    <Fragment>
        {step > 1 amp;amp;
        <button type="button" className="previousStepButton" onClick={() => onPrevStep(step - 1)}>Étape
            précédente</button>}
        {output}
        <div className="col-lg-12">
            <button type="button" className="btn-step nextStepButton"
                    onClick={(e) => onStepChange(data, e)}>Étape suivante
            </button>
        </div>
    </Fragment>
);
 

}

Input.js

 const Input = ({
    type = 'text',
    placeholder, name, value, onChange, error, label, classField, disabled
}) => {
    return (
        <div className={classField}>
            <div className="inputBox">
                <label htmlFor={name} className={error ? "labelField is-danger" : "labelField"}>{label}</label>
                <input
                    className={error ? "inputField is-danger" : "inputField"}
                    type={type}
                    placeholder={placeholder}
                    name={name}
                    id={name}
                    value={value}
                    onChange={onChange}
                    autoComplete="off"
                />
                {error amp;amp; <div className="has-text-danger-dark">{error}</div>}
            </div>
        </div>
    );
}