如何在Yup.array中测试值的唯一性?

时间:2019-01-08 14:27:43

标签: javascript validation formik yup

我的表单具有动态输入(管理员电子邮件),但是检查唯一性失败:

      validationSchema={Yup.object().shape({
        adminEmails: Yup.array()
          .of(
            Yup.string()
              .notOneOf(Yup.ref('adminEmails'), 'E-mail is already used')

什么是最好的方法? 仅供参考,我使用Formik作为表单助手。

2 个答案:

答案 0 :(得分:1)

尝试一下:

Yup.addMethod(Yup.array, 'unique', function(message, mapper = a => a) {
    return this.test('unique', message, function(list) {
        return list.length  === new Set(list.map(mapper)).size;
    });
});

然后像这样使用它:

const headersSchema = Yup.object().shape({
    adminEmails: Yup.array().of(
        Yup.string()
    )
    .unique('email must be unique')
})

答案 1 :(得分:1)

可能来不及回应,但无论如何,你应该使用this.createError({path, message});

参见示例:

yup.addMethod(yup.array, 'growing', function(message) {
    return this.test('growing', message, function(values) {
        const len = values.length;
        for (let i = 0; i < len; i++) {
            if (i === 0) continue;
            if (values[i - 1].intervalTime > values[i].intervalTime) return this.createError({
                path: `intervals[${i}].intervalTime`,
                message: 'Should be greater than previous interval',
            });
        }
        return true;
    });
});