Vant UI表单验证报错 TypeError: Cannot read property ‘reduce‘ of undefined

VantUI 表单验证

之前使用Vant ui@v2.10.2 框架帮别人写了两个移动端页面,用到了from表单,但是令我不解的是from验证报错。

表单验证报错

直接点击提交按钮的时候就会如下报错:
TypeError: Cannot read property 'reduce' of undefined

vant点击表单验证报错
我明明就是使用官网的一些示例,跑一下就报错了,真的很令人费解。
无论是google搜索
在这里插入图片描述
还是百度搜索
在这里插入图片描述
或者是github issue搜索记录, 都没找到原因.
在这里插入图片描述

原因

后来自己测试对比后发现,form表单的每个字段都要:rules属性,否则就会报如上错误。

我在vant文档中也没看到必须要加这个属性的说明呀?
https://youzan.github.io/vant/#/zh-CN/form
只是有句话提了一下,并没有说必须要加

在表单中,每个 Field 组件 代表一个表单项,使用 Field 的rules属性定义校验规则

解决方式

在每个van-field表单项都加上:rules验证属性,就算当前表单项不做任何验证,也要添加否则就会报错(我的就是有个没有添加)
:rules="[{ required: false}]"
示例:(以下代码只是部分)

 <van-form @submit="onSubmit">
        <van-field
                :readonly="isDisabled"
                left-icon="user-o"
                required
                v-model="form.memberName"
                name="memberName"
                label="用户名"
                placeholder="请输入用户名"
                :rules="[{ required: true, message: '输入用户名'}]"
        ></van-field>

        <van-field
                left-icon="friends-o"
                required name="gender"
                label="性别"
                :rules="[{ required: true, message: '请选择性别'}]"
        >
            <template #input>
                <van-radio-group
                        :disabled="isDisabled"
                        v-model="form.gender"
                        direction="horizontal">
                    <van-radio icon-size="17px" name="男"></van-radio>
                    <van-radio icon-size="17px" name="女"></van-radio>
                </van-radio-group>
            </template>
        </van-field>
        
        <van-field
                :rules="[{ required: false}]"
                :readonly="isDisabled"
                left-icon="location-o"
                v-model="form.detailAddress"
                rows="2"
                size="2"
                label="地址"
                maxlength="50"
                show-word-limit
                type="textarea"
                placeholder="常住地址"
        ></van-field>
        
        <div style="margin: 16px;">
            <van-button round block type="info" native-type="submit">
                提交
            </van-button>
        </div>
    </van-form>

关于from表单还有个小问题,文档得看仔细。


点击表单中的普通按钮为什么会触发表单提交?
在表单中,除了提交按钮外,可能还有一些其他的功能性按钮,如发送验证码按钮。在使用这些按钮时,要注意将native-type设置为button,否则会触发表单提交。

<van-button native-type="button">
  发送验证码
</van-button>

这个问题的原因是浏览器中 button 标签 type 属性的默认值为submit,导致触发表单提交。我们会在下个大版本中将 type 的默认值调整为button来避免这个问题。


解决后的结果

添加后点击提交按钮就正常了,不会报那个错误了。
在这里插入图片描述

总结

Vue UI 使用基本很简单,上午看下午就可以写了,照着文档自己组合就行了,最怕的就是文档说明不仔细,导致开发者使用难受,我没找到原因之前,是自己手写的表单验证。

一些题外话
Vue这么流行,Vue优秀的官网文档是密不可分的,还有Python FastAPI文档,这俩官方文档我得吹一吹,写的真好!
不光是列举API, 还解释原因,对应的demo能够直接运行,不按照那样做会报什么错,常见的错误有那些等等等。

### Vue 项目中安装 Vant Design 遇到 `TypeError` 报错解决方案 当在 Vue 项目中集成 Vant Design 并遇到如下错误: ```plaintext TypeError: Cannot read properties of null (reading 'insertBefore') ``` 该问题通常源于 DOM 操作中的节点未正确加载或被误操作。以下是详细的排查和解决方法。 #### 错误原因分析 此类错误表明尝试访问的对象为 `null` 或者不存在,特别是在调用 `insertBefore` 方法时出现问题[^2]。这可能是由于组件生命周期管理不当、异步数据获取失败或是第三方库与框架之间的兼容性问题引起。 #### 排查步骤 ##### 组件挂载顺序验证 确认 Vant 组件是否按照预期顺序完成初始化。如果存在依赖于其他资源(如 API 请求返回的数据),则需确保这些前置条件满足后再渲染相关 UI 元素。 ##### 异常捕获机制设置 利用 Vue 的全局异常处理函数来捕捉潜在的运行期错误,并记录日志以便后续调试: ```javascript app.config.errorHandler = function(err, vm, info) { console.log('Error details:', err); }; ``` ##### 更新依赖版本 检查当前使用的 Vant 版本以及其它核心包(例如 vuevuex 等)是否有可用更新。有时官方会发布修复特定 bug 的补丁版本。 ##### 路由懒加载优化 对于大型应用来说,采用按需加载的方式可以减少初次加载时间并提高性能稳定性。通过 Webpack 动态导入语法实现模块分割: ```javascript const HomeView = () => import('@/views/Home.vue'); // 使用方式不变... { path: '/', name: 'home', component: HomeView, } ``` #### 实际案例解析 考虑到上述提到的情况,在实际开发过程中可能会因为路由跳转、页面切换等原因触发此类型的错误[^1]。为了防止这种情况发生,可以在进入含有复杂交互逻辑的新页面前先做必要的预检工作;另外也可以考虑使用防抖动技术延迟某些耗时较长的任务执行时机。 #### 示例代码调整建议 针对可能出现的问题场景,下面给出一段经过改进后的模板代码片段作为参考: ```html <template> <div v-if="isReady"> <!-- 正常显示的内容 --> </div> </template> <script setup lang="ts"> import { ref } from "vue"; let isReady = ref(false); async function init() { try { await someAsyncOperation(); // 假设这里有一个异步过程 isReady.value = true; } catch(e){ console.error("Initialization failed", e); throw e; // 可选:重新抛出以供外部进一步处理 } } init(); </script> ``` 这段代码展示了如何安全地等待某个异步任务完成后才允许界面完全呈现给用户查看,从而有效规避因过早触碰尚未准备就绪的 DOM 结构而导致的各种意外状况。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值