Redux-form 6.0+ меняет все значения полей

Я пытаюсь изменить несколько значений в редукционной форме. У меня они есть в одном объекте, поэтому в основном я хочу переопределить значения состояния избыточной формы значениями моего объекта. Один из способов добиться этого — запустить this.props.reset(), а затем несколько событий this.props.change() для каждого свойства. Он работает, но отправляет слишком много событий и работает медленно. Второе, что я попробовал, это запустить this.props.initialize(data,false), и это работает, но проверка не выполняется повторно, поэтому я могу легко отправить форму без проверки. Есть ли способ запустить одно событие, чтобы переопределить состояние формы с моим объектом?


person MistyK    schedule 16.12.2016    source источник


Ответы (2)


Я боюсь, что это невозможно. Некоторое время назад у меня была такая же проблема, и, прочитав всю документацию в редукционной форме, я пришел к выводу, что вам нужно использовать создателей действий. Либо меняй, либо автозаполняй.

Если вы используете инициализацию, вы инициализируете значения, она предназначена для использования для асинхронной инициализации данных, поэтому она не проверяется, как вы говорите.

Давным-давно в предыдущих версиях у них была концепция defaultValue. Но убрали. Если вам действительно не нужно последнее обновление, возможно, вам стоит проверить, поможет ли оно вам.

ПРИМЕЧАНИЕ

Я рекомендую вам следить за этой темой с проблемами. Там об этом говорят.

person Mayday    schedule 16.12.2016
comment
Нет, я не хочу использовать старые версии. В вашей теме я уже задавал этот вопрос но ответа нет. - person MistyK; 17.12.2016
comment
Вы также можете следить за этой проблемой: github.com/erikras/redux-form/issues/3737 - person BaptWaels; 12.06.2019

Это возможно. Я достиг этого в React, используя Redux через файловую структуру Create-React-App.

Использование шаблона stateProps/dispatchProps.

Вы должны уже знать об действиях и редьюсерах, чтобы использовать это. Вот проект, который я изначально начал с https://medium.com/@notrab/getting-started-with-create-react-app-redux-react-router-redux-thunk-d6a19259f71f

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

В ваших действиях/индексном файле

import makeAction from "./makeActionCreator";

const clearMultiplePropertiesInState = "clearMultiplePropertiesInState";

export default {
  constants: {
    clearMultiplePropertiesInState,
  },

  creators: {
    clearMultiplePropertiesInState: makeAction(clearMultiplePropertiesInState
  }
};

В вашем редюсере/{your-reducer}.js

import actions from '../actions';
const { constants } = actions;

const INITIAL_STATE = {
  name: "Dr Hibbert",
  age: "40",
  height: "180cm"
};

//#region const declarations
const { clearMultiplePropertiesInState } = constants;
//#endregion

export default function (state = INITIAL_STATE, action) {
  switch (action.type) {

    case clearMultiplePropertiesInState: {
      var fields = action.data;

      var theState = {
        ...state
      };

      for(var i = 0; i < fields.length; i++) {
        theState[fields[i]] = "";
      }

      return theState;
    }

    default:
      if (!action.type.includes('@@')) {
        console.log(`No action for: ${action.type} type`);
      }

      return state;
  }
}

Таким образом, три элемента, которые вы хотите очистить, — это state.name, state.age и state.height.

import React from "react";
import { connect } from "react-redux";
import { Form, Icon, Button, Modal } from "semantic-ui-react";
import actions from "common/actions";
const { creators } = actions;


const MyComponent = ({ stateProps, dispatchProps }) => {

  return (
    <React.Fragment>
        <Button
          disabled={disableOkButton}
          onClick={() => {
                dispatchProps.clearMultiplePropertiesInState(["name", "age", "height"]);
          }}
          primary
          labelPosition='right'
          icon='checkmark'
          content="Create Club"
          loading={stateProps.modalOkButtonLoading}
        />
    </React.Fragment>
  );
}

function mapStatetoProps(state) {
  return {
    stateProps: {
      name: state.name,
      age: state.age,
      height: state.height
    }
  };
}

function mapDispatchToProps(dispatch) {
  return {
    dispatchProps: {

      clearMultiplePropertiesInState: (fieldNames) => {
        dispatch(creators.clearMultiplePropertiesInState(fieldNames));
      }
    }
  };
}

export default connect(mapStatetoProps, mapDispatchToProps)(MyComponent);

Как я уже сказал, вам нужно хорошо разбираться в использовании React с Redux, чтобы понять это, но это возможно. В этом примере показано, что я сбрасываю 3 значения одновременно. Таким образом, изображение также передает новые значения...

Обычно у меня есть действие changeSinglePropInState, которое я использую (не включал в код), которое передает имя поля и значение поля, которое он хочет изменить в состоянии, поскольку я не хотел создавать действие для каждого отдельного элемента в моем состоянии.

Кроме того, если вы можете обдумать это, это изменяет одно свойство объекта внутри состояния.

case addItemToWishList: {
  return {
    ...state,
    buyer: {
      ...state.buyer,
      wishlist: action.data
    }
  };
}
person Andrew    schedule 31.01.2019
comment
извините, но это не редукционное решение - person Jan Jarčík; 16.04.2019