Redux-form:从状态设置表单值

时间:2016-11-23 10:01:09

标签: reactjs redux redux-form

我有一个名为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 };

如果我在这里使用错误的方法,我也很感激被指向正确的方向。

1 个答案:

答案 0 :(得分:3)

好的,所以我现在找到了'答案'。我基本上只是在redux-form网站Initialize values from state上跟随这个例子。然而,它对我来说没有开箱即用。我不得不做出两个值得注意的改变:

  1. 在致电reduxForm时,我必须传递参数enableReinitialize: true。现在,选择联系人后更新值正常工作,表单已重置为原始状态。但我的验证功能破了......
  2. 原来是因为在某个时间点,要验证的值是未定义的。为了避免这种情况,我添加了一个从验证函数中提前退出的子句:if (!values) {return {};}
  3. 所以现在一切都按预期工作,事件虽然改变了。 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;