微信小程序实战:表单与选择控件的结合
先上代码。
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放到了微信端,用小程序固定的格式前前端进行布局.事件触发和数据的输送和读取,服务器端可以用任何后端语言写,但 ...
随机推荐
- 基于flask的城市空气质量分析系统
1.1 系统功能 在对主要需求进行分析后,确定系统由以下几个模块组成. 1) 用户信息管理: 该部分主要完成系统管理员的增加.删除.编辑和访问控制权限等操作. 2) 数据管理: 该部分主要完成后台存 ...
- python测试标准库doctest
引言: doctest是python的一个测试用标准库. 顾名思义,这个模块会寻找程序里面看起来像交互式Python会话的文本片段,然后运行这个会话,来判断实际运行结果和你希望的结果是否一致. 这个模 ...
- 06 . Jenkins分布式构建和Pipline
Pipline简介 pipline 是帮助 Jenkins 实现 CI 到 CD 转变的重要角色,是运行在 jenkins 2.X 版本的核心插件,简单来 说 Pipline 就是一套运行于 Jenk ...
- 乌班图设置C++11
zsh: echo "alias g++='g++ -std=c++11'" >> ~/.zshrc source ~/.zshrc bash: echo " ...
- vue-cli按装 和vue创建项目
安装 创建
- Spark 环境问题记录和解决方法
Spark 版本配套表 名称 版本 说明 Spark spark-2.3.0-bin-hadoop2.7 Spark mongo-java-driver-3.5.0.jar 3.5 Mongo驱动 m ...
- 别逃避,是时候来给JVM一记重锤了
今天是猿灯塔“365天原创计划”第2天. 今天讲: 为什么写这个主题呢? 之前看到不少同学在讨论, 今天呢火星哥抽出点时间来帮大家整理一下关于JVM的一些知识点 一.JVM是什 ...
- java的运行
1.打成war包 war需要部署到tomcat中运行. 2.jar包 A 可执行jar包 java -jar some.jar B 普通jar包 java -cp "dir/*" ...
- 每日一题 - 剑指 Offer 46. 把数字翻译成字符串
题目信息 时间: 2019-07-02 题目链接:Leetcode tag: 动态规划 难易程度:中等 题目描述: 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ...
- bootstrap悬停下拉菜单显示
使用Bootstrap导航条组件时,如果你的导航条带有下拉菜单,那么这个带下拉菜单的导航在点击时只会浮出下拉菜单,它本身的href属性会失效,也就是失去了超链接功能,这并不是我想要的,我希望导航条的链 ...