Как изменить поле в редукс-форме?

В моем компоненте реакции я пытаюсь установить поле под названием «всего». Я импортировал действие изменения в качестве опоры в свой компонент:

import React, { Component, Fragment } from 'react'
import { Field, FieldArray, reduxForm, getFormValues, change } from 'redux-form'
import { connect } from 'react-redux'
import { CalcTotal } from './calculationHelper';



const renderField = ({ input, label, type, meta: { touched, error } }) => (
  <div>
    <label>{label}</label>
    <div>
      <input {...input} type = {type} placeholder = {label} />
      {touched && error && <span>{error}</span>}
    </div>
  </div>
)

const renderMods = ({ fields, meta: { error, submitFailed } }) => (
  <Fragment>
    <ul>
      <li>
        <button type = "button" onClick = {() => fields.push({})}>
          Add Modification
      </button>
        {submitFailed && error && <span>{error}</span>}
      </li>
      {fields.map((mod, index) => (
        <li key = {index}>
          <button
            type = "button"
            title = "Remove Mod"
            onClick = {() => fields.remove(index)}
          />
          <h4>Mod #{index + 1}</h4>
          <Field
            name = {`${mod}.lastYear`}
            type = "number"
            component = {renderField}
            label = "Last Year"
          />
          <Field
            name = {`${mod}.currentYear`}
            type = "number"
            component = {renderField}
            label = "Current Year"
          />



          <Field name = {`${mod}.type`} component = "select" label = "Type">
            <option />
            <option value = "-">Expense</option>
            <option value = "+">Income</option>
            <option value = "-">Tax</option>
          </Field>


        </li>
      ))}
    </ul>

    <Field
      name = "total"
      type = "number"
      component = "input"
      label = "Total modifications"
      text = "0"
    />

  </Fragment>
)


class FieldArraysForm extends Component {



  render() {
    const { handleSubmit, formValues, change } = this.props



    if (formValues) {
      console.info('formvalues', formValues);
      const test = CalcTotal(2000);
      console.info('calc=', test);
      debugger
      this.props.change('fieldArraysForm', 'total', 5000)
    }

    return (
      <form onSubmit = {handleSubmit}>

        {/* <button onClick = {this.changeStuff}>set total</button> */}

        <FieldArray name = "mods" component = {renderMods} />




        <div>
          <button type = "submit" >
            Submit
        </button>

        </div>
      </form>
    )
  }
}



const mapStateToProps = (state) => ({
  formValues: getFormValues('fieldArraysForm')(state),
});

const mapDispatchToProps = {
  change
};


// const Example = reduxForm({
//   form: 'fieldArraysForm', // a unique identifier for this form
// })(FieldArraysForm)

// const ConnectedForm = connect(
//   mapStateToProps,
//   mapDispatchToProps,
// )(Example);

// export default ConnectedForm

export default reduxForm({
  form: "fieldArraysForm"
})(
  connect(
    mapStateToProps,
    mapDispatchToProps
  )(FieldArraysForm)
);

Строка, где код попадает в бесконечный цикл:

this.props.change('fieldArraysForm', 'total', 5000)

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

вы, вероятно, не хотите, чтобы это this.props.change('fieldArraysForm', 'total', 5000) было внутри функции рендеринга, может быть, попробуйте переместить его componentDidMount

AlexZvl 31.03.2019 13:03

Это не сработает, я хочу, чтобы он срабатывал каждый раз, когда в форме происходит изменение.

bier hier 31.03.2019 13:35

ты пробовал componentDidUpdate ?

AlexZvl 31.03.2019 13:38

значение всегда будет 5000?

Eliran 31.03.2019 13:39

@Eliran нет, я упростил вопрос, в конце концов я хочу, чтобы он обновлялся при любых изменениях в форме. Идея состоит в том, чтобы вычислить несколько полей, а затем отобразить их в общем поле. Но я даже не могу заставить жестко запрограммированное значение работать так.

bier hier 31.03.2019 13:54

@bierhier, если значение total не будет одинаковым, вы можете использовать жизненный цикл shouldComponentUpdate. и сравните предыдущую сумму с рассчитанной суммой, чтобы предотвратить бесконечный повторный рендеринг

Eliran 31.03.2019 14:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
6
6 516
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам нужно будет переместить свой оператор из метода render в метод жизненного цикла componentDidUpdate (вы также нужно оператор if, чтобы предотвратить бесконечный цикл):

componentDidUpdate(prevProps) {
    if (this.props.someValue !== prevProps.someValue) {
      this.props.change("formName", "formField", "newFormValue");
    }
  }

Рабочий пример: https://codesandbox.io/s/r5zz36lqnn (при выборе переключателя Has Email? поле email заполняется [email protected], при снятии переключателя поле email сбрасывается на "")

Привет @Matt Carlotta У меня есть еще один вопрос, если вам интересно: stackoverflow.com/questions/55623423/…

bier hier 11.04.2019 06:08

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