Ввод формы с использованием Redux Form не обновляется

Мое поле ввода не обновляется при нажатии клавиши:

import React, { Component, PropTypes } from 'react';

import { Field, reduxForm } from 'redux-form';

class CitySelector extends Component {
  render() {
    const { isFetching, pristine, submitting, handleSubmit } = this.props;

    return (
      <form className="form-horizontal col-xs-offset-1" onSubmit={handleSubmit(this.fetchWeather)}>
        <div className="form-group">
          <div className="col-md-4 col-xs-4">
            <Field name="city"
                   component={city =>
                     <input type="text" className="form-control" {...city.input} placeholder="enter a city for a 5 day forecast"/>
                   }
            />
          </div>
          <div className="col-md-3 col-xs-3">
            <button type="submit" className="btn btn-success">Submit</button>
          </div>
        </div>
      </form>
    );
  }
}

export default reduxForm({
  form: 'cityForm'
})(CitySelector);

Нужно ли мне предоставлять обработчик onChange для ввода текста?


person dagda1    schedule 06.10.2016    source источник


Ответы (5)


У меня была та же проблема, и моя ошибка была очень простой.

Вот что у меня было:

import { combineReducers } from 'redux';
import { reducer as forms } from 'redux-form';

import otherReducer from './otherReducer';

export default combineReducers({ otherReducer, forms });

Обратите внимание, что я импортировал redux-form reducer как forms и передавал его как есть в мои combReducers (как я сделал с otherReducer), используя сокращенное обозначение значения свойства ES6 Object.

Проблема в том, что ключ, используемый для передачи redux-form reducer в наши combReducers, ДОЛЖЕН называться form, поэтому мы должны изменить его на:

export default combineReducers({ customer, form: forms });

or

import { reducer as form } from 'redux-form';
export default combineReducers({ otherReducer, form });

Надеюсь, это поможет кому-то другому ...

person rafaelbiten    schedule 02.12.2016
comment
приятно поймать ключевой бит - person rambossa; 01.02.2017
comment
Документы должны иметь эту информацию. Выполнение руководства по началу работы приведет вас прямо в ловушку. Это исправление. - person coblr; 08.02.2017
comment
Я действительно забыл об «импорте {reducer as forms} из redux-form»; - person Hossam Maher; 02.06.2019

Если вы используете неизменяемые структуры данных вместо:

import { reduxForm } from 'redux-form';

использовать это:

import { reduxForm } from 'redux-form/immutable';

См. Здесь для получения дополнительной информации http://redux-form.com/6.7.0/examples/immutable/

person Aref Aslani    schedule 25.01.2017
comment
Спасибо, я потратил несколько часов на размышления, почему мои данные не обновляются! - person Mark Steggles; 31.05.2017
comment
спасибо, это было то, что со мной происходило не так. если вам случится использовать react-boilerplate, у вас будет эта проблема. - person burcakulug; 15.01.2018

У меня просто была проблема, похожая на этот вопрос, за исключением того, что моя форма не отправлялась, и моя функция проверки также не срабатывала.

Это было связано с этим:

Я изменил его с input на что-то другое, и он полностью сломал redux-form ТИХОЙ

const TextInput = ({
    input,                                                 <--- DO NOT CHANGE THIS
    placeholder,
    type,
    meta: { touched, error, warning }
  }) => {
    return (
      <div className="row-md">
          <input
            placeholder={placeholder}
            type={type}
            className="form-text-input primary-border"
            {...input}                                     <--- OR THIS
          />
          {touched && ((error && <span>{error}</span>) || (warning && <span>{warning}</span>))}
      </div>
    )
}

Вот остальные мои комментарии, если кто-то хочет их изучить:

<Field
  component={TextInput}
  type="tel"
  name="person_tel"
  placeholder="Mobile Phone Number"
  value={this.props.person_tel}
  onChange={(value) => this.props.updateField({ prop: 'person_tel', value })}
/>
person agm1984    schedule 02.11.2017

Если вы предоставляете пользовательский компонент ввода для Field, тогда да, вы должны вызвать onChange, переданный в input prop, вашему компоненту. Фактически, вы почти правильно поняли, распространив city.input, но есть загвоздка.

Когда вы определяете компонент без состояния (или просто любую функцию) внутри render() метода, он воссоздается при каждой визуализации. И поскольку этот компонент без состояния передается как опора (component) в Field, он заставляет Field выполнять рендеринг после каждого воссоздания. Таким образом, ваш ввод будет терять фокус при рендеринге CitySelector компонента, поэтому нажатия клавиш не будут фиксироваться.

Вы должны выделить свой компонент без состояния в отдельное определение:

const myInput = ({ input }) => (
  <input type="text" className="form-control" {...input} placeholder="enter a city for a 5 day forecast" />
);

class CitySelector extends Component {
  render() {
    const { isFetching, pristine, submitting, handleSubmit } = this.props;

    return (
      <form className="form-horizontal col-xs-offset-1" onSubmit={handleSubmit(this.fetchWeather)}>
        <div className="form-group">
          <div className="col-md-4 col-xs-4">
            <Field name="city" component={myInput} />
          </div>
          <div className="col-md-3 col-xs-3">
            <button type="submit" className="btn btn-success">Submit</button>
          </div>
        </div>
      </form>
    );
  }
}

Это также делает ваш код более разборчивым.

Дополнительную информацию об этой проблеме можно найти в официальных документах Redux Form. Обратите внимание, что вы, вероятно, можете использовать input по умолчанию, не создавая свой собственный, взгляните на пример простой формы.

person Konstantin Grushetsky    schedule 06.10.2016
comment
Нужно ли моему редуктору обновлять свойство с именем city? - person dagda1; 07.10.2016
comment
Ну, нет, Redux Form самостоятельно управляет обновлениями состояния. Я не могу найти здесь источник вашей проблемы. Вы видите какие-нибудь ошибки в консоли? - person Konstantin Grushetsky; 07.10.2016
comment
В консоли нет ошибок, и я вижу, что это действие регистрируется: объект действия {type: redux-form / CHANGE, meta: Object, payload: a} - person dagda1; 07.10.2016
comment
Я бы не подумал, что мне нужно обрабатывать redux-form / CHANGE - person dagda1; 07.10.2016
comment
Если я набираю несколько раз, я получаю то же действие только с одной буквой в полезной нагрузке, что наводит на мысль, что магазин не обновляется правильно. - person dagda1; 07.10.2016
comment
Я использовал immutablejs, и я не использовал правильный редуктор и т. Д. После примера с immutablejs проблема была решена. Извините за путаницу. - person dagda1; 07.10.2016
comment
Хорошо, я вижу. Но в любом случае вы не должны обрабатывать redux-form/CHANGE события самостоятельно. Redux Form уже делает это! Просто чтобы сообщить другим: если используется Immutable.js, вы должны импортировать reduxForm из redux-form/immutable. Все остальное в вашей форме останется прежним. Вот ссылка на пример. - person Konstantin Grushetsky; 07.10.2016
comment
Я не, с правильным редуктором, и теперь все работает - person dagda1; 07.10.2016
comment
вы также можете поместить его под другим ключом, но когда вы вызываете reduxForm (...), вам нужно передать параметр. например reduxForm({ ..., getFormState: state => state.forms }) - person cdaringe; 12.03.2019

Я узнал / моя проблема была моя

form: formReducer

не было в rootReducer.

formReducer должен быть сверху. Мое дело:

const rootReducer = combineReducers({
   general: generalReducer,
   data: combineReducers({
       user:userReducer,
       todoReducer
   }),
       form: formReducer
   });
person Finelf    schedule 16.05.2019