尔若曾于React Native中构建表单,以React Hook Form及Zod或Yup等验证库为之,必尝遇一奇象:所谓"零之隐没"。
方才筑就纤巧结账或进阶之流,转瞬间,用户皆诉其每欲输入0,输入之域辄自净焉。
其罪魁者何?乃JavaScript之所谓"虚妄"也。
惑之所在:JavaScript之虚妄
于React Native,数字输入之始,常为null或undefined(或尔邦之数)。盖TextInput(或定制输入之件)欲string,故常铸其值若此:
// ❌ The Buggy Way
value={value ? String(value) : ''}
表观之,甚洁。若有值,则化其为文;无之,则示空文。
其隐忧:于JavaScript,0 乃虚妄。
惟当用户键入「零」,则 value ? ... 之式得 false,而输入遂为空字串 ('')。零瞬息消散,令用户惑乱,且验真之库或诟病其缺值。
其解:显式检核
欲解此,当止于虚妄之信,始察吾所重:值果如何。无或未定义.
// ✅ The Robust Way
value={value !== null && value !== undefined ? String(value) : ''}
言辞明晰,是以确保之。0(非空且非未定义者)已正确转为字符串并呈于界面。
实际例证:React Hook Form + Controller
此乃寻常之施为。此例中,吾等所察者,乃"已成之程"耳。0此乃极正当(且常见)之输入也。
<Controller
control={control}
name="completedStages"
render={({ field: { onChange, onBlur, value } }) => (
<Input
label="Completed Stages"
// The Fix: Ensure 0 is correctly rendered as a string
value={value !== null && value !== undefined ? String(value) : ''}
onChangeText={(text) => {
// Convert back to number for your validation schema (Zod/Yup)
const parsed = parseInt(text, 10);
onChange(isNaN(parsed) ? undefined : parsed);
}}
onBlur={onBlur}
keyboardType="number-pad"
placeholder="5"
error={errors.completedStages?.message}
/>
)}
/>
此事于 Zod 与 Yup 之故
验证库如 Zod 与 Yup 严于类型。若汝之 UI 逻辑将一值(0)化为一空字串(''),则汝之模式验证或以“必填”之错或类型不匹之误而败,纵使用户意欲入零。
汝若修正 UI 之表,则汝之数据流自可一以贯之:
- 用户入"0" ->界面见"0"
-
onChange解"0" ->钩子表存
0. -
Zod/Yup验
0->功成!
摘要
在 React Native 表单中,真值对于数字输入往往过于直率。处理之value属性
- 避之
value ? String(value) : '' - 更尚之
value !== null && value !== undefined ? String(value) : ''
此微变,可避移动表单开发中最常见(且烦人)之弊。












