我想用 formik 进行异步验证,用 yup 进行验证模式,但我找不到示例或演示。
问问题
20064 次
5 回答
30
const validationSchema = Yup.object().shape({
username:
Yup.string()
.test('checkDuplUsername', 'same name exists', function (value) {
return new Promise((resolve, reject) => {
kn.http({
url: `/v1/users/${value}`,
method: 'head',
}).then(() => {
// exists
resolve(false)
}).catch(() => {
// note exists
resolve(true)
})
})
})
})
是的,通过测试方法提供异步处理。
(kn 是我的 ajax 承诺函数)祝你
有美好的一天。
于 2019-09-11T05:39:21.657 回答
7
其实可以简化一点
const validationSchema = Yup.object().shape({
username: Yup.string().test('checkEmailUnique', 'This email is already registered.', value =>
fetch(`is-email-unique/${email}`).then(async res => {
const { isEmailUnique } = await res.json()
return isEmailUnique
}),
),
})
于 2020-11-23T13:09:58.133 回答
2
以下是如何使用 API 调用进行异步验证:
const validationSchema = Yup.object().shape({
username: Yup.string().test('checkDuplUsername', 'same name exists', function (value) {
if (!value) {
const isDuplicateExists = await checkDuplicate(value);
console.log("isDuplicateExists = ", isDuplicateExists);
return !isDuplicateExists;
}
// WHEN THE VALUE IS EMPTY RETURN `true` by default
return true;
}),
});
function checkDuplicate(valueToCheck) {
return new Promise(async (resolve, reject) => {
let isDuplicateExists;
// EXECUTE THE API CALL TO CHECK FOR DUPLICATE VALUE
api.post('url', valueToCheck)
.then((valueFromAPIResponse) => {
isDuplicateExists = valueFromAPIResponse; // boolean: true or false
resolve(isDuplicateExists);
})
.catch(() => {
isDuplicateExists = false;
resolve(isDuplicateExists);
})
});
}
于 2021-04-19T13:03:39.537 回答
1
您可以使用async/await
自yup
定义验证器
let field = yup.string().test(
'test-id',
'error message in case of fail',
async function validateValue(value){
try{
// validation logic
return false; // or true as you see fit
} catch(error){
}
});
返回true
您接受的值
返回false
您拒绝的值
确保你总是返回一个布尔值,或者finally
如果你自己没有保证,则添加一个块。
于 2021-11-21T14:58:40.150 回答
1
例如我使用的是假承诺,可以这样做:
const Schema = yup.object().shape({
password: yup
.string()
.test("validPassword","Password requires one special character",
function (value) {
return new Promise((resolve) => {
setTimeout(() => {
if (
/^[0-9A-Za-z]*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?][0-9a-zA-Z]*$/.test(
value
)
) {
resolve(true);
} else {
resolve(false);
}
}, 100);
});
}
),
});
于 2021-07-26T23:52:02.027 回答