Redux form — enableReinitialize переопределяет предыдущие данные и keepDirtyOnReinitialize не работает

#reactjs #redux #redux-form

#reactjs #redux #redux-form

Вопрос:

Я создал контактную форму мастера, где на определенном шаге у меня появляется кнопка «Войти в систему с помощью Google», если пользователь входит в систему с помощью Google, то некоторые поля CF заполняются данными Google (имя, фамилия, электронная почта).

Все работает нормально, но я заметил, что как только пользователь входит в систему и поля заполняются, предыдущие данные формы (данные, которые я получил на предыдущих шагах) теряются и полностью заменяются «именем», «фамилией» и «электронной почтой».

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

Это мой код, в котором я создаю форму и откуда я получаю информацию из Redux store:

 import React from 'react'
import { Field, reduxForm } from 'redux-form'
import { connect } from 'react-redux'

class Info extends React.Component {
    renderError({ error, touched }) {
        if (touched amp;amp; error) {
            return <div>{error}</div>
        }
    }

    renderInputField = ({ input, label, meta }) => {
        return (
            <div>
                <input {...input} type="text" placeholder={label} />
                {this.renderError(meta)}
            </div>
        );
    };

    onSubmit = (formValues) => {
        this.props.onSubmit(formValues)
    }

    render() {
        const { handleSubmit } = this.props
        return (
            <div>
                <form onSubmit={handleSubmit(this.onSubmit)}>
                    <div>
                        <Field
                            name="nome"
                            component={this.renderInputField}
                            label="Nome *"
                        />
                    </div>
                    <div>
                        <Field
                            name="cognome"
                            component={this.renderInputField}
                            label="Cognome *"
                        />
                    </div>
                    <div>
                        <Field
                            name="email"
                            component={this.renderInputField}
                            label="Email *"
                        />
                    </div>
                    <div>
                        <Field
                            name="azienda"
                            component={this.renderInputField}
                            label="Azienda"
                        />
                    </div>
                    <div>
                        <Field
                            name="citta"
                            component={this.renderInputField}
                            label="Città / CAP / Provincia"
                        />
                    </div>
                    <button>Visualizza</button>
                </form>
            </div>
        )
    }
}

const validate = formValues => {
    const errors = {}

    if (!formValues.nome) {
        errors.nome = "Aggiungi il nome"
    }

    if (!formValues.cognome) {
        errors.cognome = "Aggiungi il cognome"
    }

    if (!formValues.email) {
        errors.email = "Aggiungi l'email"
    } else if (!/^[A-Z0-9._% -] @[A-Z0-9.-] .[A-Z]{2,4}$/i.test(formValues.email)) {
        errors.email = 'Email non valida'
    }

    return errors
}


const mapStateToProps = (state) => {
    let initValues

    if (state.auth.isSignedIn) {
        initValues = {
            nome: state.auth.userProfile.ofa,
            cognome: state.auth.userProfile.wea,
            email: state.auth.userProfile.U3
        }
    }

    return {
        userData: state.auth,
        initialValues: initValues
    }
}

export default connect(mapStateToProps)(reduxForm({
    form: 'companyData',
    destroyOnUnmount: false,
    //forceUnregisterOnUnmount: true,
    enableReinitialize: true,
    keepDirtyOnReinitialize: false,
    validate
})(Info))
  

Это мои данные до того, как я войду в систему:

введите описание изображения здесь

И это данные после того, как я войду в Google и восстановлю данные для заполнения полей

введите описание изображения здесь

initialValues сбрасывает все данные и создает эти новые три, но, согласно документации Redux form, я должен иметь возможность сохранить предыдущие данные с помощью keepDirtyOnReinitialize, но это не работает.

Моя версия Redux Form: 8.1.0

Есть идеи?

Ответ №1:

Настройка let initValues = {} делает свое дело. Я не уверен, почему, но вот codesandbox, через 3 секунды повторная инициализация эмулируется, а остальные поля сохраняются => https://codesandbox.io/s/y2kyo20vox