微信小程序实战:表单与选择控件的结合
先上代码。
login.wxml
<mp-toptips msg="{{error}}" type="error" show="{{error}}"></mp-toptips>
<view class="page-body">
<mp-form id="form" rules="{{rules}}" models="{{formData}}">
<mp-cells title="信息绑定" >
<mp-cell prop="name" title="姓名" ext-class="cell" >
<input bindinput="formInputChange" data-field="name" class="weui-input"/>
</mp-cell>
<mp-cell prop="phone" title="手机号" ext-class="cell" >
<input bindinput="formInputChange" data-field="phone" class="weui-input"/>
</mp-cell>
<mp-cell prop="company" title="单位名称" ext-class="cell" >
<picker bindchange="bindPickerChange1" value="{{company}}" range="{{companyArray}}" range-key="name">
<view class="picker">
{{formData['company'] ? companyArray[company].name : '请选择'}}
<input hidden data-field="company" value="{{formData['company'] ? companyArray[company].name : '请选择'}}" class="weui-input"/>
</view>
</picker>
</mp-cell>
</mp-cells>
</mp-form>
<view class="weui-btn-area">
<button class="weui-btn" type="primary" bindtap="submitForm">确定</button>
</view>
</view>
login.wxss
.cell .weui-cell__hd{
width:200rpx;
}
login.js
// pages/login/login.js
const app = getApp()
Page({
/**
* 页面的初始数据
*/
data: {
// 单位
company:0,
companyArray:[
{
id:0,
name:'a'
},
{
id:1,
name: 'b'
}
],
rules: [{
name: 'name',
rules: { required: true, message: '姓名必填' },
}, {
name: 'phone',
rules: [{ required: true, message: '手机号必填' }, { mobile: true, message: '手机号格式不对' }],
}, {
name: 'company',
rules: { required: true, message: '单位名称必填' },
}],
formData:{}
},
formInputChange(e) {
const { field } = e.currentTarget.dataset
this.setData({
[`formData.${field}`]: e.detail.value
})
},
bindPickerChange1: function (e) {
this.setData({
company: e.detail.value,
[`formData.company`]: e.detail.value
})
},
submitForm() {
// console.log(this.selectComponent('#form'))
this.selectComponent('#form').validate((valid, errors) => {
// console.log('valid', valid, errors)
if (!valid) {
const firstError = Object.keys(errors)
if (firstError.length) {
this.setData({
error: errors[firstError[0]].message
})
}
} else {
// wx.showToast({
// title: '校验通过'
// })
// console.log(this.data.formData)
wx.showToast({
title: '绑定成功'
})
try {
// 同步接口立即写入
wx.setStorageSync('user', JSON.stringify(this.data.formData))
let token = wx.getStorageSync('user')
// console.log(token)
if (typeof app.globalData.haveToken === "boolean") {
app.globalData.haveToken = true
app.globalData.reloadFlag = true
}
// console.log(app.globalData.haveToken)
wx.switchTab({
url: '../index/index'
})
} catch (e) {
console.log('写入value2发生错误')
}
}
})
}
})
{
"component": true,
"usingComponents": {
"mp-toptips": "../../weui-miniprogram/toptips/toptips", // 悬浮提示
"mp-cell": "../../weui-miniprogram/cell/cell", // 布局用的
"mp-cells": "../../weui-miniprogram/cells/cells", // 布局用的,依赖 cell
"mp-form": "../../weui-miniprogram/form/form" // 表单,表单验证需要
}
}
下面是细节分析。
<mp-cell prop="company" title="单位名称" ext-class="cell" >
<picker bindchange="bindPickerChange1" value="{{company}}" range="{{companyArray}}" range-key="name">
<view class="picker">
{{formData['company'] ? companyArray[company].name : '请选择'}}
<input hidden data-field="company" value="{{formData['company'] ? companyArray[company].name : '请选择'}}" class="weui-input"/>
</view>
</picker>
</mp-cell>
formData是存表单数据的,默认空对象。
一开始的时候肯定是没有值的,所以选之前都会提示 请选择。
只要选过了,就有值了,表单验证就能通过,否则不能通过。
隐藏的输入框是配合表单的,可能不需要。
bindPickerChange1: function (e) {
this.setData({
company: e.detail.value,
[`formData.company`]: e.detail.value
})
},
对应的change 方法。
set 了两个值,一个是显示用的,一个是表单用的。
submitForm() {
// console.log(this.selectComponent('#form'))
this.selectComponent('#form').validate((valid, errors) => {
// console.log('valid', valid, errors)
if (!valid) {
const firstError = Object.keys(errors)
if (firstError.length) {
this.setData({
error: errors[firstError[0]].message
})
}
} else {
// wx.showToast({
// title: '校验通过'
// })
// console.log(this.data.formData)
wx.showToast({
title: '绑定成功'
})
try {
// 同步接口立即写入
wx.setStorageSync('user', JSON.stringify(this.data.formData))
let token = wx.getStorageSync('user')
// console.log(token)
if (typeof app.globalData.haveToken === "boolean") {
app.globalData.haveToken = true
app.globalData.reloadFlag = true
}
// console.log(app.globalData.haveToken)
wx.switchTab({
url: '../index/index'
})
} catch (e) {
console.log('写入value2发生错误')
}
}
})
}
表单验证方法。
校验规则是 this.data.rules.
this.data.rules 会和 this.data.formData 进行比对,如果rule里面相应值 formData没有就会校验失败,这是最简单的非空校验。
更复杂的校验在rules[index].rules数组中可以加对象,里面的每一个对象都会去验证。
以上。
微信小程序实战:表单与选择控件的结合的更多相关文章
- 微信小程序-form表单-获取用户输入文本框的值
微信小程序-form表单-获取用户输入文本框的值 <input name='formnickname' class="textarea" placeholder=" ...
- 微信小程序_(表单组件)checkbox与label
微信小程序组件checkbox官方文档 传送门 微信小程序组件label官方文档 传送门 Learn 一.checkbox组件 二.label组件与checkbox组件共用 一.checkbox组件 ...
- 微信小程序之表单验证
表单验证 何为表单验证呢? 百度百科给出的回答是这样的: 表单验证是javascript中的高级选项之一.JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证 [ ...
- 微信小程序_(表单组件)button组件的使用
微信小程序表单组件button官方文档 传送门 Learn 一.button组件的使用 一.button组件的使用 size:按钮的大小[默认值default] type:按钮的样式类型[默认值def ...
- 微信小程序之表单提交
页面绑定很多事件! <view class="content"> <view class="user personal_func_list"& ...
- 微信小程序常用表单校验方法(手机号校验、身份证号(严格和非严格校验、验证码六位数字校验))
util.js function isPhone(value) { if (!/^1(3|4|5|7|8)\d{9}$/.test(value)) { return false } else { re ...
- 微信小程序实战篇:商品属性联动选择(案例)
本期的微信小程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果,素材参考了一点点奶茶. 效果演示: 商品属性联动.gif 代码示例 1.commodity.xml <!-- < ...
- Web前端_微信小程序实战开发
微信小程序开发实战教程 一.微信小程序 它是一种混合开发的方式. 是安装在微信中的程序(一个程序最多2M空间). 1.1 注册 1 2 点击立即注册:进入下方页面 3 4 点击小程序进入表单填写页 ...
- 2017-01-11小程序form表单提交
小程序form表单提交 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...
随机推荐
- Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?
在 C/C++/Java 等等语言中,整型变量的自增或自减操作是标配,它们又可分为前缀操作(++i 和 --i)与后缀操作(i++ 和 i--),彼此存在着一些细微差别,各有不同的用途. 这些语言的使 ...
- docker已运行容器里的时区修改
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 或者 cp /usr/share/zoneinfo/Asia/Shanghai ...
- Python表达式与生成式
Python表达式与生成式 前言 本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作.其中涉及到一些性能问题(微乎其微)可以不做考虑. 三元表达式 三元表达式中有三个重要的 ...
- MarkDown编辑器的区别对比
标题: MarkDown编辑器的区别对比 作者: 梦幻之心星 sky-seeker@qq.com 标签: [MarkDown, 编辑器,区别] 目录: [软件] 日期: 2020-6-22 前提说明 ...
- node+ajax实战案例(1)
1.mysql入门 1.1.数据库相关概念 1.1.1.什么是数据? 描述事物的符号记录称为数据,描述事物的符号可以是数字.文字.声音.图片.视频等,有多种表现形式,都可以经过数字化后存入计算机 1. ...
- cbitmap 获取RGB
CBitMap的用法 MFC提供了位图处理的基础类CBitmap,可以完成位图(bmp图像)的创建.图像数据的获取等功能.虽然功能比较少,但是在对位图进行一些简单的处理时,CBitmap类还是可以 ...
- JavaScript手写new方法
1.看一下正常使用的new方法 function father(name){ this.name=name; this.sayname=function(){ console.log(this.nam ...
- JS动画三剑客——setTimeout、setInterval、requestAnimationFrame
一.前言 前端实现动画效果主要有以下几种方法:CSS3中的transition 和 animation ,Javascript 中可以通过定时器 setTimeout.setinterval,HTML ...
- spring bean post processor
相关文章 Spring 整体架构 编译Spring5.2.0源码 Spring-资源加载 Spring 容器的初始化 Spring-AliasRegistry Spring 获取单例流程(一) Spr ...
- django admin 添加用户出现外键约束错误
今天在做mxonline项目时,注册了用户表进admin后,想在后台添加一个用户试试,结果出现了错误,经过一番搜索发现以下两个解决方法,不过我只用了一种 报错信息: IntegrityError: ( ...