先上代码。

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发生错误')
}
}
})
}
})
picker 是小程序自带的组件,类似于select,选择控件。
mp-* 是WeUI 的组件,使用之前需要在json文件中引入。
login.json
{
"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数组中可以加对象,里面的每一个对象都会去验证。

以上。

微信小程序实战:表单与选择控件的结合的更多相关文章

  1. 微信小程序-form表单-获取用户输入文本框的值

    微信小程序-form表单-获取用户输入文本框的值 <input name='formnickname' class="textarea" placeholder=" ...

  2. 微信小程序_(表单组件)checkbox与label

    微信小程序组件checkbox官方文档 传送门 微信小程序组件label官方文档 传送门 Learn 一.checkbox组件 二.label组件与checkbox组件共用 一.checkbox组件 ...

  3. 微信小程序之表单验证

    表单验证 何为表单验证呢? 百度百科给出的回答是这样的: 表单验证是javascript中的高级选项之一.JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证 [ ...

  4. 微信小程序_(表单组件)button组件的使用

    微信小程序表单组件button官方文档 传送门 Learn 一.button组件的使用 一.button组件的使用 size:按钮的大小[默认值default] type:按钮的样式类型[默认值def ...

  5. 微信小程序之表单提交

    页面绑定很多事件! <view class="content"> <view class="user personal_func_list"& ...

  6. 微信小程序常用表单校验方法(手机号校验、身份证号(严格和非严格校验、验证码六位数字校验))

    util.js function isPhone(value) { if (!/^1(3|4|5|7|8)\d{9}$/.test(value)) { return false } else { re ...

  7. 微信小程序实战篇:商品属性联动选择(案例)

    本期的微信小程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果,素材参考了一点点奶茶. 效果演示:   商品属性联动.gif 代码示例 1.commodity.xml <!-- < ...

  8. Web前端_微信小程序实战开发

    微信小程序开发实战教程 一.微信小程序 它是一种混合开发的方式. 是安装在微信中的程序(一个程序最多2M空间). 1.1 注册 1  2 点击立即注册:进入下方页面 3  4 点击小程序进入表单填写页 ...

  9. 2017-01-11小程序form表单提交

    小程序form表单提交 1.小程序相对于之前的WEB+PHP建站来说,个人理解为只是将web放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...

随机推荐

  1. 【K8S】Service服务详解,看这一篇就够了!!

    k8s用命名空间namespace把资源进行隔离,默认情况下,相同的命名空间里的服务可以相互通讯,反之进行隔离. 1.1 Service Kubernetes中一个应用服务会有一个或多个实例(Pod, ...

  2. python动态柱状图图表可视化:历年软科中国大学排行

    本来想参照:https://mp.weixin.qq.com/s/e7Wd7aEatcLFGgJUDkg-EQ搞一个往年编程语言动态图的,奈何找不到数据,有数据来源的欢迎在评论区留言. 这里找到了一个 ...

  3. 01-最大子列和问题(java)

    问题描述:给定N个整数的序列{A1,A2,A3,…,An},求解子列和中最大的值. 这里我们给出{-2,11,-4,13,-5,-2}这样一个序列,正确的最大子列和为20 该题是在数据结构与算法中经常 ...

  4. Chrome插件Postman的数据目录存储位置,记一次重装系统后找回postman数据的过程...

    有次重装系统到一块新的SSD磁盘,很多数据都做了备份就是忘记将Chrome插件Postman的数据做备份,导致重装后找不到以前定义的那些Collections.悔恨之余想到既然我原来的C盘还在,为何不 ...

  5. Linux文件权限学习笔记

    文件权限共10个字符,第一个字符表示该文件是[文件夹]或[文件]——如果是字符“d"则表示该文件是文件夹:如果是字符“-”则表示是文件. 后九个字符,三个一组,共三组,分别表示[所有者权限] ...

  6. Spring中AOP相关的API及源码解析

    Spring中AOP相关的API及源码解析 本系列文章: 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configuration注解? 谈谈Spring ...

  7. day02小程序配置

    附上微信小程序开发文档的网址:https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/app.html 学技术 ...

  8. USACO07NOV Cow Relays G 题解

    题目 For their physical fitness program, \(N (2 ≤ N ≤ 1,000,000)\) cows have decided to run a relay ra ...

  9. Linux进程监控命令

    最近使用centos在建站,没有用市面上的什么服务商的服务器,自己用树莓派3B+建了这个博客.但是发现经常宕机,所以想看看服务器在干什么,百度了很久,发现vmstat命令不错,拿出来推荐推荐. 这是我 ...

  10. Kail系统更新指令

    0x00源更新 国内更新源 leafpad /etc/apt/sources.list 然后复制粘贴下面的源 #kali官方源 deb http://http.kali.org/kali kali-r ...