界面交互
加载提示
- 加载提示框常配合网络请求来使用,用于增加用户体验,对应的API有2个
- wx.showLoading:显示加载提示框
- wx.hideLoading:隐藏加载提示框
// pages/index/index.js
Page({
// ...省略前面小节代码
// 获取学生表表
getStudentList() {
// 显示提示框
wx.showLoading({
title: '正在加载...',
mask: true,
})
// 发起请求
wx.request({
url: 'https://mock.boxuegu.com/mock/3293/students',
method: 'GET',
// 这里注意因为 this 的原因,推荐使用箭头函数
success: (res) => {
this.setData({
// 更新 students 数组
students: res.data.result,
})
},
complete() {
// 隐藏提示框
wx.hideLoading()
},
})
},
})
信息反馈
信息反馈是指根据用户的某些操作来告知操作的结果,如用户点击加入购物车,提示用户添加成功,用户提交表单提示用户表单验证的结果等,对应的 API 是 wx.showToast
;以下是表单验证的实例:
<!-- pages/index/index.wxml -->
<!-- 省略了部分代码 -->
<input type="text" model:value="{{username}}" placeholder="请填写您的姓名" />
<button type="primary" bind:tap="submitForm">提交</button>
// 调用 Page 函数
// pages/index/index
Page({
data: {
msg: '大家好,这是我的第一个小程序!',
number: 1,
seen: true,
isLogin: true,
username: '',
students: [],
},
// 省略部分代码...
submitForm() {
console.log(this.data.username);
// 验证姓名只能为汉字
const reg = /^[\u4e00-\u9fa5]{2,5}$/;
// 验证结果
const valid = reg.test(this.data.username.trim());
// 提示验证结果
if (!valid) {
return wx.showToast({
title: '姓名只能为2到5位汉字!',
icon: 'none',
});
}
},
});
为了更好的用户体验,wx.showToast在调用的时候能传入7个参数:
title
指定显示的文字提示内容(不能省略)mask
提供一个透明层阻止对页面其它内容进行操作icon
指定图标类型duration
指定信息反馈的显示时长success
信息反馈成功后的回调(很少用到)fail
信息反馈失败后的回调(很少用到)complete
信息反馈完成后的回调(包括成功和失败两种情况)
但是在项目开发的时候,我们经常用到的是title(指定显示的文字提示内容)和mask(提供一个透明层阻止对页面其它内容进行操作)以及icon图标类型。
本地存储
同步存储
小程序也提供了用于在本地存一些临时性的数据,比如包括登录状态的token。其包含4个注意api:
wx.setStorageSync
在本地存入一个数据wx.getStorageSync
读取本地的一个数据wx.removeStorageSync
删除本地存储的一个数据wx.clearStorageSync
清空本地存储的数据
// pages/storage/index.js
Page({
// 存入本地数据
setStorage() {
wx.setStorageSync('name', '小明')
// 可以直接存入对象,无需 JSON.stringify 处理
wx.setStorageSync('user', { name: '小明', age: 18 })
},
})
要注意的是:在小程序中 Sync
结尾的 API 指的是同步方式执行,同步方式执行的 API 在使用时简洁比较好,但缺点是同步会阻塞程序执行,执行效率上相较异步版本要差一些。
异步存储
异步存储对应的API包括:
wx.setStorage
在本地存入一个数据wx.getStorage
读取本地的一个数据wx.removeStorage
删除本地存储的一个数据wx.clearStorage
清空本地存储的数据
Page({
setStorage() {
wx.setStorage({
key: 'name',
data: '小明'
})
// 等同于
wx.setStorage('name', '小明')
}
})
npm支持
-
默认构建
小程序不能直接使用在 npm 下载的模块包,必须经过小程序开发者工具进行构建后才可以使用。- 打开小程序终端执行npm init -y 然后安装对应的模块:npm install miniprogram-computed
- 但是下载的模块无法直接导入到小程序中,需要构建npm
- 构建 npm 的结果会创建一个新的目录
miniprogram_npm
把构建后的 npm 模块放到了这个目录之下,此时在小程序中便可以成功导入 npm 的模块包了。
自定义构建:
- 默认情况下项目目录的最外层是小程序的根目录,通过
project.config.json
可以指定小程序的根目录,这样做的好处是能够优化目录结构,更好的管理项目的代码
{
"setting": {
...
"packNpmManually": true, // 启用 npm 构建手动配置
"packNpmRelationList": [
{
"packageJsonPath": "./package.json", //packNpmRelationList` 手动构建 npm 配置详情
"miniprogramNpmDistDir": "./miniprogram" //miniprogramRoot` 自定义小程序的根目录
}
],
...
},
"libVersion": "2.19.4",
"miniprogramRoot": "miniprogram/",
"appid": "wx3eb80995b7e84924",
"projectname": "mpdemo",
}
自定义组件
- 小程序中自定义组件的结构和页面是一致的,包含4部分:
- .wxml:组件的布局结构
- .js组件的处理逻辑
- .json 组件的配置文件
- .wxss 组件的布局样式
创建组件
我们将组件放在独立的目录components当中,这个目录需要我们手动创建。
注册组件
- 页面注册 页面注册是在使用组件的页面配置中通过usigComponents进行注册,只能在当前页面中使用注册的组件,如下代码所示:
{
"usingComponents": {
"authorization": "/components/authorization/index"
}
}
//双标签
<authorization></authorization>
// 单标签
<authorization />
- 全局注册 全局注册是在app.json中通过usingComponents对自定义组件进行注册,注册的组件可以在任意的页面中使用:
{
"pages": [...],
"window": {...},
"usingComponents": {
"authorization": "/components/authorization/index"
},
"sitemapLocation": "sitemap.json"
}
组件进阶
数据与属性
组件的属性由两部分构成
- data:组件本身内部定义的数据
- properties:通过组件属性从外部传入组件内部的数据
// components/authorization/index
Component({
// 初始组件内部数据
data: {
message: '组件中初始的数据'
},
// 定义组件的属性,接收外部传入的数据
properties: {
isLogin: {
type: Boolean,
value: true,
},
tips: String,
},
})
生命周期和方法
小程序的生命周期函数,通过lifetimes来定义,主要的生命周期函数有:
- created:组件实例刚刚被创建,created生命周期被触发,但是该生命周期无法调用setData,这个方法一般为组件添加一些自定义属性字段。
- attached:在组件完全初始化完毕、进入页面节点树后,
attached
生命周期被触发。
// components/authorization/index.js
Component({
data: {
message: '组件中初始的数据',
},
properties: {
isLogin: {
type: Boolean,
value: true,
},
tips: String,
},
// 组件生命周期
lifetimes: {
created() {
// this.setData({message: '此时不能调用 setData'})
// 为当前组件实例自定义属性 author
this.author = 'itcast';
},
attached() {
// 没有什么限制了,可以执行任意的操作
this.setData({ message: '组件进入到页面节点了...' });
},
},
});
组件模板
小程序的组件模板其实就是插槽功能,通过在组件内部定义插槽位置,在组件内定义slot插槽,其实插槽就是个占位符号。下面对插槽做个使用说明:
// 子组件
<view class="container">
<slot wx:if="{{isLogin}}"></slot>
<text wx:else>{{message}}</text>
</view>
// 父组件里面进行占位
<authorization is-login="{{true}}" tips="用户未登录">
<view>这里的内容会填充到 slot 插槽的位置</view>
<view>这里内容也会填充到 slot 插槽的位置</view>
</authorization>
默认情况下,小程序在一个组件中只支持一个插槽,我们可以通过在组件中Component中的options属性里面的multipleSlots设置为true。在使用多插槽的时候我们可以通过name为插槽。
Vant组件在小程序里面的使用
// 安装
npm i @vant/weapp -S -production
// 确保package.json文件的存在
// 在app.json中全局引入Vant组件,在使用Vant组件的时候需要将小程序全局配置中的style去掉;
{
"usingComponents": {
"van-button": "@vant/weapp/button/index"
}
}
//