Return 来自 Material 的布尔值 UI 在 Yup.when Validation 中使用的无线电
Return boolean value from Material UI Radio to use in Yup .when Validation
是的,允许使用 .when
.
基于另一个值进行验证
示例:
var inst = yup.object({
isBig: yup.boolean(),
count: yup
.number()
.when('isBig', {
is: true, // alternatively: (val) => val == true
then: yup.number().min(5),
otherwise: yup.number().min(0),
})
});
Material UI 的单选表单仅允许 value
字段中的字符串值。
示例:
<Radio
checked={this.state.selectedValue === 'a'}
onChange={this.handleChange}
value="a"
name="radio-button-demo"
aria-label="A"
/>
将值更改为:value={true}
或除字符串之外的任何其他值会破坏 Radio 组件。
使用 yup.boolean
在 yup 验证中强制使用无线电值没有帮助。
我的替代方案是切换到内联验证,这不是主意。
我想做的是:如果 isBig
returns 为真,则要求 count 是一个至少有 5 位数字的数字,否则忽略它。
我在这里错过了什么?有没有办法使用 .when 以外的检查通过 yup 有条件地验证相关值?或者,我是否在 Radio 组件中遗漏了一些明显的东西?
感谢任何帮助,Yup 在线示例不会超出 Yup 文档提供的示例范围。
为验证驱出一个字符串应该不是问题。另外 min(5)
并不意味着最少五位数字,它意味着一个数字 >= 5。对于至少 5 位数字,您需要 min(10000)
.
这是在字符串上使用 when
的示例。如果您转到 CodeSandbox,您会看到 myForm1
无效(强制执行最小值 10000,因为 "a" 匹配),但 myForm2
有效,因为 "b" 不匹配'符合条件。
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import * as yup from "yup";
const myForm1 = {
radioValue: "a",
num: 1234
};
const myForm2 = {
radioValue: "b",
num: 1234
};
const schema = yup.object({
radioValue: yup.string(),
num: yup.number().when("radioValue", {
is: "a",
then: yup.number().min(10000),
otherwise: yup.number().min(0)
})
});
function App() {
const [myForm1IsValid, setMyForm1IsValid] = useState(null);
const [myForm2IsValid, setMyForm2IsValid] = useState(null);
useEffect(async () => {
setMyForm1IsValid(await schema.isValid(myForm1));
setMyForm2IsValid(await schema.isValid(myForm2));
}, []);
return (
<div className="App">
<h1>myForm1 is valid: {JSON.stringify(myForm1IsValid)}</h1>
<h1>myForm2 is valid: {JSON.stringify(myForm2IsValid)}</h1>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
是的,允许使用 .when
.
示例:
var inst = yup.object({
isBig: yup.boolean(),
count: yup
.number()
.when('isBig', {
is: true, // alternatively: (val) => val == true
then: yup.number().min(5),
otherwise: yup.number().min(0),
})
});
Material UI 的单选表单仅允许 value
字段中的字符串值。
示例:
<Radio
checked={this.state.selectedValue === 'a'}
onChange={this.handleChange}
value="a"
name="radio-button-demo"
aria-label="A"
/>
将值更改为:value={true}
或除字符串之外的任何其他值会破坏 Radio 组件。
使用 yup.boolean
在 yup 验证中强制使用无线电值没有帮助。
我的替代方案是切换到内联验证,这不是主意。
我想做的是:如果 isBig
returns 为真,则要求 count 是一个至少有 5 位数字的数字,否则忽略它。
我在这里错过了什么?有没有办法使用 .when 以外的检查通过 yup 有条件地验证相关值?或者,我是否在 Radio 组件中遗漏了一些明显的东西?
感谢任何帮助,Yup 在线示例不会超出 Yup 文档提供的示例范围。
为验证驱出一个字符串应该不是问题。另外 min(5)
并不意味着最少五位数字,它意味着一个数字 >= 5。对于至少 5 位数字,您需要 min(10000)
.
这是在字符串上使用 when
的示例。如果您转到 CodeSandbox,您会看到 myForm1
无效(强制执行最小值 10000,因为 "a" 匹配),但 myForm2
有效,因为 "b" 不匹配'符合条件。
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
import * as yup from "yup";
const myForm1 = {
radioValue: "a",
num: 1234
};
const myForm2 = {
radioValue: "b",
num: 1234
};
const schema = yup.object({
radioValue: yup.string(),
num: yup.number().when("radioValue", {
is: "a",
then: yup.number().min(10000),
otherwise: yup.number().min(0)
})
});
function App() {
const [myForm1IsValid, setMyForm1IsValid] = useState(null);
const [myForm2IsValid, setMyForm2IsValid] = useState(null);
useEffect(async () => {
setMyForm1IsValid(await schema.isValid(myForm1));
setMyForm2IsValid(await schema.isValid(myForm2));
}, []);
return (
<div className="App">
<h1>myForm1 is valid: {JSON.stringify(myForm1IsValid)}</h1>
<h1>myForm2 is valid: {JSON.stringify(myForm2IsValid)}</h1>
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);