redux-form格式输入仅onBlur

gab*_*ric 6 javascript redux-form

在我的表单中,我有一个“金额”字段,该字段应始终显示2个十进制数字。因此,例如,如果用户键入3,则应将其转换为3.00。如果他输入3.1234525,则应变为3.12。

为了做到这一点,我依靠onBlur道具。基本上,onBlur我运行一个函数来正确格式化数字,然后尝试在字段上设置新值。

这是我的代码:

import { blur as blurField } from 'redux-form/immutable';

...

const mapDispatchToProps = {
    blurField,
};

...
export default connect(mapStateToProps, mapDispatchToProps)(Amount);
Run Code Online (Sandbox Code Playgroud)

class AmountContainer extends Component {
    props: PaymentMethodPropsType;

    formatAmount(event) {
        const {
            blurField,
        } = this.props;
        blurField('myForm', 'amount', formatNumber(event.currentTarget.value, 2));
    }

    /**
     * Render method for the component
     * @returns {Element<*>} the react element
     */
    render() {
        const {
            t,
            amountValue,
        } = this.props;

        const amountLabel = t('form')('amountLabel');

        return (
            <Amount
                amountLabel={amountLabel}
                amountValue={amountValue}
                normalize={onlyNumbersDecimals}
                onBlur={(event: Event) => this.formatAmount(event)}
                validation={[
                    isRequired(t('validation')('amountRequired')),
                    number(t('validation')('amountNotNumber')),
                ]}
            />
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

假设我输入数字3,然后移至表单中的下一个字段。我可以看到以下动作被调用:

{type: "@@redux-form/BLUR", meta: {…}, payload: "3.00"}
{type: "@@redux-form/BLUR", meta: {…}, payload: "3"}
Run Code Online (Sandbox Code Playgroud)

结果,输入值仍然为3。它看起来像最初的onBlur事件“覆盖”了我触发的那个调用 blurField

Mar*_*rco 0

只需使用 event.preventDefault 即可:

formatAmount(event) {
    const {
        blurField,
    } = this.props;
    event.preventDefault();
    blurField('myForm', 'amount', formatNumber(event.currentTarget.value, 2));
}
Run Code Online (Sandbox Code Playgroud)