如何为受控制的React组件

时间:2017-03-03 14:48:44

标签: reactjs redux

我有一个React / Redux应用程序,我正在尝试找出为受控输入字段构建正确的onChange事件的最佳方法。 React onChange触发onInput,所以我只在用户离开字段时才触发onBlur事件。我能想到的唯一方法就是实现我的" onChange"代码是将输入值设置为React状态。然后我可以将旧状态与来自Redux商店的新状态进行比较。但是,我不认为这是一个理想的解决方案,因为该值必须存储在React状态和Redux存储中。有没有办法为组件实现正确的onChange,同时只将值存储在Redux存储中?

/************Parent component************/
const mapStateToProps = (state) => {
    const fieldName = 'fieldName';
    const fieldData = formFieldSelector(fieldName)(state);

    return {
        fieldName,
        label: 'fieldName',
        value: fieldData.value
    }
};

const mapDispatchToProps = (dispatch) => ({
    onChangeEvent(fieldName, value) {
        dispatch(updateFieldValue(...))
    },
    onBlurEvent(fieldName, value) {
        dispatch(validateFormField(...)
    },
});

const MyFieldInput = connect(
    mapStateToProps,
    mapDispatchToProps
)(GenericInput);

/************Child Component************/
export default class GenericInput extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            value: ''
        };
    }

    handleOnBlur (e) {
        const value = e.target.value;

        if(this.props.onBlurEvent && (value !== this.state.value)) {
            this.props.onBlurEvent(this.props.fieldName, value)
        }

        this.setState({value});
    }

    render () {
        const {
            fieldName,
            label = '',
            value = '',
            inputType = 'text',
            onChangeEvent,
            onBlurEvent,
        } = this.props;
        const onChange = onChangeEvent ? (e) => onChangeEvent(fieldName, e.target.value) : function () {};

        return (
            <div>
                <label>{label}
                    <input name={fieldName} type={inputType} value={value} onChange={onChange} onBlur={this.handleOnBlur.bind(this)} />
                </label>
            </div>
        )
    }
}

1 个答案:

答案 0 :(得分:0)

删除onChange事件代码,并使用ref使用onBlur调度输入值。

所以你的输入看起来像这样:

<input name={fieldName} type={inputType} value={value} ref="fieldRef" onBlur={this.handleOnBlur.bind(this)} />

您将在handleOnBlur中传递值,如下所示:

this.props.onBlurEvent(this.props.fieldName, this.refs.fieldRef.value)