微信小程序学习笔记

学习时间:2022年8月17日

学习来源:黑马程序员

1 快速开始

1.1 简介

小程序与普通网页开发的区别

  • 运行环境不同

    • 网页运行在浏览器环境中
    • 小程序运行在微信环境中
  • API 不同

    • 由于运行环境的不同,所以小程序中 ,无法调用 DOM 和 BOM 的 API。 但是,小程序中可以调用微信环境提供的各种 API
  • 开发模式不同
    • 网页的开发模式:浏览器 + 代码编辑器
    • 小程序有自己的一套标准开发模式:
      • 申请小程序开发账号
      • 安装小程序开发者工具
      • 创建和配置小程序项目

1.2 第一个小程序

1.2.1 注册和安装

官网:https://mp.weixin.qq.com/

相关注册和工具安装的过程略

1.2.2 创建小程序项目

  • 填写项目信息

image-20220705180319309

  • 在模拟器上查看项目效果

image-20220705200211661

  • 在真机上预览项目效果

image-20220705200222841

  • 主界面的 5 个组成部分

image-20220705200237035

1.3 代码构成

1.3.1 项目结构

image-20220705200306613

  • pages 用来存放所有小程序的页面
  • utils 用来存放工具性质的模块(例如:格式化时间的自定义模块 )
  • app.js 小程序项目的入口文件
  • app.json 小程序项目的全局配置文件
  • app.wxss 小程序项目的全局样式文件
  • project.config.json 项目的配置文件
  • sitemap.json 用来配置小程序及其页面是否允许被微信索引

小程序官方建议把所有小程序的页面,都存放在 pages 目录中,以单独的文件夹存在,如图所示:

image-20220705200413283

其中,每个页面由 4 个基本文件组成,它们分别是:

  • .js 文件(页面的脚本文件,存放页面的数据、事件处理函数等)
  • .json 文件(当前页面的配置文件,配置窗口的外观、表现等)
  • .wxml 文件(页面的模板结构文件)
  • .wxss 文件(当前页面的样式表文件)

1.3.2 JSON配置文件

JSON 是一种数据格式,在实际开发中,JSON 总是以配置文件的形式出现。小程序项目中也不例外:通过不同的 .json 配置文件,可以对小程序项目进行不同级别的配置。

小程序项目中有 4 种 json 配置文件,分别是:

  • 项目根目录中的 app.json 配置文件
  • 项目根目录中的 project.config.json 配置文件
  • 项目根目录中的 sitemap.json 配置文件
  • 每个页面文件夹中的 .json 配置文件
① app.json

app.json 是当前小程序的全局配置,包括了小程序的所有页面路径、窗口外观、界面表现、底部 tab 等。 Demo 项目里边的 app.json 配置内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"pages":[
"pages/index/index",
"pages/logs/logs"
],
"window":{
"backgroundTextStyle":"light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "Weixin",
"navigationBarTextStyle":"black"
},
"style": "v2",
"sitemapLocation": "sitemap.json"
}
  • pages:用来记录当前小程序所有页面的路径
  • window:全局定义小程序所有页面的背景色、文字颜色等
  • style:全局定义小程序组件所使用的样式版本
  • sitemapLocation:用来指明 sitemap.json 的位置
② project.config.json

project.config.json 是项目配置文件,用来记录我们对小程序开发工具所做的个性化配置,例如:

  • setting 中保存了编译相关的配置
  • projectname 中保存的是项目名称
  • appid 中保存的是小程序的账号 ID
③ sitemap.json

微信现已开放小程序内搜索,效果类似于 PC 网页的 SEO。sitemap.json 文件用来配置小程序页面是否允许 微信索引。

当开发者允许微信索引时,微信会通过爬虫的形式,为小程序的页面内容建立索引。当用户的搜索关键字和 页面的索引匹配成功的时候,小程序的页面将可能展示在搜索结果中。

1
2
3
4
5
6
7
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}

注意:sitemap 的索引提示是默认开启的,如需要关闭 sitemap 的索引提示,可在小程序项目配置文件 project.config.json 的 setting 中配置字段 checkSiteMap 为 false

④ 页面的.json

小程序中的每一个页面,可以使用 .json 文件来对本页面的窗口外观进行配置,页面中的配置项会覆盖 app.json 的 window 中相同的配置项。例如:

  • app.json中
1
2
3
4
5
{
"window":{
"navigationBarBackgroundColor": "#fff"
}
}
  • index.json
1
2
3
{
"navigationBarBackgroundColor": "#00B26A"
}

image-20220705202225645

1.3.3 页面相关

① 新增页面

只需要在 app.json -> pages 中新增页面的存放路径,小程序开发者工具即可帮我们自动创建对应的页面文件。

1
2
3
4
5
6
7
8
{
"pages":[
"pages/index/index",
"pages/logs/logs",
// 新增页面
"pages/list/list"
]
}

image-20220819181714800

② 修改项目首页

只需要调整 app.json -> pages 数组中页面路径的前后顺序,即可修改项目的首页。小程序会把排在第一位的页面,当作项目首页进行渲染。

1.3.4 WXML 模板

WXML(WeiXin Markup Language)是小程序框架设计的一套标签语言,用来构建小程序页面的结构,其作用类似于网页开发中的 HTML

WXML 和 HTML 的区别

  • 标签名称不同
    • HTML (div, span, img, a)
    • WXML(view, text, image, navigator)
  • 属性节点不同
    • <a href="#">超链接</a>
    • <navigator url="/pages/home/home"></navigator>
  • WXML提供了类似于 Vue 中的模板语法
    • 数据绑定
    • 列表渲染
    • 条件渲染

1.3.5 WXSS 样式

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,类似于网页开发中的 CSS。

WXSS 和 CSS 的区别

  • 新增了 rpx 尺寸单位

    • CSS 中需要手动进行像素单位换算,例如 rem
    • WXSS 在底层支持新的尺寸单位 rpx,在不同大小的屏幕上小程序会自动进行换算
  • 提供了全局的样式和局部样式

    • 项目根目录中的 app.wxss 会作用于所有小程序页面
    • 局部页面的 .wxss 样式仅对当前页面生效
  • WXSS 仅支持部分 CSS 选择器

    • .class#id
    • element
    • 并集选择器、后代选择器
    • ::after::before 等伪类选择器

1.3.6 JS逻辑交互

一个项目仅仅提供界面展示是不够的,在小程序中,我们通过 .js 文件来处理用户的操作。例如:响应用户的点击、获取用户的位置等等。

小程序中的 JS 文件分为三大类,分别是:

  • app.js:是整个小程序项目的入口文件,通过调用 App() 函数来启动整个小程序
  • 页面的 .js 文件:是页面的入口文件,通过调用 Page() 函数来创建并运行页面
  • 普通的 .js 文件 :是普通的功能模块文件,用来封装公共的函数或属性供页面使用

image-20220819182702765

1.4 宿主环境

1.4.1 简介

宿主环境(host environment)指的是程序运行所必须的依赖环境

例如: Android 系统和 iOS 系统是两个不同的宿主环境。安卓版的微信 App 是不能在 iOS 环境下运行的,所以, Android 是安卓软件的宿主环境,脱离了宿主环境的软件是没有任何意义的!

image-20220819182715836

手机微信是小程序的宿主环境,如图所示:

image-20220819182839746

小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能,例如: 微信扫码、微信支付、微信登录、地理定位、etc…

  • 小程序宿主环境包含的内容
    • 通信模型
    • 运行机制
    • 组件
    • API

1.4.2 通信模型

小程序中通信的主体是渲染层和逻辑层,其中:

  • WXML 模板和 WXSS 样式工作在渲染层
  • JS 脚本工作在逻辑层

image-20220819183049585

  • 小程序中的通信模型分为两部分:
    • 渲染层和逻辑层之间的通信 :由微信客户端进行转发
    • 逻辑层和第三方服务器之间的通信 :由微信客户端进行转发

image-20220819183123697

1.4.3 运行机制

小程序启动的过程

  • 把小程序的代码包下载到本地
  • 解析 app.json 全局配置文件
  • 执行 app.js 小程序入口文件,调用 App() 创建小程序实例
  • 渲染小程序首页
  • 小程序启动完成

页面渲染的过程

  • 加载解析页面的 .json 配置文件
  • 加载页面的 .wxml 模板和 .wxss 样式
  • 执行页面的 .js 文件,调用 Page() 创建页面实例
  • 页面渲染完成

1.4.4 组件

① 分类

小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了 9 大类,分别是:

  • 视图容器
  • 基础内容
  • 表单组件
  • 导航组件
  • 媒体组件
  • map 地图组件
  • canvas 画布组件
  • 开放能力
  • 无障碍访问
② 常用的视图容器类组件

view组件

  • 普通视图区域
  • 类似于 HTML 中的 div,是一个块级元素
  • 常用来实现页面的布局效果

代码示例:

/list/list.wxml

1
2
3
4
5
6
<!--pages/list/list.wxml-->
<view class="container1">
<view>A</view>
<view>B</view>
<view>C</view>
</view>

/list/list.wxss

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* pages/list/list.wxss */
.container1 view {
width: 100px;
height: 100px;
text-align: center;
line-height: 100px;
}

.container1 view:nth-child(1) {
background-color: lightgreen;
}

.container1 view:nth-child(2) {
background-color: lightskyblue;
}

.container1 view:nth-child(3) {
background-color: lightpink;
}

.container1 {
display: flex;
justify-content: space-around;
}

效果:

image-20220819184324860

scroll-view组件

  • 可滚动的视图区域
  • 常用来实现滚动列表效果

代码示例:

1
2
3
4
5
6
<!--pages/list/list.wxml-->
<scroll-view class="container1" scroll-y>
<view>A</view>
<view>B</view>
<view>C</view>
</scroll-view>

swiperswiper-item组件

  • 轮播图容器组件 和 轮播图 item 组件

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 轮播图 -->
<swiper class="swiper-container">
<!-- 第一个轮播图 -->
<swiper-item>
<view class="item">A</view>
</swiper-item>
<!-- 第二个轮播图 -->
<swiper-item>
<view class="item">B</view>
</swiper-item>
<!-- 第三个轮播图 -->
<swiper-item>
<view class="item">C</view>
</swiper-item>
</swiper>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.swiper-container {
height: 150px;
}

.item {
height: 100%;
line-height: 150px;
text-align: center;
}

swiper-item:nth-child(1) .item {
background-color: lightgreen;
}

swiper-item:nth-child(2) .item {
background-color: lightskyblue;
}

swiper-item:nth-child(3) .item {
background-color: lightpink;
}

常用属性:

image-20220819200352222

例如:

1
2
3
<!-- 轮播图 -->
<swiper class="swiper-container" indicator-dots="true">
</swiper>

image-20220819202017586

③ 常用的基础内容组件

text组件

  • 文本组件,类似于 HTML 中的 span 标签,是一个行内元素

代码示例:通过 text 组件的 selectable 属性,实现长按选中文本内容的效果:

1
2
3
4
<view>
手机号支持长按选中效果:
<text selectable>12345678</text>
</view>

rich-text组件

  • 富文本组件,支持把 HTML 字符串渲染为 WXML 结构

代码示例:通过 rich-text 组件的 nodes 属性节点,把 HTML 字符串渲染为对应的 UI 结构。

1
2
3
<view>
<rich-text nodes="<h1 style='color: red;'>标题</h1>"></rich-text>
</view>

image-20220819202444891

④ 其他常用组件

button组件

  • 功能比 HTML 中的 button 按钮丰富
  • 通过 open-type 属性可以调用微信提供的各种功能(客服、转发、获取用户授权、获取用户信息等 )

代码示例:

1
2
3
4
5
6
7
8
9
<view>---------通过type属性指定按钮颜色---------</view>
<button>默认按钮</button>
<button type="primary">主色调按钮</button>
<button type="warn">警告按钮</button>

<view>---------通过size=mini属性指定按钮小尺寸---------</view>
<button size="mini">默认按钮</button>
<button type="primary" size="mini">主色调按钮</button>
<button type="warn" size="mini">警告按钮</button>

image-20220819203215227

image组件

  • image 组件默认宽度约 300px、高度约 240px

代码示例:

1
<image src="/images/1.jpg"></image>

image 组件的 mode 属性用来指定图片的裁剪和缩放模式,常用的 mode 属性值如下:

image-20220819203427184

1.4.5 API

小程序中的 API 是由宿主环境提供的,通过这些丰富的小程序 API,开发者可以方便的调用微信提供的能力 ,例如:获取用户信息、本地存储、支付功能等。

分类

小程序官方把 API 分为了如下 3 大类:

  • 事件监听 API

    • 特点:以 on 开头,用来监听某些事件的触发
    • 举例:wx.onWindowResize(function callback) 监听窗口尺寸变化的事件
  • 同步 API

    • 特点1:以 Sync 结尾的 API 都是同步 API
    • 特点2:同步 API 的执行结果,可以通过函数返回值直接获取,如果执行出错会抛出异常
    • 举例:wx.setStorageSync('key', 'value') 向本地存储中写入内容
  • 异步 API

    • 特点:类似于 jQuery 中的 $.ajax(options) 函数,需要通过 success、fail、complete 接收调用的结果
    • 举例:wx.request() 发起网络数据请求,通过 success 回调函数接收数据

1.5 协同工作与发布

2 模板与配置

2.1 WXML模板语法

2.1.1 数据绑定

数据绑定的基本原则:在 data 中定义数据;在 WXML 中使用数据。

在页面对应的 .js 文件中,把数据定义到 data 对象中即可:

1
2
3
4
5
6
7
// index.js
Page({
// 页面的初始数据
data: {
info: "Hello World"
}
})

再把data中的数据绑定到页面中渲染,使用 Mustache 语法(双大括号)将变量包起来即可:

1
<view>{{ info }}</view>

Mustache 语法的应用场景

  • 绑定内容
1
<view>{{ info }}</view>
  • 绑定属性
1
2
3
4
5
6
Page({
// 页面的初始数据
data: {
imgSrc: "/images/1.jpg"
}
})
1
<image src="{{ imgSrc }}"></image>
  • 运算(三元运算、算术运算等)

2.1.2 事件绑定

① 简介

事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务的处理。

image-20220819205731800

常用的事件

image-20220819205800558

事件对象的属性列表

当事件回调触发的时候,会收到一个事件对象 event(一般简写为e),它的详细属性如下表所示:

image-20220819205942863

其中:

target 是触发该事件的源头组件,而 currentTarget 则是当前事件所绑定的组件。举例如下:

image-20220819210131256

点击内部的按钮时,点击事件以冒泡的方式向外扩散,也会触发外层 view 的 tap 事件处理函数。

此时,对于外层的 view 来说:

  • e.target 指向的是触发事件的源头组件,因此,e.target 是内部的按钮组件
  • e.currentTarget 指向的是当前正在触发事件的那个组件,因此,e.currentTarget 是当前的 view 组件
② bindtap语法格式

在小程序中,不存在 HTML 中的 onclick 鼠标点击事件,而是通过 tap 事件来响应用户的触摸行为。

代码示例

1
2
<!-- 事件绑定 -->
<button type="primary" bindtap="btnTapHandler">按钮</button>
1
2
3
4
5
6
Page({
// 定义按钮的事件处理函数
btnTapHandler(e) {
console.log(e);
}
})

打印结果:

image-20220819210730569

③ 数据赋值

通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值。接收一个对象,对象的属性以k:v要修改的data的属性:新的值)为其形式。

代码示例

1
2
<view>{{ count }}</view>
<button type="primary" bindtap="countChange">+1</button>
1
2
3
4
5
6
7
8
9
10
11
12
Page({
// 页面的初始数据
data: {
count: 0
},
countChange() {
this.setData({
// 注意中间有个data
count: this.data.count + 1
})
}
})
④ 事件传参

小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理函数传递参数。例如,下面的代码将不能正常工作:

1
<button bidntap="btnHandler(123)">事件传参</button>

因为小程序会把 bindtap 的属性值,统一当作事件名称来处理,相当于要调用一个名称为 btnHandler(123)的事件处理函数。

可以为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字。

在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值。

代码示例

1
<button type="primary" bindtap="countChange2" data-info="{{ 2 }}">+2</button>
1
2
3
4
5
6
countChange2(e) {
this.setData({
// e.target.dataset是固定写法
count: this.data.count + e.target.dataset.info
})
}
⑤ bindinput语法格式

在小程序中,通过 input 事件来响应文本框的输入事件。

1
<input bindinput="inputHandler"></input>
1
2
3
4
// input输入框的事件处理函数
inputHandler(e) {
console.log(e.detail.value);
}

打印结果:

image-20220820172503024

实现文本框与data之间的数据同步

  • 定义数据
1
2
3
data: {
msg: "Hello World"
},
  • 页面和样式
1
<input value="{{ msg }}" bindinput="inputHandler"></input>
1
2
3
4
5
6
input {
border: 1px solid #eee;
margin: 5px;
padding: 5px;
border-radius: 3px;
}
  • 事件处理函数
1
2
3
4
5
6
// input输入框的事件处理函数
inputHandler(e) {
this.setData({
msg: e.detail.value
});
}

结果:

image-20220820173133478

2.1.3 条件渲染

① wx:if

在小程序中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块,也可以用 wx:elifwx:else 来添加 else 判断。

代码示例

1
2
3
4
<!-- 条件渲染 -->
<view wx:if="{{ type === 1 }}"></view>
<view wx:elif="{{ type === 2 }}"></view>
<view wx:else>保密</view>
1
2
3
data: {
type: 1
},

如果要一次性控制多个组件的展示与隐藏,可以使用一个 <block></block>标签将多个组件包装起来,并在<block> 标签上使用 wx:if 控制属性

注意: <block> 并不是一个组件,它只是一个包裹性质的容器,不会在页面中做任何渲染。

代码示例

1
2
3
4
<block wx:if="{{ type === 1 }}">
<view>view1</view>
<view>view2</view>
</block>
② hidden

在小程序中,直接使用 hidden="{{ condition }}" 也能控制元素的显示与隐藏。

1
<view hidden="{{ condition }}"></view>

wx:if 与 hidden 的对比

  • 运行方式不同

    • wx:if 以动态创建和移除元素的方式,控制元素的展示与隐藏,相当于v-if
    • hidden 以切换样式的方式(display: none/block;),控制元素的显示与隐藏,相当于v-show
  • 使用建议

    • 频繁切换时,建议使用 hidden
    • 控制条件复杂时,建议使用 wx:if 搭配 wx:elif、wx:else 进行展示与隐藏的切换

2.1.4 列表渲染

通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构。默认情况下,当前循环项的索引用 index 表示;当前循环项用 item 表示。

1
2
3
<view wx:for="{{ arr1 }}">
索引是:{{ index }}, item项是:{{ item项是 }}
</view>

wx:key类似于 Vue 列表渲染中的 :key,小程序在实现列表渲染时,也建议为渲染出来的列表项指定唯一的 key 值,从而提高渲染的效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
userList: [{
id: 1,
name: "小张"
},
{
id: 2,
name: "小红"
},
{
id: 3,
name: "小军"
}
]
1
2
3
<view wx:for="{{ userList }}" wx:key="id">
{{ item.name }}
</view>

2.2 WXSS模板样式

2.2.1 简介

WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS。

WXSS 具有 CSS 大部分特性,同时,WXSS 还对 CSS 进行了扩充以及修改,以适应微信小程序的开发。与 CSS 相比,WXSS 扩展的特性有:

  • rpx 尺寸单位
  • @import 样式导入

image-20220820175956891

2.2.2 rpx尺寸

rpx(responsive pixel)是微信小程序独有的,用来解决屏适配的尺寸单位。