FormSpy - onChange с подпиской на грязный не показывает значения в поле ввода - PullRequest
0 голосов
/ 30 мая 2019

Мы используем FormSpy, подписаны на грязные.Функция OnChange в FormSpy будет обновлять грязный тег в избыточном, если грязный имеет значение true.Когда я набираю любое поле ввода, первая буква не отображается, но состояние избыточности обновляется с dirty:true при первой букве.

Также форма записывается в другом файле с использованием

<Form
 component={Theform}
/>

Так мы использовали FormSpy

<FormSpy
  subscription={{ dirty: true }}
  onChange={state => this.updateDirty(state.dirty)}
  {...props}
/>

updateDirty(isDirty) {
  const { toggleIsDirty, dirtyState } = this.props;
  if (isDirty) {
    if (!dirtyState.isDirty) {
      toggleIsDirty();
    }
  }
}

Когда проверка if (isDirty) не выполнена, она обновляет значение хранилища, но ничего не показывает в поле ввода.Куда мы пошли не так?

Обновление : я не могу скопировать и вставить фактический код, но вот как это выглядит.

Action.js

const toggleDirty = () => ({
  type: types.TOGGLE_DIRTY,
});

export { toggleDirty };

Reducer.js

const dirtyState = (state = { isDirty: false}, { type }) => {
  switch (type) {
    case types.TOGGLE__DIRTY: {
      return {
        isDirty: !state.isDirty,
      };
    }
    default: return state;
  }
};

Modal.jsx

class Modal extends Component {
  render () {
    const {storeValues} = this.props;
    const initialValues = {
      field1: storeValue.field1,
      field2: storeValue.field2
    }

    return {
      <Form 
        id="detailsForm"
        initialValues={initialValues}
        component={DetailsForm}
      />
    }
  }
}
const mapStateToProps = ({ storeValues }) => ({
  storeValues,
});

export default connect(mapStateToProps, null)(Modal);

DetailsForm.jsx

class DetailsForm extends Component {
  constructor(props) {
    super(props);
    this.updateDirty = this.updateDirty.bind(this);
  }
  updateDirty(isDirty) {
    const { toggleIsDirty, dirtyState } = this.props;
    if (isDirty && !dirtyState.isDirty) {
      toggleIsDirty();
    }
  }

  render() {
    const {updateDirty} = this;
    const {
      intl, submitError, submitErrors, submitFailed, dirty, handleSubmit, form, errors, values, ...props
    } = this.props;
    return{
      <form onSubmit={handleSubmit} className="benefit-form">
        <FormSpy
          subscription={{ dirty: true }}
          onChange={state => updateDirty(state.dirty)}
          {...props}
        />
        <React.Fragment>
          <Input .... />
        </React.Fragment>
      </form>
    }
  }
}

const mapStateToProps = ({ dirtyState}) => ({
  dirtyState,
});

const mapDispatchToProps = dispatch => ({
  toggleIsDirty() {
    dispatch(toggleDirty());
  },
});

export default connect(mapStateToProps, mapDispatchToProps)(DetailsForm);

Когда я набираю что-то вроде '123' вна входе отображается только «23».Когда я набираю первое число, оно просто превращает флаг isDirty в значение true в магазине.При отладке я обнаружил, что updateDirty вызывается дважды для первого символа ввода - один раз с isDirty как true и снова как false.

Я помещаю consolelog в onChange FormSpy, и он запускается во времяначальная форма загрузки с dirty как false.И когда я набираю первую букву, она обновляется до true, действие отправляется, а затем сразу же запускается снова с false.Письмо тогда не отображается.Но со второй буквы это действует нормально.Это работает без каких-либо проблем, когда я использую локальное состояние и setState вместо отправки.

Мы используем этот флаг для отображения модального режима при переходе со страницы с грязными данными.

1 Ответ

0 голосов
/ 31 мая 2019

Мне нужно увидеть больше ваших настроек формы, чтобы помочь.Боюсь, этой информации недостаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...