【愚公系列】《微信小程序与云开发从入门到实践》017-提供用户交互功能的组件

举报
愚公搬代码 发表于 2024/12/29 11:37:19 2024/12/29
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。博客内容.NET、...
标题 详情
作者简介 愚公搬代码
头衔 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
博客内容 .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎 👍点赞、✍评论、⭐收藏

🚀前言

在微信小程序的开发过程中,用户交互功能的实现是提升用户体验的关键。而微信小程序提供了一系列强大的组件,专门用于增强用户与应用之间的互动。这些组件不仅丰富了小程序的功能,也为开发者提供了灵活的工具,以满足不同场景下的交互需求。

本篇文章将深入探讨微信小程序中主要的用户交互组件,包括按钮、表单、滑动条、对话框等。我们将详细分析每个组件的特性、使用方法以及最佳实践,帮助你更好地理解如何通过这些组件来提升用户体验。

无论你是小程序开发的新手,还是希望优化现有应用的资深开发者,这篇文章都将为你提供实用的见解和技巧。让我们一起探索微信小程序提供的用户交互功能组件,创造出更加引人入胜的小程序体验吧!

🚀一、提供用户交互功能的组件

🔎1.button(按钮)组件及应用

按钮是页面开发中最常用的交互组件之一。小程序框架提供的 button 组件可配置的属性众多,可以通过实际代码演示来体验这些属性的效果。

🦋1.1 示例:在 buttonDemo 页面中使用按钮组件

  1. buttonDemo.wxml 文件中编写如下代码:
<!-- pages/buttonDemo/buttonDemo.wxml -->
<view>
  <button type="primary">Normal</button>
  <button type="primary" loading="true">Loading</button>
  <button type="primary" disabled="true">Disabled</button>
  <button type="default">default</button>
  <button type="warn">Warn</button>
  <button type="primary" plain="true">Plain</button>
  <button type="primary" disabled="true" plain="true">Plain Disabled</button>
  <button class="mini-btn" type="primary" size="mini">Mini Primary</button>
</view>
  1. buttonDemo.wxss 文件中为 button 组件添加边距样式:
/* pages/buttonDemo/buttonDemo.wxss */
button {
  margin: 20px;
}

运行代码后,效果如图所示。可以看到,默认的按钮组件样式简洁美观,很多时候,我们的小程序风格应尽量与微信应用程序整体风格保持协调,使用框架默认的样式是一个不错的选择。
在这里插入图片描述

🦋1.2 button 组件可配置的属性

button 组件支持以下可配置的属性:

属性名 类型 意义
size 字符串 设置按钮的尺寸类型,可选值为:
- default: 默认大小
- mini: 小尺寸
type 字符串 设置按钮样式类型,可选值为:
- primary: 主题色调按钮(绿色)
- default: 默认色调按钮(白色)
- warn: 警告色调按钮(红色)
plain 布尔值 设置是否为空的描边按钮
disabled 布尔值 设置是否禁用按钮
loading 布尔值 设置是否带 loading 状态
form-type 字符串 用于表单组件内,点击会触发表单的 submit 事件
open-type 字符串 关联的微信开放能力,可选值为:
- contact: 打开客服会话
- share: 触发用户转发
- getPhoneNumber: 获取用户手机号
- getUserInfo: 获取用户信息
- launchApp: 打开 App
- openSetting: 打开授权设置页
- feedback: 打开意见反馈页面
- chooseAvatar: 获取用户头像
hover-stop-propagation 布尔值 设置是否阻止本节点的祖先节点出现点击状态
hover-class 字符串 设置按钮按下时亮起的样式类
hover-start-time 数值 设置按钮按住后出现点击态的延迟时间,默认值为 20ms
hover-stay-time 数值 设置点击态消失后的延迟时间,默认值为 70ms
lang 字符串 指定返回用户信息的语言,可选值为:
- en: 英文
- zh_CN: 简体中文
- zh_TW: 繁体中文
session-from 字符串 设置会话来源
send-message-title 字符串 设置发送消息卡片标题,当 open-typecontact 时有效
send-message-path 字符串 设置发送消息卡片点击后跳转小程序路径,当 open-typecontact 时有效
send-message-img 字符串 设置发送消息卡片图片,当 open-typecontact 时有效
app-parameter 字符串 设置打开 APP 时传递的参数,当 open-typelaunchApp 时有效
show-message-card 布尔值 设置是否显示会话消息卡片,当 open-typegetUserInfo 时有效
bindgetuserinfo 函数 获取用户信息的回调,当 open-typegetUserInfo 时有效
bindcontact 函数 客服消息回调,当 open-typecontact 时有效
bindgetphonenumber 函数 获取用户手机号的回调,当 open-typegetPhoneNumber 时有效
binderror 函数 使用开放能力时失败的回调调,适用于所有 open-type
bindopensetting 函数 打开授权设置页的回调,当 open-typeopenSetting 时有效
bindlaunchapp 函数 打开 APP 完成后的回调,当 open-typelaunchApp 时有效
bindchooseavatar 函数 获取用户头像的回调,当 open-typechooseAvatar 时有效

示例:按钮集成微信分享能力

例如,要接入微信的分享能力,只需设置 open-type="share"

<button class="mini-btn" type="primary" size="mini" open-type="share">Mini Primary</button>

在这里插入图片描述

🔎2.switch(开关)组件及应用

switch 组件是一类特殊的按钮,它有开启和关闭两种状态。在很多应用的设置页面,都有类似的开关,比如控制是否有消息提示音,是否接收推送消息等。在 pages 文件夹下新建一组名为 switchDemo 的页面文件,在 switchDemo.wxml 文件中编写如下代码:

<!-- pages/switchDemo/switchDemo.wxml -->
<view>
  <switch checked="{{switchData}}" bindchange="switchChange"/> 开关按钮
</view>
<view style="margin: 20px;"></view>
<view>
  <switch type="checkbox" checked="{{checkData}}" bindchange="checkChange"/> 选择框按钮
</view>

上述代码中,使用了两个 switch 组件,其中一个设置为开关类型,另一个设置为选择按钮类型。在 switchDemo.js 文件中编写与之匹配的代码:

// pages/switchDemo/switchDemo.js
Page({
  data: {
    switchData: false,
    checkData: false
  },
  switchChange: function(data) {
    console.log(data.detail);
  },
  checkChange: function(data) {
    console.log(data.detail);
  }
});

当用户切换了开关按钮的状态时,会触发绑定的回调函数,传递进来的参数中的 detail 属性表示当前开关的状态。

运行上述代码,效果如图所示。

在这里插入图片描述

switch 组件的属性

属性名 类型 意义
checked 布尔值 当前开关是否开启或选中
disabled 布尔值 设置按钮是否禁用
type 字符串 设置按钮的类型,可选值为:
- switch: 开关类型
- checkbox: 选择框类型
color 字符串 设置按钮的颜色
bindchange 函数 设置开关状态改变时的回调函数

🔎3.checkbox 组件与 checkbox-group 组件及应用

switch 组件的 type 属性设置为 checkbox 时,其会渲染出一个选择框样式的按钮。其实在小程序开发框架中,专门提供了 checkboxcheckbox-group 组件来处理需要使用选择框的场景。checkbox 组件和 checkbox-group 组件内部可以定义一组 checkbox 组件,我们只需要在 checkbox-group 组件上绑定用户选择状态改变的事件即可。

pages 文件夹下新建一组名为 checkboxDemo 的页面文件,在 checkboxDemo.wxml 文件中编写如下代码:

<!-- pages/checkboxDemo/checkboxDemo.wxml -->
<checkbox-group bindchange="change">
  <checkbox value="足球">足球</checkbox>
  <checkbox value="篮球">篮球</checkbox>
  <checkbox value="乒乓球">乒乓球</checkbox>
</checkbox-group>

checkboxDemo.js 文件中实现绑定的回调事件函数:

// pages/checkboxDemo/checkboxDemo.js
Page({
  change: function(data) {
    console.log(data.detail.value);
  }
});

运行代码,页面上会显示一组选择框,当这一组选择框中的任意一个选中状态发生了变化时,都会调用回调函数,在其传递的参数中会装一个数组对象,数组中存放的是所有选中状态的 checkboxvalue 值。

上面的代码运行效果如图所示。
在这里插入图片描述

checkbox-group 组件的作用是包含一组 checkbox 组件,其本身并没有与 UI 有关的配置属性,只有一个 bindchange 属性可以设置。

checkbox 组件的属性

属性名 类型 意义
value 字符串 选择框的标识,触发 checkbox-group 组件的 bindchange 回调函数时,多数会携带所选中选择框的 value
disabled 布尔值 设置是否禁用
checked 布尔值 设置选择框是否选中
color 字符串 设置选择框的颜色

🔎4.radio 组件与 radio-group 组件及应用

通过 checkboxcheckbox-group 组合使用,相当于创建了一组支持多选的选择框组件。有些场景下,同样需要一组选择框,只是这些选择框互相之间是有约束关系的,即只能进行单选。这时候就需要使用 radioradio-group 组件。

pages 文件夹下新建一组名为 radioDemo 的页面文件,在 radioDemo.wxml 文件中编写如下代码:
以下是识别的内容:

<radio-group bindchange="radioChange">
  <radio value=""></radio>
  <view style="margin: 20px;"></view>
  <radio value=""></radio>
  <view style="margin: 20px;"></view>
  <radio value="保密">保密</radio>
</radio-group>

radioDemo.js 文件中实现回调函数如下:

// pages/radioDemo/radioDemo.js
Page({
  radioChange: function(data) {
    console.log(data.detail);
  }
});

需要注意,由于 radio 组件通常要求一组选项中只能选择一个,也就是说选项间是互斥的,因此在开发中要将互斥的选项放入同一个 radio-group 组件。运行上述代码,效果如图所示。

在这里插入图片描述

radio-group 组件与 checkbox-group 组件类似,其只提供了一个 bindchange 属性用于绑定回调事件。

radio 组件的属性

属性名 类型 意义
value 字符串 单选框的标识,触发 radio-group 组件的 bindchange 回调时,参数会携带选中的 radiovalue
checked 布尔值 设置当前选中的列表项
disabled 布尔值 设置是否禁用
color 字符串 设置选中框的颜色

🔎5.input 组件与 textarea 组件及应用

input 是一种单行文本输入组件,在需要接受用户输入的场景中会经常使用到,例如登录注册界面。新建一组名为 inputDemo 的页面文件,在 inputDemo.wxml 文件中编写如下示例代码:

<!-- pages/inputDemo/inputDemo.wxml -->
<view style="margin: 20px;">
  <input style="border: 2px red solid;" placeholder="文本输入框" type="text"/>
</view>
<view style="margin: 20px;"></view>
<view style="margin: 20px;">
  <input style="border: 2px red solid;" placeholder="数字输入框" type="number"/>
</view>
<view style="margin: 20px;"></view>
<view style="margin: 20px;">
  <input style="border: 2px red solid;" placeholder="密码输入框" type="password"/>
</view>
<view style="margin: 20px;"></view>
<view style="margin: 20px;">
  <input style="border: 2px red solid;" placeholder="输入框文本长度限制为10" maxlength="10"/>
</view>

在这里插入图片描述

input 组件可以通过 type 属性设置弹出键盘的类型。例如对于输入手机号码的场景,可以设置弹出的键盘为数字类型。input 组件所支持的属性较多,如表所示。

属性名 类型 意义
value 字符串 输入框中的内容
type 字符串 设置输入框弹出键盘的类型,可选值为:
- text: 文本输入键盘
- number: 数字输入键盘
- idcard: 身份证输入键盘
- digit: 带小数点的数字键盘
- safe-password: 密码安全输入键盘
- nickname: 昵称输入键盘
password 布尔值 设置是否为加密输入框,输入的文本会被处理成密文形式
placeholder 字符串 设置输入框为空时的占位文本
placeholder-style 字符串 设置占位文本的样式
placeholder-class 字符串 设置占位文本的样式类
disabled 布尔值 设置是否禁用
maxlength 数值 设置输入框内容可接受的最大文本长度,设置为 -1,为不限制
cursor-spacing 数值 设置光标与键盘间的间距
auto-focus 布尔值 设置是否自动获取焦点
focus 布尔值 设置获取焦点
confirm-type 字符串 设置键盘右下角按钮的文本,可选值为:
- send: 发送
- search: 搜索
- next: 下一个
- go: 前往
- done: 完成
always-embed 布尔值 强制键盘在组件失去焦点时保持不收起
confirm-hold 布尔值 设置点击键盘中的确认按钮后键盘是否保持不收起
cursor 数值 设置光标所在的位置
selection-start 数值 设置选中文本的起始位置
selection-end 数值 设置选中文本的结束位置
adjust-position 布尔值 设置是否自适应位置,即键盘弹出时是否自动上推输入框
hold-keyboard 布尔值 设置键盘弹出时,点击页面是否保持键盘不收起
safe-password-cert-path 字符串 设置安全键盘加密公钥的路径
safe-password-length 数值 设置安全键盘输入的密码长度
safe-password-time-stamp 数值 设置安全键盘加密的时间戳
safe-password-nonce 字符串 设置安全键盘加密盐值
safe-password-salt 字符串 设置安全键盘加密盐值
safe-password-custom-hash 字符串 设置安全键盘计算 hash 的算法表达式
bindinput 函数 设置键盘输入时触发的回调
bindfocus 函数 设置输入框获得焦点时触发的回调
bindblur 函数 设置输入框失去焦点时触发的回调
bindconfirm 函数 设置点击键盘上的「完成」按钮时触发的回调
bindkeyboardheightchange 函数 设置键盘高度发生变化时触发的回调

input 组件只支持单行文本的输入,对于需要输入大量文本的场景,需要使用另一组件:textareatextarea 为输入区域组件,其用法与 input 组件非常类似,示例如下:

<textarea placeholder="文本区域" style="height: 300px; border: red 1px solid;"></textarea>

运行代码,可以尝试在文本输入区域中点击软键盘输入多行文本,如图所示。

在这里插入图片描述

🔎6.editor 组件及应用

在前面的小节中,我们学习了富文本渲染组件 rich-text。有时候,用户不仅需要浏览富文本内容,甚至还需要生成富文本内容。小程序开发框架中提供了 editor 组件来支持富文本的输入。editor 的使用非常简单,且能够支持大部分富文本输入场景。

示例:使用 editor 组件

首先在 pages 文件夹下新建一组名为 editorDemo 的页面文件,在 editorDemo.wxml 文件中编写如下代码:

<!-- pages/editorDemo/editorDemo.wxml -->
<view>
  粗体: <switch bindchange="formatBold"></switch>
  斜体: <switch bindchange="formatItalic"></switch>
</view>
<view>
  上标: <switch bindchange="formatSuper"></switch>
  下标: <switch bindchange="formatSub"></switch>
</view>
<view>
  红色文字: <switch bindchange="formatColor"></switch>
  黄色背景: <switch bindchange="formatBG"></switch>
</view>
<view>
  <button type="primary" size="mini" bindtap="insertImg">图片</button>
  <button type="primary" size="mini" bindtap="insertDivider">分割线</button>
  <button type="primary" size="mini" bindtap="undo">撤回</button>
  <button type="primary" size="mini" bindtap="redo">恢复</button>
  <button type="primary" size="mini" bindtap="log">Log</button>
</view>
<editor 
  style="height: 300px; border: red 1px solid;" 
  placeholder="请输入文本编辑内容" 
  show-img-toolbar="{{true}}" 
  show-img-size="{{true}}" 
  show-img-resize="{{true}}" 
  bindready="onEditorReady">
</editor>

上述代码中,添加了许多控制富文本格式的按钮,例如字体加粗、斜体字体、文字添加颜色、文字添加背景、插入图片和分割线等。这些按钮和切换开关组件(switchbutton)我们在前面的章节已经学习过,editor 组件则是本节学习的重点。

Editor 组件的属性

属性名 类型 意义
read-only 布尔值 设置编辑器是否为只读
placeholder 字符串 设置内容文本为空时的提示文案
show-img-size 布尔值 设置点击内容中的图片时,是否展示图片的尺寸信息
show-img-toolbar 布尔值 设置点击内容中的图片时,是否展示图片的工具栏
show-img-resize 布尔值 设置点击内容中的图片时,是否可以修改图片的尺寸
bindready 函数 设置编辑器初始化完成时触发的回调
bindfocus 函数 设置编辑器获取焦点时触发的回调
bindblur 函数 设置编辑器失去焦点时触发的回调
bindinput 函数 设置编辑器内容发生变化时触发的回调
bindstatuschange 函数 设置编辑器使用的样式发生变化时触发的回调

可以看到,editor 组件本身可设置的属性并不多。读者可能会感到奇怪,editor 组件是怎么控制富文本的样式的,又是如何设置富文本内容或者让用户输入富文本内容的。这些工作需要通过 JavaScript 逻辑代码来完成。

使用 JavaScript 控制 editor 组件

editorDemo.js 文件中编写如下逻辑代码:

// pages/editorDemo/editorDemo.js
Page({
  // 富文本组件准备完成后,通过 JS 获取富文本实例
  onEditorReady: function() {
    wx.createSelectorQuery().select('#editor').context((result) => {
      this.editorContext = result.context;
    }).exec();
  },
  
  // 插入分割线
  insertDivider: function() {
    this.editorContext.insertDivider();
  },
  
  // 撤回
  undo: function() {
    this.editorContext.undo();
  },
  
  // 恢复
  redo: function() {
    this.editorContext.redo();
  },
  
  // 粗体
  formatBold: function(event) {
    this.editorContext.format('bold');
  },
  
  // 斜体
  formatItalic: function() {
    this.editorContext.format('italic');
  },
  
  // 上标
  formatSuper: function() {
    this.editorContext.format('script', 'super');
  },
  
  // 下标
  formatSub: function() {
    this.editorContext.format('script', 'sub');
  },
  
  // 颜色
  formatColor: function() {
    this.editorContext.format('color', '#ff0000');
  },
  
  // 背景色
  formatBG: function() {
    this.editorContext.format('backgroundColor', '#fdf4d7');
  },
  
  // 打印富文本内容
  log: function() {
    this.editorContext.getContents().then((res) => {
      console.log(res);
    });
  },
  
  // 插入图片
  insertImg: function() {
    this.editorContext.insertImage({
      src: "http://huishao.cc/img/head-img.png"
    });
  }
});

在 JavaScript 逻辑代码中,所有的富文本编辑器逻辑都是通过富文本编辑器上下文对象实现的,可以在 onEditorReady 回调中拿到富文本编辑器上下文对象,使用如下方法:

wx.createSelectorQuery().select('#editor').context((result) => {
  this.editorContext = result.context;
}).exec();

wx.createSelectorQuery 用来生成一个选择器对象,调用其 select 方法可以获取到页面中定义的组件 JavaScript 实例。editor 实例调用 context 方法可以获得其上下文对象。需要注意,此 context 方法是一个异步函数,调用 exec 执行后,可以在设置的 context 回调参数中拿到上下文对象,将其保存即可。

使用 EditorContext 上下文对象可以实现对富文本编辑器的样式管理、内容导入导出、图片插入等功能。EditorContext 对象中提供的方法如表所示。

方法名 参数 意义
format String name: 要设置的样式名
String value: 要设置的样式值,此参数可选
富文本编辑器的核心方法。调用此方法改变某个样式,再次设置相同的样式会取消此样式的使用。设置样式后,用户再输入的文本将使用最新的样式。
insertDivider Object object:
{
Function success: 成功后的回调
Function fail: 失败后的回调
Function complete: 完成后的回调
}
向编辑器中当前光标的位置插入分割线
insertImage Object object:
{
String src: 图片的路径
String alt: 图片加载失败的替代文本
Number width: 图片的宽度
Number height: 图片的高度
String extClass: 添加到 img 标签上的类名
Object data: 设置为对象,会被挂载到 data-custom 属性上
Function success: 插入图片成功后的回调
Function fail: 插入图片失败后的回调
Function complete: 插入图片完成后的回调
}
向编辑器中当前光标的位置插入图片
insertText Object object:
{
String text: 插入的文本
Function success: 插入文本成功后的回调
Function fail: 插入文本失败后的回调
Function complete: 插入文本完成后的回调
}
向编辑器中当前光标位置插入文本
setContents Object object:
{
String html: html格式的富文本内容
Object delta: 使用对象描述的富文本内容
Function success: 成功后的回调
Function fail: 失败后的回调
Function complete: 完成后的回调
}
设置编辑器中的内容
getContents Object object:
{
Function success: 成功后的回调
Function fail: 失败后的回调
Function complete: 完成后的回调
}
获取编辑器中的内容
clear 参数同上 清空编辑器中的内容
removeFormat 参数同上 清空当前编辑器设置的样式
undo 参数同上 撤销操作
redo 参数同上 恢复操作
blur 参数同上 使编辑器失去焦点,收起键盘
scrollIntoView 使光标滚动到窗口的可视区域内
getSelectionText Object object:
{
Function success: 成功后的回调
Function fail: 失败后的回调
Function complete: 完成后的回调
}
获取当前选中区域的文本

上面列举的方法中,format 方法是控制样式的核心方法。当我们需要设置用户即将输入的文本的样式时,调用这个方法设置即可。这个方法有两个参数:namevalue. 富文本组件支持的样式 name 及其对应的 value 值如表所示。

format 方法的 name 参数 对应的 value 参数 解释
bold 设置粗体样式,如果当前已经是粗体样式,再次设置会清除粗体
italic 设置斜体样式,如果当前已经是斜体样式,再次设置会清除斜体
underline 设置下划线样式,如果当前已经是下划线样式,再次设置会清除下划线
strike 设置删除线样式,如果当前已经是删除线样式,再次设置会清除删除线
ins 设置插入文本样式,如果当前已经是插入文本样式,再次设置会清除插入文本样式
script sub: 下标
super: 上标
设置下标或上标样式
header H1: 一级标题 设置标题样式
H2: 二级标题
H3: 三级标题
H4: 四级标题
H5: 五级标题
H6: 六级标题
align left: 左对齐 设置对齐样式
center: 中间对齐
right: 右对齐
justify: 两端对齐
direction rtl: 从右到左 设置字序
indent -1/+1 设置缩进
list ordered: 有序列表 设置列表样式
bullet: 无序列表
check: 选择框列表
color 十六进制颜色字符串 设置文本颜色样式
backgroundColor 十六进制颜色字符串 设置文本背景色样式
margin (包括 marginTop, marginBottom, marginLeft, marginRight) 与 CSS 可设置值一致
padding (包括 paddingTop, paddingBottom, paddingLeft, paddingRight) 与 CSS 可设置值一致
font (包括 fontSize, fontStyle, fontVariant, fontWeight, fontFamily) 与 CSS 可设置值一致
lineHeight 与 CSS 可设置值一致 设置行高样式
letterSpacing 与 CSS 可设置值一致 设置字符间距
textDecoration 与 CSS 可设置值一致 设置文本样式
textIndent 与 CSS 可设置值一致 设置文本缩进
wordWrap 与 CSS 可设置值一致 设置换行模式
wordBreak 与 CSS 可设置值一致 设置断行模式
whiteSpace 与 CSS 可设置值一致 设置空格样式

在这里插入图片描述
在这里插入图片描述
可以看到,控制台打印的富文本内容对象中有3部分数据:text为内容的纯文本数据;html为内容的 html 格式的富文本数据,可以将其保存,在任意的浏览器中进行渲染;delta为富文本内容的对象描述形式,其清晰地记录富文本中每一块内容的样式属性等数据,也可以将其保存后再次使用 editor 组件渲染。

🔎7.label组件、keyboard-accessory组件与 form 组件及应用

label组件用来扩展其绑定的组件的可响应区域;keyboard-accessory组件用来设置可随键盘调整位置的工具栏视图;form组件用来组合一组可交互组件的值一起提交,对于开发表单提交类的页面非常方便。

在示例工程的 pages 文件夹下新建一组名为 toolsDemo 的页面文件。

🦋7.1 基本用法及优化体验

回想一下我们学习过的 buttoncheckboxradioswitchinput 组件,这些组件很多时候都不是单独出现的,尤其是 checkboxradioswitch 组件。这三个组件本身没有描述信息,只是提供开关或选择功能,通常需要为其配备描述文本,例如下面的代码所示:

<!-- pages/toolsDemo/toolsDemo.wxml -->
<switch></switch>开关
<view style="margin: 20px;"></view>
<checkbox></checkbox>选择框
<view style="margin: 20px;"></view>
<radio></radio>单选

运行上述代码。我们发现,当点击页面中的文案描述部分时,switchcheckboxradio 组件并不会改变状态。这也就是说,必须点击这些交互组件本身才会触发组件的交互事件。这对用户来说体验并不太友好,尤其是在移动端设备上,设备的屏幕尺寸有限,用户手指操作的灵敏度也有局限性,这就要求组件有足够大的交互响应区域,可以将交互组件和文本同时包装进 label 组件中,这样当用户点击文本时,也能触发同 label 组件内的交互组件的事件。修改上述代码如下:

<!-- pages/toolsDemo/toolsDemo.wxml -->
<label><switch></switch>开关</label>
<view style="margin: 20px;"></view>
<label><checkbox></checkbox>选择框</label>
<view style="margin: 20px;"></view>
<label><radio></radio>单选</label>

再次编译代码,点击交互组件旁的文本,可以看到交互组件也可以正常响应了。
在这里插入图片描述

🦋7.2 使用 keyboard-accessory 组件

keyboard-accessory 组件需要配合能够弹出键盘的输入类组件进行使用。很多时候,输入框会配套工具栏进行使用,例如对于富文本编辑器来说,工具栏上可以放置文本格式控制按钮。当键盘弹出或收起时,工具栏也需要做同步的位置变动,此时使用 keyboard-accessory 组件就非常方便。编写如下示例代码:

<!-- pages/toolsDemo/toolsDemo.wxml -->
<textarea>
  <keyboard-accessory>
    <cover-view>工具栏</cover-view>
  </keyboard-accessory>
</textarea>

需要注意,上述代码只能在真机中进行测试,模拟器本身没有键盘弹出。此外,在 keyboard-accessory 组件内部编写工具栏时,一定要使用 cover-view 组件,这是一个覆盖在原生组件上的容器组件,直接使用 view 组件不能实现预期的效果。

🦋7.3 使用 form 组件

最后,我们再来看一下 form 组件。本章中介绍的 switchinputcheckbox 等交互组件在接收到用户的输入后,这些输入数据一般都要向服务端提交保存。例如编写如下示例代码:

<!-- pages/toolsDemo/toolsDemo.wxml -->
<label><switch></switch>开关</label> 
<view style="margin: 20px;"></view>
<checkbox-group>
  <label><checkbox value="1"></checkbox>选择框1</label>
  <label><checkbox value="2"></checkbox>选择框2</label>
</checkbox-group>
<view style="margin: 20px;"></view>
<radio-group>
  <label><radio value="1"></radio>单选1</label>
  <label><radio value="2"></radio>单选2</label>
</radio-group>
<button>提交</button>

可以为页面中的 button 组件添加一个点击事件,当用户点击提交按钮后,将页面上的组件的输入状态进行提交。但这样操作起来非常繁琐,首先要为每一个交互组件添加状态改变的事件处理函数,在处理函数中根据用户输入来存储对应的变量,当用户点击提交按钮时,将存储的变量的值进行提交。

也可以直接使用 form 组件将需要提交数据的交互组件进行包装。在使用 form 组件时,将要进行数据提交的交互组件放入 form 组件内,并且为 form 组件本身添加 report-submit 属性绑定提交事件。在 form 内部的交互组件需要添加 name 属性来为其设置 keyform 组件中的 button 组件上设置 form-type 属性为 submit 来实现提交功能。在触发的提交处理函数中,会将 form 内部所有交互组件的值作为参数传递。示例代码如下:

<!-- pages/toolsDemo/toolsDemo.wxml -->
<form bindsubmit="submit">
  <label><switch name="switch"></switch>开关</label>
  <view style="margin: 20px;"></view>

  <checkbox-group name="checkbox">
    <label><checkbox value="1"></checkbox>选择框1</label>
    <label><checkbox value="2"></checkbox>选择框2</label>
  </checkbox-group>
  <view style="margin: 20px;"></view>

  <radio-group name="radio">
    <label><radio value="1"></radio>单选1</label>
    <label><radio value="2"></radio>单选2</label>
  </radio-group>
  
  <button form-type="submit">提交</button>
</form>

实现 submit 处理函数如下:

// pages/toolsDemo/toolsDemo.js
Page({
  submit: function(data) {
    console.log(data.detail.value);
  }
});

运行代码,改变一下页面中各个按钮和选择框的状态,点击提交按钮后,观察控制台的输出,可以看到 form 组件已经将要提交的数据进行了聚合,使用非常方便。
在这里插入图片描述

🔎8.slider(滑块)组件及应用

slider 组件提供了一种范围内数据取值的方式,常用在音量调节、亮度调节等场景中。在示例工程的 pages 文件夹下新建一组名为 sliderDemo 的页面文件,在 sliderDemo.wxml 文件中编写如下代码:

<!-- pages/sliderDemo/sliderDemo.wxml -->
<slider min="{{0}}" max="{{50}}" step="{{2}}" value="{{value}}"
        backgroundColor="#ff0000" activeColor="#00ff00"
        show-value bindchanging="sliderChange"></slider>
<text>进度{{value}}</text>

上述代码中,定义了一个 slider 组件,并使用 text 组件来实时显示滑块组件的值。在 sliderDemo.js 文件中实现逻辑代码如下:

// pages/sliderDemo/sliderDemo.js
Page({
  data: {
    value: 10
  },
  sliderChange: function(event) {
    this.setData({
      value: event.detail.value
    });
  }
});

运行代码,效果如图所示。
在这里插入图片描述

slider 组件本身也有许多属性可配置,如表所示。

属性名 类型 意义
min 数值 设置滑块组件的最小值
max 数值 设置滑块组件的最大值
step 数值 设置滑块组件的步长,即控制的精度,需要能够被(max-min)整除
disabled 布尔值 设置组件是否禁用
value 数值 设置组件的当前取值
backgroundColor 字符串 设置滑块组件未选中部分的颜色
activeColor 字符串 设置滑块组件已激活部分的颜色
block-size 数值 设置滑块的大小,取值范围为 12-28
block-color 字符串 设置滑块的颜色
show-value 布尔值 设置组件是否显示当前的值
bindchange 函数 完成一次拖动后松开滑块时触发的回调
bindchanging 函数 滑块在滑动过程中产生值变化时触发的回调

🔎9.picker组件及应用

在应用开发中,经常会遇到一些需要用户从列表中选择一项出来的需求,例如选择生日、选择收货地址等。picker 组件是小程序开发框架中提供的一种标准的选择器组件。通过设置 picker 组件的 mode 属性,可以选择使用的选择器的类型。

pages 文件夹下新建一组名为 pickerDemo 的页面文件来编写示例代码。首先可以尝试一下时间选择器的使用,在 pickerDemo.wxml 文件中编写如下代码:

<!-- pages/pickerDemo/pickerDemo.wxml -->
<picker mode="time">点击选择时间</picker>

运行代码后,页面上会显示一行文本:点击选择时间。也可以使用自定义的视图来替换此文本,当用户点击该文本时,会从页面底部弹出选择器列表,如图所示。
在这里插入图片描述

时间选择器列表分为两列,左侧一列用来选择“时”,右侧一列用来选择“分”。picker 组件的 modetime 时,其有一些特殊的属性可以用来设置,如表所示。

属性名 类型 意义
value 字符串 设置选中的时间,格式为 “hh:mm”
start 字符串 设置可选时间的起点,格式为 “hh:mm”
end 字符串 设置可选时间的终点,格式为 “hh:mm”
bindchange 函数 设置选择器选中的值发生变化时的回调函数,接收一个参数 event,包含具体选择的值

当将 mode 设为 date 时,表示要使用日期选择器。示例代码如下:

<picker mode="date">点击选择日期</picker>

效果如图所示。

在这里插入图片描述

日期类型的选择器也有一些特殊的属性可以配置,如表所示。

属性名 类型 意义
value 字符串 设置选中的日期,格式为 “YYYY-MM-DD”
start 字符串 设置可选日期的起点,格式为 “YYYY-MM-DD”
end 字符串 设置可选日期的终点,格式为 “YYYY-MM-DD”
fields 字符串 设置选择器的细粒度,可选值为:yearmonthday
bindchange 函数 设置选择器的值发生变化的回调函数

除了时间和日期的选择外,开发中也经常会使用到地址选择的场景。picker 组件也内置了位置(地址)选择类型,示例代码如下:

<picker mode="region">点击选择县镇</picker>

效果如图所示。

在这里插入图片描述

位置选择器可配置的属性如表所示。

属性名 类型 意义
value 数组 选中的省市区
custom-item 字符串 为每一列选项的顶部添加一个自定义的选项
level 字符串 设置选择器的层级,可选值为: province: 省级选择器、city: 市级选择器、region: 区级选择器、sub-district: 街道选择器
bindchange 函数 设置选择器的值发生变化时的回调函数

picker 除了提供时间、日期和位置选择器外,还提供了两种自定义选择器,可以根据需要来使用。对于单列数据选择来说,可以使用 modeselectorpicker 组件,示例代码如下:

<picker mode="selector" range="{{dataArray}}" range-key="title">自定义单列选择器</picker>

其中,range 设置选择器列表的数据源,其需要设置为一个数组,数组中可以是任意对象。range-key 设置使用数据源数组中对象的哪个键值来渲染选择列表。在 pickerDemo.js 文件中编写如下代码来提供数据源:

// pages/pickerDemo/pickerDemo.js
Page({
  data: {
    dataArray: [
      {
        title: "公园",
        value: "data1"
      },
      {
        title: "市场",
        value: "data2"
      },
      {
        title: "商场",
        value: "data3"
      }
    ]
  }
});

运行代码,效果如图所示。
在这里插入图片描述

modeselector 时,支持设置的属性如表所示。

属性名 类型 意义
range 数组 数据源数组
range-key 字符串 设置用来展示选择器中选项的键值
value 数值 设置当前选中的第几项,从 0 开始计数
bindchange 函数 设置选择器的值发生变化时的回调函数

如果需要使用自定义的多列选择器,picker 组件也是支持的。设置 modemultiSelector 即可。示例代码如下:

<picker mode="multiSelector" range="{{multiDataArray}}" range-key="title">自定义多列选择</picker>

选择器有多列,因此需要提供的数据源数组也需要是二维的,代码如下:

// pages/pickerDemo/pickerDemo.js
Page({
  data: {
    multiDataArray: [
      [
        { title: "1-1" },
        { title: "1-2" }
      ],
      [
        { title: "2-1" },
        { title: "2-2" }
      ]
    ]
  }
});

运行代码,效果如图所示。
在这里插入图片描述

与自定义单列选择器相比,mode 可以为 multiSelectorpicker 组件使用 bindcolumnchange 属性,当用户对某一列的选择发生变化时,监听此方法。此模式下的 picker 组件可配置的属性如表所示。

属性名 类型 意义
range 二维数组 数据源数组
range-key 字符串 设置用来展示选择器中选项的键值
value 数组 数组中的每一项表示对应列中选择的第几个
bindchange 函数 Picker 选择器的值发生变化时的回调
bindcolumnchange 函数 Picker 所选择的列中选项发生变化时的回调

现在,已经基本上将 picker 组件的用法介绍完了。除了上面提到的针对某个 modepicker 组件所支持的特定属性外,picker 组件还有一些通用的属性可用,如表所示。

属性名 类型 意义
header-text 字符串 设置选择器的标题,仅在 Android 设备下有效
mode 字符串 设置选择器的模式,可选值为:
- selector: 自定义单列选择器
- multiSelector: 自定义多列选择器
- time: 时间选择器
- date: 日期选择器
- region: 省市区选择器
disabled 布尔值 设置是否禁用
bindcancel 函数 点击选择器上的取消按钮触发的回调
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。