小程序学习笔记
1.初识小程序
1.1 相关链接
- 学习链接:https://www.bilibili.com/video/BV1834y1676P?spm_id_from=333.337.search-card.all.click&vd_source=52ed5c88dcd416be49cb6d916d2ad164
- 微信公众平台:https://mp.weixin.qq.com/
- 微信开发者工具:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
- 开发者文档:https://developers.weixin.qq.com/miniprogram/dev/framework/
1.2 目录介绍
在 app.json 中 pages 选项中添加页面,例如
pages/list/list,微信开发者工具就会自动帮我们在 pages 目录下创建页面
默认目录结构如下:
├── app.js -> 小程序项目的入口文件
├── app.json -> 小程序项目的全局配置文件
├── app.wxss -> 小程序项目的全局样式文件
├── pages -> 用来存放所有小程序页面
│ ├── index
│ │ ├── index.js -> 页面的脚本文件,存放页面的数据、事件处理函数等
│ │ ├── index.json -> 页面的配置文件,配置窗口的外观、表现等(可覆盖app.json中的全局配置)
│ │ ├── index.wxml -> 页面的模板结构文件
│ │ └── index.wxss -> 页面的样式表文件
│ └── logs
│ ├── logs.js
│ ├── logs.json
│ ├── logs.wxml
│ └── logs.wxss
├── project.config.json -> 记录小程序开发工具所做的个性化配置
├── project.private.config.json
├── sitemap.json -> 用来配置小程序及其页面是否允许被微信索引
└── utils -> 用来存放工具性质的模块(例如:格式化时间的自定义模块)
└── util.jsapp.json:
- pages: 记录小程序所有页面的路径(第一项为首页)
- window: 定义小程序所有页面的背景色、文字颜色等
- style: 定义小程序组件所使用的样式版本
- sitemapLocation: 指明 sitemap.json 的位置
1.3 小程序开发与网页开发的区别
小程序中不能使用 BOM、DOM
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>
- 提供了类似于 Vue 中的模板语法
- 数据绑定
- 列表渲染
- 条件渲染
WXSS 样式
WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,类似于网页开发中的 CSS
WXSS 和 CSS 的区别:
- 新增了 rpx 尺寸单位
- CSS 中需要手动进行像素单位换算,例如 rem
- WXSS 在底层支持新的尺寸单位 rpx,在不同大小的屏幕上小程序会自动进行换算
- 提供了全局样式和局部样式
- 项目根目录中的 app.wxss 会作用于所有小程序页面
- 局部页面的.wxss 样式仅对当前页面生效
- WXSS 仅支持部分 CSS 选择器
- .class 和#id
- element
- 并集选择器、后代选择器
- ::after 和::before 等伪类选择器
小程序中的 JS 文件
小程序中的 JS 文件分为三大类,分别是:
- app.js:是整个小程序项目的入口文件,通过调用
App()函数来启动整个小程序 - 页面的.js 文件:通过调用
Page()函数来创建并运行页面 - 普通的.js 文件:是普通的功能模块文件,用来封装公共的函数或属性,供页面使用
1.4 小程序的宿主环境
宿主环境(host environment)指的是程序运行所必须依赖的环境
手机微信是小程序的宿主环境,小程序可以借助宿主环境提供的能力,完成普通网页无法完成的功能,例如微信扫码、微信支付、微信登录等
小程序宿主环境包含的内容:通信模型、运行机制、组件、API
小程序中的通信模型分为两部分:
- 渲染层和逻辑层之间的通信(由微信客户端进行转发)
- 逻辑层和第三方服务器之间的通信(由客户端进行转发)

小程序的启动过程:
- 把小程序的代码包下载到本地
- 解析 app.json 全局配置文件
- 执行 app.js 小程序入口文件,调用
App()创建小程序实例 - 渲染小程序首页
- 小程序启动完成
小程序页面渲染的过程:
- 加载解析页面的.json 配置文件
- 加载页面的.wxml 模板和.wxss 样式
- 执行页面的.js 文件,调用 Page()创建页面实例
- 页面渲染完成
2.小程序基础
2.1 常用的视图容器类组件
- view:普通视图区域,类似于 div
- scroll-view:可滚动的视图区域
- swiper 和 swiper-item:轮播图容器组件和轮播图 item 组件
2.2 常用的基础内容组件
- text:文本组件,类似于 span(selectable 属性->支持长按选中效果)
- rich-text:富文本组件,支持吧 HTML 字符串渲染为 WXML 结构
2.3 其它常用组件
- button:按钮组件,比 HTML 中 button 更丰富,通过
open-type属性可以调用微信提供的各种功能(客服、转发、获取用户授权,获取客户信息等) - image:图片组件,默认宽度约为 300px、高度约为 200px
- navigator:页面导航组件,类似于 a
2.4 小程序中的 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 回调函数接收数据
- 特点:类似于 jQuery 中的
2.5 小程序管理
基于微信小程序开发者工具、网页可对小程序开发进行版本控制、成员管理、发布版本、查看访问数据等,具体的操作详见视频:https://www.bilibili.com/video/BV1834y1676P/?p=13
2.6 数据绑定
在小程序页面对应的 js 文件下 data 选项中定义数据,在 wxml 文件中通过 Mustache 语法进行使用
2.7 事件绑定
事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务处理

常用事件:
- tap:手指触摸后马上离开,类似于 HTML 中的 click 事件
- input:文本框的输入事件
- change:状态改变时触发
绑定方式:
bindtap或bind:tap
当事件回调触发的时候,会收到一个事件对象,它的详细属性如下:
- type==string==:事件类型
- timeStamp==number==:页面打开到触发事件所经过的毫秒数
- target==object==:触发事件组件的一些属性值集合
- currentTarget==object==:当前组件的一些属性值集合
- detail==object==:额外的信息
- touches==array==:触摸事件,当前停留在屏幕中的触摸点信息数组
- changedTouches==array==:触摸事件,当前变化的触摸点信息数组
2.8 事件与数据同步
在事件处理函数更改 data 中的数据方式如下:
this.setData({
count: this.data.count + 1
});事件传参通过data-*的形式传递数据,通过event.target.dataset.*的形式获取数据,示例如下:
// 传递数据
<button type="primary" bind:tap="add2" data-num="{{2}}">
加二
</button>;
// 获取数据
this.setData({
count: this.data.count + e.target.dataset.num
});获取 input 输入信息,通过 input 事件:
<input bind:input="inputHandler"/>
inputHandler(e) {
console.log(e.detail.value);
}"v-model"式的数据同步需要我们手动去实现:
<input value="{{msg}}" bind:input="inputHandler" />;
Page({
data: {
msg: 'Hello'
},
inputHandler(e) {
this.setData({
msg: e.detail.value
});
}
});