将规范器与 ReduxForm 一起使用会导致表单总是脏的
Using normalizer with ReduxForm results in form always being dirty
我正在使用标准化器将来自休息 api 的 ISO 8601 date/time 值(例如 2016-05-24T20:38:34+00:00
)转换为简单日期(例如 2016-05-24
)。我的标准化器看起来像这样:
export const dateNormalizer = function(value){
if(value)
return moment(value).format("YYYY-MM-DD");
};
我还使用规范器进行货币转换(例如确保它只是数字等)。
我面临的问题是,这导致表单总是变脏。换句话说,一旦加载初始状态(通过 mapStateToProps
中的 initialValues
),this.props.dirty
始终 returns 为真。即使发送 reset
也不会导致 dirty=false
。
有办法克服这个问题吗?我遇到的问题是我希望能够向用户显示他们将要放弃更改的警告,而不必为每个输入字段实现我自己的 onChange
覆盖,现在他们对于已放弃的更改,总是 发出警告。
无法找到使用 normalizer
框架 built 到 ReduxForm 的解决方案。相反,我使用 this suggestion from the issues list 和 built 我自己的 mask/normalizer 组件在显示之前调整值,同时确保商店获取原始值。这还有一个额外的好处,让我可以做一些事情,比如在内部将货币表示为 Number
,但在 ui 中表示为 String
(带有 $
和千位分隔符)。这是代码,以防有人最终想做类似的事情:
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;
我正在使用标准化器将来自休息 api 的 ISO 8601 date/time 值(例如 2016-05-24T20:38:34+00:00
)转换为简单日期(例如 2016-05-24
)。我的标准化器看起来像这样:
export const dateNormalizer = function(value){
if(value)
return moment(value).format("YYYY-MM-DD");
};
我还使用规范器进行货币转换(例如确保它只是数字等)。
我面临的问题是,这导致表单总是变脏。换句话说,一旦加载初始状态(通过 mapStateToProps
中的 initialValues
),this.props.dirty
始终 returns 为真。即使发送 reset
也不会导致 dirty=false
。
有办法克服这个问题吗?我遇到的问题是我希望能够向用户显示他们将要放弃更改的警告,而不必为每个输入字段实现我自己的 onChange
覆盖,现在他们对于已放弃的更改,总是 发出警告。
无法找到使用 normalizer
框架 built 到 ReduxForm 的解决方案。相反,我使用 this suggestion from the issues list 和 built 我自己的 mask/normalizer 组件在显示之前调整值,同时确保商店获取原始值。这还有一个额外的好处,让我可以做一些事情,比如在内部将货币表示为 Number
,但在 ui 中表示为 String
(带有 $
和千位分隔符)。这是代码,以防有人最终想做类似的事情:
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;