Я пытаюсь изменить несколько значений в редукционной форме. У меня они есть в одном объекте, поэтому в основном я хочу переопределить значения состояния избыточной формы значениями моего объекта. Один из способов добиться этого — запустить this.props.reset()
, а затем несколько событий this.props.change()
для каждого свойства. Он работает, но отправляет слишком много событий и работает медленно. Второе, что я попробовал, это запустить this.props.initialize(data,false)
, и это работает, но проверка не выполняется повторно, поэтому я могу легко отправить форму без проверки. Есть ли способ запустить одно событие, чтобы переопределить состояние формы с моим объектом?
Redux-form 6.0+ меняет все значения полей
Ответы (2)
Я боюсь, что это невозможно. Некоторое время назад у меня была такая же проблема, и, прочитав всю документацию в редукционной форме, я пришел к выводу, что вам нужно использовать создателей действий. Либо меняй, либо автозаполняй.
Если вы используете инициализацию, вы инициализируете значения, она предназначена для использования для асинхронной инициализации данных, поэтому она не проверяется, как вы говорите.
Давным-давно в предыдущих версиях у них была концепция defaultValue. Но убрали. Если вам действительно не нужно последнее обновление, возможно, вам стоит проверить, поможет ли оно вам.
ПРИМЕЧАНИЕ
Я рекомендую вам следить за этой темой с проблемами. Там об этом говорят.
Это возможно. Я достиг этого в 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
}
};
}