在redux形式中,仅调用一次Normalize

在redux形式中,仅调用一次Normalize,redux,normalization,redux-form,Redux,Normalization,Redux Form,我正在使用一个规范化器从用户输入的左边开始对pad进行规范化。 我的职能是: export const padLeft = (num, len) => ( len > num.toString().length ? '0'.repeat(len - num.toString().length) + num : num ); 我的标准化者是: const normalizeCid = (value) => { return padLeft(value, 8);

我正在使用一个规范化器从用户输入的左边开始对pad进行规范化。 我的职能是:

export const padLeft = (num, len) => (
  len > num.toString().length ? '0'.repeat(len - num.toString().length) + num
    : num
);
我的标准化者是:

const normalizeCid = (value) => {
  return padLeft(value, 8);
};
当我在字段组件中使用它时,如下所示:

<Field
        id="searchCif"
        name="searchCif"
        floatingLabelText={SEARCHVIEW_HINT_CIF}
        component={InputTextField}
        disabled={(props.afm !== undefined)}
        normalize={normalizeCid}
      />


我输入一个输入,例如2,它显示00000002,这是正确的,但当我输入23时,零没有减少。它显示000000023。为什么会发生这种情况?

我认为函数
normalizeCid
在每次值更改时都在运行,但是第一次运行它并键入“2”,传递到
padLeft
的值是2,它返回并显示00000002

然后,将“3”添加到显示的值(00000002)中时,传递到
padLeft
的值是000000023,其长度为9,大于8,因此它只返回原始值

因此,问题在于
padLeft
函数中的逻辑错误

只要传递一个没有任何前导零的数字,
padLeft
函数似乎就可以工作,因此我们可以在将值传递给
padLeft
之前使用Regex删除前导零来解决这个问题:

const normalizeCid=(值)=>{
const noreadingzeros=value.toString().replace(/\b(0+)/,“”);
返回padLeft(noreadingzeros,8);
};
常量padLeft=(num,len)=>(
//num现在已经是字符串了
len>num.length?'0'。重复(len-num.toString().length)+num
:num
);

注意:此建议可能不适用于所有边缘情况,因此您可能需要在某处添加一些额外条件

您是否使用console.log检查过该函数实际上只运行一次,或者它是否使用每个更新的值运行,但会产生意外的结果?是的,它只运行一次。但为什么会这样?我明白了。。谢谢。你知道怎么解决这个问题吗?没问题!:)我认为建议的解决方案可能不适用于所有边缘情况(比如非常大的数字),因此您可能需要在某个地方添加一些额外的条件。但你比我更清楚这些边缘案件应该如何处理。因此,我认为您可以自己修改函数以满足您的需要。我稍微更改了正则表达式,因为在它之前,它会删除遇到的第一个零,即使不是第一个零。“200”(给你2个)。但是新的方法应该能更好地处理
value.toString()。替换(/\b(0+/,“”)
一个问题,用这种方法我不能删除输入。我按backspace,数字没有删除你是说你不能删除零?如果(noreadingzeros.length==0)返回值,请尝试添加
在返回行之前,在
normalizeCid
中。我不能确切地确定您希望输入的行为。您可以在此处查看它在输入字段上的行为: