我有一个名为addContactForm
的redux表单。此表单通过插件监听我的应用程序中的某些操作。请参阅下面的代码以获取说明:
/reducers/index.js
import { combineReducers } from 'redux';
import { reducer as reduxFormReducer } from 'redux-form'
import AddContactFormPlugin from './add-contact-form-plugin';
const rootReducer = combineReducers({
form: reduxFormReducer.plugin({
addContactForm: AddContactFormPlugin
})
});
export default rootReducer;
/reducers/add-contact-form-plugin.js
import { SET_CURRENT_CONTACT, CLEAR_CURRENT_CONTACT } from '../constants';
export default function (state, {type, payload}) {
switch (type) {
case SET_CURRENT_CONTACT:
// !!! MY PROBLEM IS ON THE NEXT LINE
return {...state, values: { ...payload }};
case CLEAR_CURRENT_CONTACT:
return {...state, values: getEmptyValues()};
default:
return state;
}
}
function getEmptyValues() {
return {
firstName: '',
lastName: '',
phone: ''
}
}
为了澄清这里发生的事情:当类型为SET_CURRENT_CONTACT的操作流入此reducer时,我将表单值设置为用户选择的联系人的表单值。这部分工作正常。
然而,表格现在标记为!pristine&&脏。因此,我的提交按钮未被禁用,实际上应该是用户决定进行任何更改。
所以我的问题是:如何更新表单状态以便将其标记为pristine?
(或者我想是无效的,但原始感觉是更好的选择)
我试过简单地在状态对象中设置值,但这没有做任何事情:
return {...state, values: { ...payload }, pristine: true };
如果我在这里使用错误的方法,我也很感激被指向正确的方向。
答案 0 :(得分:3)
reduxForm
时,我必须传递参数enableReinitialize: true
。现在,选择联系人后更新值正常工作,表单已重置为原始状态。但我的验证功能破了...... if (!values) {return {};}
所以现在一切都按预期工作,事件虽然改变了。 2感觉有点不对劲......
低于我工作代码中最相关的部分(在redux-form连接组件中)
const getInitialValues = (currContact) => {
if (currContact) {
const { firstName, lastName, phone } = currContact;
return { firstName, lastName, phone };
}
return { firstName: '', lastName: '', phone: ''};
}
const reduxConnectedForm = reduxForm({
form: 'addContactForm',
validate,
enableReinitialize: true
})(AddContactForm);
function mapStateToProps (state) {
return {
initialValues: getInitialValues(state.currContact)
};
}
const connectedForm = connect(
mapStateToProps,
)(reduxConnectedForm);
export default connectedForm;