第十章:小程序表单与医疗急救卡(下)

智数破浪人
• 阅读 3160

作者:知晓云 - 小程序开发快人一步
来源:知晓课堂

在上一节,我们了解了许多表单组件的用法。在这一节,我们将会继续对小程序进行开发。

特殊功能开发

小程序请求呼出电话

添加输入框 input 组件和按钮 button 组件,用以输入紧急联系人电话号码和点击 button 拨打号码

`<!-- pages/index/index.wxml -->
<view>
 <view>紧急联系人电话号码:</view>
 <input name="phoneNumber" type="number" bindinput="phoneNumberChange" placeholder="请输入紧急联系人电话号码" placeholder-class />
 <button size="mini" bindtap="makePhoneCall">拨打紧急联系人号码</button>
</view>
 
 
// pages/index/index.js
pages({
 data: {
  phoneNumber: '',
 },
 phoneNumberChange: function(e) {
  let phone = e.detail.value
  this.setData({
   phoneNumber: phone
  })
 },
 makePhoneCall: function() {
  let {phoneNumber} = this.data
  wx.makePhoneCall({
   phoneNumber: phoneNumber,
  })
 },
}) `

在这里,我们用到了新的 API:wx.makePhoneCall(OBJECT)。先来了解一下它的参数。

  • phoneNumber: 需要拨打的电话号码,是必填的。
  • success: 接口调用成功的回调函数。
  • fail: 接口调用失败的回调函数。
  • complete: 接口调用结束的回调函数(调用成功、失败都会执行)。

动态调整按钮行为

如果用户没有提交过表单,那么 button 显示为「提交」,点击 button 提交时,后台会在数据表中新建一行数据,这行数据会有一个唯一的表示 _id;

当用户提交过表单后,再次提交表单不应该新建数据行,而是应该更新已有数据行的数据(该行数据的 _ id 不会改变),同时 button 显示为「更新」;

`<!-- pages/index/index.wxml -->
<view>
 <button size="mini" formType="submit" hidden="{{isShowUpdate}}">提交</button>
 <button size="mini" formType="submit" hidden="{{!isShowUpdate}}">更新</button>
</view>
 
// pages/index/index.js
pages({
 data: {
  isShowUpdate: false,
 },
})
`

提交表单分为两种:初次提交和修改表单后提交。

我们可以在 data 中新增一项属性 form: null,在用户提交表单成功后,将 form 的值设置为表单内各组件的值。这样,我们可以通过 form 是否等于 null 来判断用户是否是初次提交。

`// pages/index/index.js
pages({
  data: {
    form: null,
  },
 
  formSubmit: function(e) {
    let val = e.detail.value
    let tableID = 4066
    let Product = new wx.BaaS.TableObject(tabelID)

  // 判断如果不是初次提交,则更新数据(更新服务器上已有的数据)
    if (this.data.form !== null) {
      // example 为访问自定义服务器接口函数
      example(val).then(res => {
        // 数据更新成功后,提示用户 “更新成功”
        wx.showToast({
          title: '更新成功'
        })
      }), err => {
        // 数据更新失败后,提示用户 “更新失败”
        wx.showToast({
          title: '更新失败'
        })
      })
      return
    }
 
    // 用户未选择血型,则默认为 A 型血
    if (!val.bloodType) {
      val.bloodType = this.data.index.toString()
    }
 
    // 初次提交,将数据上传到服务器
    example(val).then(res => {
      wx.showToast({
        title: '提交成功'
      })
 
      // 将 data 中的 form 值设置为返回的数据,并且将按钮 “提交” 改为 “更新”
      this.setData({
        form: { ...res.data },
        isShowUpdate: true,
      })
    }, err => {
      wx.showToast({
        title: '提交失败'
      })
    })
  },
}) `

显示用户创建的医疗急救卡

我们想要达到的目的是:用户已提交成功表单,那么,小程序启动后直接显示表单,且表单内组件默认值为已提交表单的数据。

这时,我们就需要在 onLoad 事件中获取数据表中的表单数据,并且将表单内组件的默认值设置为获取到的相应数据。

以下是详细的 WXML 代码,每个组件增加默认 value 属性。

`<!-- pages/index/index.wxml -->
<view wx:else>
 <form bindsubmit="formSubmit">
  <view>
   <view>姓名:</view>
   <input name="name" value="{{form.name}}" placeholder="请输入姓名" placeholder-class />
  </view>
  <view></view>
  <view>
   <view>性别:</view>
   <radio-group name="gender">
    <label><radio value="男" checked="{{form.gender === '男'}}">男</radio></label>
    <label><radio value="女" checked="{{form.gender === '女'}}">女</radio></label>
   </radio-group>
  </view>
  <view></view>
  <view>
   <view>血型:</view>
   <picker name="bloodType" value="{{form.bloodType}}" bindchange="bloodTypeChange" range="{{bloodTypes}}">
    <view>
     当前选择:{{bloodTypes[index]}}
    </view>
   </picker>
  </view>
  <view></view>
  <view>
   <view>选择医疗情况:</view>
   <checkbox-group name="medicalConditions">
    <label>
     <checkbox wx:for="{{medicalConditions}}" wx:key="{{index}}" value="{{item.name}}" checked="{{item.checked}}">{{item.name}}</checkbox>
    </label>
   </checkbox-group>
  </view>
  <view></view>
  <view>
   <view>填写服药情况:</view>
   <textarea name="medicationCompliance" value="{{form.medicationCompliance}}" placeholder="填写服药情况" auto-height="true"></textarea>
  </view>
  <view></view>
  <view>
   <view>是否为器官捐献者:</view>
   <switch name="isOrganDonor" checked="{{form.isOrganDonor}}"></switch>
  </view>
  <view></view>
  <view>
   <view>紧急联系人电话号码:</view>
   <input name="phoneNumber" type="number" value="{{form.phoneNumber}}" bindinput="phoneNumberChange" placeholder="请输入紧急联系人电话号码" placeholder-class />
   <button size="mini" bindtap="makePhoneCall">拨打紧急联系人号码</button>
  </view>
  <view></view>
  <view>
   <button size="mini" formType="submit" hidden="{{isShowUpdate}}">提交</button>
   <button size="mini" formType="submit" hidden="{{!isShowUpdate}}">更新</button>
  </view>
 </form>
</view>
// pages/index/index.js
pages({
  onLoad: function() {
    let medical = this.data.medicalConditions
    // 获取自定义服务器上的数据
    example().then(res => {
      // 示例,所有数据存储在 res.data.objects 中
      let obj = res.data.objects
      // 判断数据表有数据时,设置表单内组件的默认 value
      if (obj) {
        let medical = this.data.medicalConditions
        for (let i = 0; i < medical.length; i++) {
          if (obj.medicalConditions.includes(medical[i].name)) {
            medical[i].checked = true
            this.setData({
              medicalConditions: medical,
            })
          }
        }
        this.setData({
          index: obj.bloodType,
          isShowMedicalCard: true,
          form: { ...obj },
          isShowUpdate: true,
        })
      }
    }, err => {
      wx.showToast({
        title: '获取数据出错'
      })
    })
  },
})`

关注「知晓云」公众号,点击菜单栏「知晓云」-「知晓课堂」,获取更多开发教程。

第十章:小程序表单与医疗急救卡(下)

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这