无法使用normalizer
ReduxForm 内置的框架找到解决方案。相反,我从问题列表中获取了这个建议,并构建了我自己的掩码/规范化器组件,以在显示值之前调整它们,同时确保商店获取原始值。这还有一个额外的好处,就是让我可以做一些事情,比如在Number
内部将货币表示为 a,但在 ui 中作为 a String
(带有 a$
和千位分隔符)。这是代码,以防有人最终想要做类似的事情:
import React, { Component } from 'react'
const isSupportedType = (type) => {
return type !== 'checkbox' && type !== 'file' && type !== 'select-multiple';
};
class MaskedInput extends Component {
normalize(value, mask, normalize, originalBlur, originalChange){
return {
value: mask(value),
onBlur: (event) => {
if (isSupportedType(event.target.type)){
originalBlur(normalize(event.target.value))
}else{
originalBlur(event);
}
},
onChange: (event) => {
if (isSupportedType(event.target.type)){
originalChange(normalize(event.target.value));
}else{
originalChange(event);
}
}
}
}
render(){
const {
mask,
normalizer,
value,
onBlur,
onChange,
...rest
} = this.props;
return <input {...rest} {...this.normalize(value, mask, normalizer, onBlur, onChange)} />
}
}
MaskedInput.propTypes = {
mask: React.PropTypes.func,
normalizer: React.PropTypes.func
};
export default MaskedInput;