数字的 Formik 输入值变成字符串,即使它作为数字通过 Formik 验证后也是如此
Formik input value for a number becomes a string even after it passes the Formik validation as a number
我有一个通过 Formik
的输入,它接受数字,但即使它通过了 Formik
验证,结果输入仍然被归类为 string
。
<Formik
initialValues={{ price: '' }}
onSubmit={submitHandler}
validationSchema={yup.object().shape({
price: yup
.number()
.required(),
})}
>
{({ values, handleChange, errors, setFieldTouched, touched, isValid, handleSubmit }) => (
<View style={styles.form}>
<View style={styles.fieldset}>
<Text style={{ marginLeft: 40, marginVertical: 10 }}>
<Text style={{ color: '#FF5D4E'}}>* </Text>
Price
</Text>
<TextInput
value={values.price}
keyboardType = 'numeric'
onChangeText={handleChange('price')}
placeholder="Rental price of your item per day"
style={styles.textInput}
onBlur={() => setFieldTouched('price')}
/>
</View>
{touched.price && errors.price &&
<Text style={{ fontSize: 10, color: 'red' }}>{errors.price}</Text>
}
<TouchableOpacity
disabled={!isValid || loading}
onPress={handleSubmit}
style={styles.button}
>
<Text style={styles.buttonText}>Submit</Text>
</TouchableOpacity>
</View>
)}
</Formik>
输入价格时,任何非数字都会收到警告。但是,当我控制台记录传递给 submitHandler
函数的值时,typeof
将价格值显示为字符串。
您可以像这样解析 onChangeText
中的 string
值:
{({ values, ...., setFieldValue }) => {
// parse string value to int
const parseAndHandleChange = (value, setFieldValue, id) => {
const parsed = parseInt(value, 10)
setFieldValue(id, parsed)
}
return (
<View>
{.....}
<TextInput
value={values.price}
keyboardType = 'numeric'
onChangeText={value => parseAndHandleChange(value, setFieldValue, 'price')}
placeholder="Rental price of your item per day"
style={styles.textInput}
onBlur={() => setFieldTouched('price')}
/>
</View>
)}
这只是一个示例,您可以根据您的用例随意修改。希望对你有帮助。
这只是在将 Formik 与 React Native 结合使用时发生的。在 React for web 中,您可以使用 type="number"
设置输入,但在 React Native 中则不能。
即使您将 keyboardType="numeric"
添加到 <TextInput />
。另一方面,如果你使用 Yup(我强烈推荐),这不是检查类型,只是检查内容,这意味着 "1"
可能被解释为一个数字。
解决方案:
import Formik from 'formik';
import * as yup from 'yup';
...
<Formik
initialValues={{ price: '' }}
validationSchema={yup.object().shape({ price: yup.number() })}
/>
{(values, setFieldValue, handleBlur) => (
<TextInput
value={values.price}
onChangeText={value => setFieldValue('price', parseFloat(value))}
onBlur={handleBlur('price')}
keyboardType="decimal-pad"
/>
)}
</Formik>
编码愉快!
我有一个通过 Formik
的输入,它接受数字,但即使它通过了 Formik
验证,结果输入仍然被归类为 string
。
<Formik
initialValues={{ price: '' }}
onSubmit={submitHandler}
validationSchema={yup.object().shape({
price: yup
.number()
.required(),
})}
>
{({ values, handleChange, errors, setFieldTouched, touched, isValid, handleSubmit }) => (
<View style={styles.form}>
<View style={styles.fieldset}>
<Text style={{ marginLeft: 40, marginVertical: 10 }}>
<Text style={{ color: '#FF5D4E'}}>* </Text>
Price
</Text>
<TextInput
value={values.price}
keyboardType = 'numeric'
onChangeText={handleChange('price')}
placeholder="Rental price of your item per day"
style={styles.textInput}
onBlur={() => setFieldTouched('price')}
/>
</View>
{touched.price && errors.price &&
<Text style={{ fontSize: 10, color: 'red' }}>{errors.price}</Text>
}
<TouchableOpacity
disabled={!isValid || loading}
onPress={handleSubmit}
style={styles.button}
>
<Text style={styles.buttonText}>Submit</Text>
</TouchableOpacity>
</View>
)}
</Formik>
输入价格时,任何非数字都会收到警告。但是,当我控制台记录传递给 submitHandler
函数的值时,typeof
将价格值显示为字符串。
您可以像这样解析 onChangeText
中的 string
值:
{({ values, ...., setFieldValue }) => {
// parse string value to int
const parseAndHandleChange = (value, setFieldValue, id) => {
const parsed = parseInt(value, 10)
setFieldValue(id, parsed)
}
return (
<View>
{.....}
<TextInput
value={values.price}
keyboardType = 'numeric'
onChangeText={value => parseAndHandleChange(value, setFieldValue, 'price')}
placeholder="Rental price of your item per day"
style={styles.textInput}
onBlur={() => setFieldTouched('price')}
/>
</View>
)}
这只是一个示例,您可以根据您的用例随意修改。希望对你有帮助。
这只是在将 Formik 与 React Native 结合使用时发生的。在 React for web 中,您可以使用 type="number"
设置输入,但在 React Native 中则不能。
即使您将 keyboardType="numeric"
添加到 <TextInput />
。另一方面,如果你使用 Yup(我强烈推荐),这不是检查类型,只是检查内容,这意味着 "1"
可能被解释为一个数字。
解决方案:
import Formik from 'formik';
import * as yup from 'yup';
...
<Formik
initialValues={{ price: '' }}
validationSchema={yup.object().shape({ price: yup.number() })}
/>
{(values, setFieldValue, handleBlur) => (
<TextInput
value={values.price}
onChangeText={value => setFieldValue('price', parseFloat(value))}
onBlur={handleBlur('price')}
keyboardType="decimal-pad"
/>
)}
</Formik>
编码愉快!