Как отправить действие изменения в редукционной форме?

Просто изучая редукционную форму, и изнутри моего компонента я пытаюсь изменить имя поля по коду:

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



let SelectingFormValuesForm = props => {

  const changeStuff = (props) => {
    dispatch(change('selectingFormValues', 'firstName', 'Bertje'))
  }

  const {
    favoriteColorValue,
    fullName,
    handleSubmit,
    hasEmailValue,
    pristine,
    reset,
    submitting,
    change
  } = props
  return (
    <form onSubmit = {handleSubmit}>
      <div>
        <label>First Name</label>
        <div>
          <Field
            name = "firstName"
            component = "input"
            type = "text"
            placeholder = "First Name"
          />
        </div>
      </div>
      <div>
        <label>Last Name</label>
        <div>
          <Field
            name = "lastName"
            component = "input"
            type = "text"
            placeholder = "Last Name"
          />
        </div>
      </div>
      <div>
        <label htmlFor = "hasEmail">Has Email?</label>
        <div>
          <Field
            name = "hasEmail"
            id = "hasEmail"
            component = "input"
            type = "checkbox"
          />
        </div>
      </div>
      {hasEmailValue && (
        <div>
          <label>Email</label>
          <div>
            <Field
              name = "email"
              component = "input"
              type = "email"
              placeholder = "Email"
            />
          </div>
        </div>
      )}
      <div>
        <label>Favorite Color</label>
        <div>
          <Field name = "favoriteColor" component = "select">
            <option />
            <option value = "#ff0000">Red</option>
            <option value = "#00ff00">Green</option>
            <option value = "#0000ff">Blue</option>
          </Field>
        </div>
      </div>
      {favoriteColorValue && (
        <div
          style = {{
            height: 80,
            width: 200,
            margin: '10px auto',
            backgroundColor: favoriteColorValue
          }}
        />
      )}
      <div>
        <button type = "submit" disabled = {pristine || submitting}>
          Submit {fullName}
        </button>
        <button type = "button" disabled = {pristine || submitting} onClick = {reset}>
          Clear Values
        </button>
        <button type = "button" onClick = {changeStuff}>
          Change first name
        </button>
      </div>
    </form>
  )
}

// The order of the decoration does not matter.

// Decorate with redux-form
SelectingFormValuesForm = reduxForm({
  form: 'selectingFormValues',// a unique identifier for this form
  change: reduxForm.change,
  dispatch:reduxForm.dispatch
})(SelectingFormValuesForm)

// Decorate with connect to read form values
const selector = formValueSelector('selectingFormValues') // <-- same as form name
SelectingFormValuesForm = connect(state => {

  //debugger
  // can select values individually
  const hasEmailValue = selector(state, 'hasEmail')
  const favoriteColorValue = selector(state, 'favoriteColor')
  // or together as a group
  const { firstName, lastName } = selector(state, 'firstName', 'lastName')
  return {
    hasEmailValue,
    favoriteColorValue,
    fullName: `${firstName || ''} ${lastName || ''}`
  }
})(SelectingFormValuesForm)

export default SelectingFormValuesForm

Когда я нажимаю эту кнопку «изменить имя», это выполняется. Я импортировал действие изменения из редукционной формы. Почему я получаю эту ошибку:

react-dom.development.js:283 Uncaught TypeError: (0 , _reactRedux.dispatch) is not a function at changeStuff (SelectingFormValuesForm.js:20) at HTMLUnknownElement.callCallback (react-dom.development.js:143) at Object.invokeGuardedCallbackDev (react-dom.development.js:193)

Потенциальным решением вашей проблемы было бы передать onClick = {changeStuff(change)}, не так ли? Кажется, что «изменение» не определено в вашей текущей функции changeStuff. Кроме того, по какой причине вы используете избыточную форму вместо formik? Я сам сделал переход неделю назад, и до сих пор это того стоило.

Thierry Prost 30.03.2019 09:02

Как изменится значение формы в formik? Полегче?

bier hier 30.03.2019 09:17

API предоставляет функцию setFieldValue. Также стоит прочитать это и это, если у вас нет очень-очень веской причины хранить данные формы в хранилище избыточности.

Thierry Prost 30.03.2019 09:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
7 359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько способов изменить значение поля, но вот как это можно сделать с помощью change:

  1. import { change } from 'redux-form';
  2. Добавьте change к mapDispatchToProps объекту.
  3. Добавьте mapDispatchToProps в connect в качестве второго аргумента (если mapStateToProps не нужен, то это будет connect(null, mapDispatchToProps).
  4. Позвоните this.props.change или props.change с помощью formname, fieldname и value.
  5. Необязательный — используйте PureComponent при вызове вторичных действий формы — легче читать и легче тестировать.

Рабочий пример: https://codesandbox.io/s/r5zz36lqnn

Спасибо за это @Matt. Другой вопрос, как я могу получить значения формы из формы? см. stackoverflow.com/questions/55435964/…

bier hier 30.03.2019 22:53

Ваш пример великолепен, но я не могу заставить его работать: stackoverflow.com/questions/55440059/…

bier hier 31.03.2019 12:38

Другие вопросы по теме