我正在尝试根据值是否有效来更新validations
如果我使用validations.isValid = false
进行设置,
在函数内将validations.isvalid
显示为false,在函数外显示true
,如果值验证失败,如何将其正确设置为false?
export let validations = {
validate: null,
isValid: true,
validationMessage: ''
};
export let validationsOptions = {
shouldValidateUniquness: true
};
function validateInput(value, validationRules) {
let options = {
...validations
}
switch (validationRules) {
case 'day':
case 'month':
case 'date':
case 'year':
validateDate(value)
break;
case 'notEmpty':
if (value == null || value.length === 0) {
options = {
...validations,
isValid: false
}
// Object.assign(validations,{...validations, isValid: false})
// validations.isValid = false
}
break;
case 'phone':
if (value == null || value.length === 0 || !(new RegExp(/^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/).test(value))) {}
break;
case 'numbersOnly':
if ((value !== null && value !== '') && !(new RegExp(/^\d+$/).test(value))) {
validations.isValid = false;
}
break;
case 'email':
if (!validateEmailFormat(value)) {
options = false;
}
break;
case 'minLength':
if (value.length < minLength) {
validations.isValid = false;
}
break;
} {
console.log(options)
}
return options
}
答案 0 :(得分:0)
严格回答您的要求:
您不想要
let options = {
...validations
}
但是
// now modifying options does modify validations as well since they refer to the same object
const options = validations
那是一种不好的做法,因为您会引起副作用(即,在功能之外的验证中。有点像全局变量(然后将其导出!))。
如果您希望修改validations
,则可以将其作为参数传递,并“就地”对其进行修改。
function validateInput(value, validationRules, options = {
validate: null,
isValid: true,
validationMessage: ''
}) {
... //
return options
}
const myOptions = { validate: null, isValid: true, validationMessage: '' }
const out = validateInput(.., .., myOptions)
// myOptions will be modified
// you can also access it via variable out
如有必要,为选项(???)设置一个单例,但将该实例分配给validateInput
,因此造成厄运的原因不是validateInput
而是单个实例的赋予。 / p>
最后,还是无法实现:您的函数仍然有副作用(根据您的要求),以防万一请记住,不修改选项(作为参数)并返回一个新实例将使您的函数是纯函数,并且由于没有副作用,因此您可以随时随地调用它。