3

我想传递多个函数来规范化 redux 字段,有没有办法做到这一点?就像我们在验证道具中传递一个数组一样?

validate={[alphanumeric,maxlength]}

在整个 redux-form 问题中,我看到了类似的方式

normalize={maxlength_alphanumeric(5)} //but here two logic are burried in one function

如何实现类似的东西

normalize={maxlength(5) , alphanumeric}
4

1 回答 1

4

我们可以使用闭包来实现这一点,因此我们创建了一个接受标准化函数数组的函数。

请注意,这与验证不同,因为在验证中,如果其中一个功能失败,则所有功能都不相关,这意味着验证失败。

在规范化中,传递给每个规范化函数的值需要从已经进行了一些规范化的前一个函数传递。

所以我们可以使用normalizeAll下面的函数来做到这一点

function normalizeAll(normalizers){
    return function(value , previousValue , allValues , previousAllValues){ //note that these arguments are passed by default from redux form
        var i = 0;
        var normalizersLength = normalizers.length;
        var currentValue = value;
        while(i < normalizersLength)
        {
            var currentNormalizer = normalizers[i];
            if(typeof currentNormalizer == "function")
            {
                currentValue = currentNormalizer(currentValue ,previousValue , allValues , previousAllValues);
            }
            i++;
        }

        return currentValue;
    }
}

//I am using only the `value` argument in normalization functions just for the example, but you can use the rest of them if they are needed
var firstNormalization = function(value , previousValue , allValues , previousAllValues){
    return value+1;
}

var secondNormalization = function(value, previousValue , allValues , previousAllValues){
    return value+2;
}

var thirdNormalization = function(value, previousValue , allValues , previousAllValues){
    return value+3;
}

//To test result: i will execute the function returned from normalizeAll and pass the first argument as 1.
var normalizedValue = normalizeAll([firstNormalization , secondNormalization , thirdNormalization])(1); 
console.log(normalizedValue); // 7 


现在要normalizeAll在你的 redux 表单中使用,你会做这样的事情

normalize={normalizeAll([firstNormalizationFunction , secondNormalizationFunction])}


请注意,这是假设所有规范化函数都是同步的,我认为我们通常不会有规范化函数需要异步的用例,但解决方案仍然是相同的,但是我们将使用callback函数或promise

于 2017-11-30T09:45:29.097 回答