form表单验证
前言:做获奖申报时,我想把一些输入框设置为必填,原生小程序中没有表单验证,如果在后端将输入框内的变量挨个使用 if ……else
似乎过于麻烦,结构太复杂,我想用vant组件的表单验证解决,但是遇到点问题:vant-form组件无法引入
改变思路,尝试引入vue组件,经过一些操作,成功报错
发生错误SyntaxError: parse js file (D:\微信小程序开发\微信小程序练习\miniprogram-18/miniprogram/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js) failed: Unexpected token (333:15)
解决方法:
清除npm缓存
1 | npm cache clean --force |
柳暗花明又一村
uni-app
然后我选择了uni-app组件
组件官方文档:https://uniapp.dcloud.io/
uni-app 推荐使用 Hbuilderx 开发工具来开发项目
下载地址:https://www.dcloud.io/hbuilderx.html
Hbuilder X
使用HbuilderX打开微信开发者工具
1、安装 sass 插件
点击 工具 => 插件安装 => 安装新插件 => 前往插件市场安装 ,找到需要的插件之后点击下载 => 使用Hbuilderx 导入插件,这里需要登录 sass 的网站,如果登录成功则会打开 Hbuilderx 编译器,然后点击确定就可以安装了;
2、新建uni-app项目
Hbuilderx 点击 文件=>新增=>项目 ,本文新建一个小程序项目:uni-app => 填写项目名称、选择项目存放路径 => 模板 uni-ui 项目=>创建,然后就可以生成一个小程序项目;
3、配置 appid
在 manifest.json 文件 => 微信小程序配置 填写微信小程序 appID;(在微信开放平台上找)
4、在 Hbuilderx 配置微信开发者工具的安装路径:这样可以在 Hbuilderx 里面运行的时候自动打开微信开发者工具查看项目
工具 => 设置 => 运行配置 => 小程序运行配置 配置微信开发者工具的安装路径,如:D:\微信小程序开发\微信web开发者工具
5、在微信开发者工具开启服务端口
设置 => 安全设置 => 安全 开启服务端口
6、运行
Hbuilderx 点击 运行=>运行到小程序模拟器 点击第一个就可以在 Hbuilderx 自动编译,成功之后会自动打开微信开发者工具;
注意:这个时候我们想修改项目里面的内容,需要在 Hbuilderx 里面修改,例如修改配置:manifest.json 文件 => 源码视图
成功:
浅尝Hbuilder X
创建新页面
打开pages文件夹,右键创建新页面
创建成功之后,pages.json中出现一下内容
尝试创建tabbar
在pages.json中写入,同app.json中写法相同
通过ctrl
+ s
快捷键保存自动运行,微信开发者工具上即可显示
尝试表单
HbuilderX页面中只有一个index.vue文件,因此要将前后端写在一起
template前端(wxml)
script后端(js)
style样式(wxss)
后端代码中,小程序中的 data:{}
中的变量相当于这里的
1 | data() { |
经过官方文档发现,这里改变赋值不需要
1 | this.setData({ |
再来看前端代码
这里的@submit
相当于微信小程序中的 bindsubmit
@input
相当于 bindinput
大胆推测在vue中 @
的作用相当于小程序中的 bind
这样似乎就写好了一个表单,但是我们的目的是做表单验证,让输入框为必填项
开始表单验证
这里需要引入 uni-forms
组件进入 Hbuilder X
:
官方文档提供的组件下载地址:https://ext.dcloud.net.cn/plugin?id=2773
在vue文件中引入组件,注意文件夹位置为实际文件夹位置,不要复制粘贴
一定要引入组件!!!找了好多文章,完全没有提引入的事情
1 | <script> |
引入之后,我的小程序依旧报错
1 | Component is not found in path "uni_modules/uni-forms/components/uni-forms/uni-forms" (using by "pages/index/index")(env: Windows,mp,1.06.2402021; lib: 3.3.4) |
如果路径没有问题的话,就可以尝试清除缓存,重新启动
<uni-forms>
提供了 rules属性来描述校验规则、 <uni-forms-item>
子组件来包裹具体的表单项,以及给原生或三方组件提供了 onFieldChange()
来校验表单值。
每个要校验的表单项,不管input还是checkbox,都必须放在 <uni-forms-item>
组件中,且一个 <uni-forms-item>
组件只能放置一个表单项。
<uni-forms-item>
组件内部预留了显示error message的区域,默认是在表单项的底部。
另外, <uni-forms>
组件下面的各个表单项,可以通过 <uni-group>
包裹为不同的分组。同一 <uni-group>
下的不同表单项目将聚拢在一起,同其他group保持垂直间距。 <uni-group>
仅影响视觉效果。
来写一个简单的表单吧
前端
源码
1 | <template> |
这里要用到了两个之前引入的组件
ref
是这个表单的名字
:model
定义的是该表单储存数据的字典,内的元素以key/value这种键值对的形式存在
:rules
定义的是验证规则
实现表单验证主要依靠这个组件
之前提到过,uni-forms中要实现表单验证需要搭配uni-forms-item组件使用,一个组件内只能放一个input,因此可以get到这个组件类似于view且将表单中的name元素写在这个位置
一些属性:
还要注意的是这里的input内几个用法
v-model="formData.name"
我的理解是这个相当于微信小程序input组件的value元素,这里的
v-model
指向的是之前:model
定义过的字典,对应的是name的value@input="event => binddata('name',event.detail.value,'form')"
之前提到过@相当于bind所有这个解释bindinput输入事件,作用是输入时改变字典内相对于的值
‘name’,就是指向字典内的key值;
‘event.detail.value’,是输入的内容;
‘form’,是指表单名称,由之前的ref定义的
后端
1 | <script> |
后端相比于小程序的变化前面已经说过了,直接看代码,因为之前定义了一个 formData
的变量,因此需要在后端进行补充,这里定义了需要用到的键值对
然后定义表单验证规则,毕竟红点只是前端,只是看,这里的结构为
1 | // 这里的rules是前端用 `:rules` 命名的无特殊含义 |
rules的一些属性
这里学到了一个知识点,对代码简化很有帮助
1 | binddata(fieldName, value, form) { |
这里的fieldName
是一个动态参数,而且fieldName
并不固定可以由自己随意改变
这个函数为多输入框的单一函数提供了简单方法,去掉了一些机械重复的代码,爽了
注意官网上并没有用到这个方法,是直接通过v-model
绑定的,一些不支持绑定的组件才会使用@input
事件
提交/验证事件
1 | submit() { |
这里的$refs
是一个对象
$refs.form
指向的就是命名为form
的表单
validate()
是组件内自带的一个方法,作用就是验证表单,比较有了规则,还有有执行规则的
validate
方法返回一个Promise
,它在校验成功时会被解析,校验失败时会被拒绝。
这样一个简陋的表单验证就完成了