首页 > 解决方案 > Redux Form 不允许编辑 Initialize Form 状态值

问题描述

我有一个redux-form正确传递的组件,initial form state values但是当我在表单内单击时,我无法编辑值。我已遵循所有文档,如以下链接:

从状态初始化

而且我还按照文档实现了自定义input

redux-form 可以与我的自定义输入组件一起使用吗?

所以我想弄清楚我错过了什么?这是我的表单组件:

EditJournalForm.jsx

import "./styles/list-item.scss";
import {Button, ButtonToolbar} from "react-bootstrap";
import {connect} from "react-redux";
import {Field, reduxForm} from "redux-form";
import InputField from "../form-fields/InputField";
import PropTypes from "prop-types";
import React from "react";

class EditJournalForm extends React.Component {
    render() {
        //console.log('EditJournalForm this.props', this.props);
        const {closeOverlay, handleSubmit, initialValues, pristine, submitting,} = this.props;

        return (
            <form onSubmit={handleSubmit}>
                <div>                
                    <div className="form-field">
                        <Field
                            component={props =>
                                <InputField
                                    content={{val: initialValues.title}}
                                    updateFn={param => props.onChange(param.val)}                                    
                                    {...props}
                                />
                            }
                            label="Journal title"
                            name="title"
                            type="text"
                        />
                    </div>
                    <div className="form-field">
                        <Field
                            component={props =>
                                <InputField
                                    content={{val: initialValues.description}}
                                    updateFn={param => props.onChange(param.val)}                                    
                                    {...props}
                                />
                            }
                            componentClass="textarea"
                            label="Description"
                            name="description"
                            rows="5"
                            type="text"
                        />
                    </div>
                    <div className="form-button-group">
                        <ButtonToolbar>
                            <Button
                                bsSize="small"
                                style={{"width": "48%"}}
                                onClick={() => {
                                    if (closeOverlay) {
                                        closeOverlay();
                                    }
                                }}
                            >
                                Cancel
                            </Button>
                            <Button
                                bsSize="small"
                                disabled={pristine || submitting}
                                style={
                                    {
                                        "backgroundColor": "#999",
                                        "width": "48%"
                                    }}
                                type="submit"
                            >
                                Add
                            </Button>
                        </ButtonToolbar>
                    </div>
                </div>
            </form>
        );
    }
}

EditJournalForm.propTypes = {
    "closeOverlay": PropTypes.func,
    "handleSubmit": PropTypes.func.isRequired,
    "pristine": PropTypes.bool.isRequired,
    "submitting": PropTypes.bool.isRequired,
    "initialValues": PropTypes.object
};

EditJournalForm.defaultProps = {
    "closeOverlay": undefined
};

export default reduxForm({
    form: "editJournal", 
    enableReinitialize: true
})(connect((state, ownProps) => {
    return {
        initialValues: {
           "title": state.bees.entities.journals[ownProps.journal.id].attributes.title,
           "description": state.bees.entities.journals[ownProps.journal.id].attributes.description,
        }
    };
}, undefined)(EditJournalForm));

这是我的习惯input

InputField.jsx

import {ControlLabel, FormControl, FormGroup} from "react-bootstrap";
import PropTypes from "prop-types";
import React from "react";

const InputField = ({input, label, content, updateFn, type, ...props}) => (
    <FormGroup >
        <ControlLabel>
            {label}
        </ControlLabel>
        <FormControl
            {...props}
            {...input}
            value={content}
            onChange={updateFn}
            type={type}
        />
    </FormGroup>
);

export default InputField;

InputField.propTypes = {
    "input": PropTypes.object.isRequired,
    "label": PropTypes.string.isRequired,
    "type": PropTypes.string.isRequired,
    "content": PropTypes.object,
    "updateFn": PropTypes.func
};

标签: javascripthtmlreactjsreduxredux-form

解决方案


尝试调用onChange输入字段的函数:

const InputField = ({input, label, content, updateFn, type, ...props}) => (
    <FormGroup>
        <ControlLabel>
            {label}
        </ControlLabel>
        <FormControl
            {...props}
            {...input}
            value={content}
            onChange={(e) => {
                input.onChange(e);
                updateFn(e);
            }}
            type={type}
        />
    </FormGroup>
);

推荐阅读