目录
10.2 swiper组件内嵌<swiper-item>组件 11
15.1 common.js模块化规范【node.js】 15
20.1 但是出于安全性的考虑,小程序官方对数据接口请求有如下限制: 19
24.1 全局开启下拉刷新【在app.json中配置下拉刷新】 21
24.2 局部开启下拉刷新【目标页面.json中配置下拉刷新】 21
1 微信小程序简介
1.1 概念
是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用
1.2 同类产品
1.2.1 原生App
应用:手机淘宝、手机京东、微信、抖音
特点:直接运行在移动设备上
优点:运行流畅,功能强大,用户体验好
缺点:兼容平台【安卓、IOS、鸿蒙】、开发成本高、兼容机型【华为、小米、苹果…】
1.2.2 WebApp
国内缺少比较大众的应用
特点:使用web技术【html、css、js】开发应用,运行在移动设备的浏览器中
优点:无需考虑兼容性【一套代码,可以在多个平台中运行】、开发成本底
缺点:运行速度一般、功能欠缺、用户体验差
1.2.3 微信小程序
应用:跳一跳、粤省事、深i您、乘车码…
优点:无需考虑兼容性、运行流畅,功能强大、学习成本低
特点:微信小程序是运行在微信这个原生应用里面的、轻便,应用方便、无需下载,用完即走
应用场景:适合生活服务类线下商铺以及非刚需【使用时间短】低频应用的转换、大型网络游戏【从体积和性能角度不适合做】、竞品类的应用不适合做【淘宝、天猫】、应用粘性比较高的产品不适合做【抖音、快手】
2 微信小程序开发文档
2.1 寻找开发文档
步骤 | 过程 |
1 | 百度搜索:微信公众平台【https://mp.weixin.qq.com/】 |
2 | 进入微信公众平台的官网,找到小程序 |
3 | 点击小程序文档就ok |
3 微信小程序使用流程
步骤 | 过程 |
1 | 注册【在微信公众平台注册小程序账号,完成注册后同步进行信息完善和开发】 |
2 | 小程序信息完善 |
3 | 开发小程序 |
4 | 提交审核和发布 |
4 项目结构
4.1 项目文件描述
文件或文件名 | 描述 |
pages | 用来存放所有小程序的页面 |
app.js | 小程序项目的入口文件 |
app.json | 小程序项目的全局配置文件 |
app.wxss | 小程序项目的全局样式文件 |
project.config.json | 小程序项目的配置文件 |
project.private.config.json | 小程序项目的私有配置文件【优先级高于project.config.json】 |
sitmap.json | 用来配置小程序及其页面是否允许被微信索引 |
5 安装开发者工具及设置
5.1 安装开发者工具
小程序的开发不再使用vscode,小程序有自己专业的开发工具:微信开发者工具
微信开发者工具的下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/stable.html
步骤 | 过程 |
1 | 下载微信开发者工具,得到安装包 |
2 | 双击安装包,直接使用默认安装路径 |
5.2 代理设置
步骤 | 过程 |
1 | 设置->代理->选中“不使用任何代理,勾选后直连网络” |
微信开发者工具使用时,一定要联网,否则看不到运行效果
5 wxml
Wxml是小程序框架设计的一套标签语言,用来构建小程序页面的结构,类似于网页开发中的HTML
5.1 标签
组件名称 | 描述 |
view | 相当于html中的div块级元素 |
hidden属性控制view组件的显示与隐藏 | |
text | 相当于html中的span标签 |
rich-text | <rich-text nodes=”<h3>我是h3标题</h3>”></rich-text> |
可以解析nodes属性值里面的标签结构 | |
image | 图片组件 |
<image src=”图片路径/图片名.后缀名” mode=”图片裁剪、缩放模式” | |
mode属性控制图片的显示方式 | |
navigator | 传送门组件,跳转到其他页面 |
不携带参数的页面跳转 | |
<navigator url=”跳转路径/index”>提示内容</navigator> | |
携带参数的页面跳转 | |
<navigator url=”跳转路径/index?参数名1=值1&参数名2=值2”>提示内容</navigator> | |
目标页面上js获取传参 | |
Page({ …, onl oad(options){ //参数保存的就是传递的所有参数对象。 } }) | |
button | 按钮组件 |
input | 小程序中input输入框默认没有边框 |
swiper | 轮播图组件 |
Swiper有自己默认的高度为150px,如果内容超出高度,那么将来只会显示150【给swiper添加类名,重新设置高度】 | |
整个轮播图的属性 | |
指示点【轮播图的小圆点】:indicator-dots【属性值为布尔值true或false】 自动轮播:autoplay【属性值为布尔值true或false】 轮播间隙:interval【属性值为毫秒数】 动画时长:duration【属性值为毫秒数】 衔接动画:circular【属性值为布尔值true或false】 | |
<swiper class=”类名” autoplay=”true”> <swiper-item> 第一张轮播内容 </swiper-item> <swiper-item> 第二张轮播内容 </swiper-item> … </swiper> | |
6 图片组件的mode属性
属性值 | 描述 |
scaleToFill | |
aspectFit | 在图片不失帧【保持横纵比缩放】的情况下,使图片刚好可以放入盒子中。 |
aspectFill | |
widthFix | |
heightFix |
7 事件绑定
事件是渲染层到逻辑层的通讯方式。通过事件可以将用户在渲染层产生的行为,反馈到逻辑层中,进行业务处理
7.1 事件绑定类型
属性值为事件名,会直接在对应的js文件中去找对应的事件处理函数去执行
事件类型 | 描述 |
bindtap | 【bind:tap】手指点触摸后触发对应事件【类似于原生的click事件】 |
bindinput | 【bind:input】文本框中输入事件 |
bindchange | 【bind:change】状态改变时触发 |
7.2 事件处理函数
语法 | 描述 |
<组件名 bindtap=”事件处理函数名” > </组件名 | 事件处理函数在目标页面.js文件中可以看到 |
8 访问data中的属性数据
在html结构中访问data中的属性数据
{{属性名}}
在js中访问data中的属性数据
this.data.属性名
在js中修改data中的属性值
this.setData({
data中的属性名:this.data.data中的属性名操作
})
拓展
在小程序中data中的数据如果直接修改,数据不具备响应式【数据发生改变,页面不具备响应式】【响应式:数据发生改变,页面也会跟着改变】所以修改data中的数据需要使用上面的方式
9 input组件
在小程序中input组件没有边框
9.1 input组件绑定输入事件
使用model:value属性绑定数据可以实现input和data中的数据同步
语法 | 描述 |
<input bindinput=”目标事件名” model:value=”{{绑定值}}” /> | 当我们在输入框中输入内容时就会触发目标事件名的执行 model属性用于双向绑定数据【使用了model双向绑定一定需要有bindinput事件类型,否则会报黄。】 |
9.2 事件处理函数【目标页面.js文件中】
语法 | 描述 |
目标事件名(e){
} | e.detail.value可以获取输入框中的内容 如果使用了双向数据绑定,this.data.value也可以获取到输入框的内容 |
10 轮播图组件
10.1 <swiper>组件
swiper组件有自己默认的高度为150,如果内容超出高度,那么只会显示150,所以如果需要swiper高度高一点,需要用选择器直接选中swiper组件进行设置样式。
indicator-dots属性值为布尔值,用于控制是否显示小圆点
autoplay属性值为布尔值,用于控制是否开启自动轮播
interval属性值为数字,表示多少毫秒展示下一张【轮播间隔】
duration属性值为数字,表示内容平滑切换用多少时间【动画时长】
circular属性值为布尔值,表示是否衔接动画【播放完最后一张后,继续向后连续播放第一张】
10.2 swiper组件内嵌<swiper-item>组件
表示轮播图的每一项数据
10.3 完整写法
语法 | 描述 |
<swiper indicator-dots="true" autoplay="true" interval="1000" duration="1000" circular="true" > <swiper-item> //内嵌结构 </swiper-item> <swiper-item> //内嵌结构 </swiper-item> </swiper> | swiper组件内嵌多少个swiper-item组件,轮播图就有多少项 indicator-dots属性值为布尔值,用于控制是否显示小圆点 autoplay属性值为布尔值,用于控制是否开启自动轮播 interval属性值为数字,表示多少毫秒展示下一张【轮播间隔】 duration属性值为数字,表示内容平滑切换用多少时间【动画时长】 circular属性值为布尔值,表示是否衔接动画【播放完最后一张后,继续向后连续播放第一张】 |
11 navigator组件【声明式导航】
从一个navigator所在组件的页面跳转到另一个指定路径的页面
navigator只能在普通页面进行跳转,不用跳转到tabBar页面。
跳转到tabBar页面需要使用wx.switchTab({url:’url’})的方式跳转到指定路径的tabBar页面。
11.1 直接跳转
语法 | 描述 |
<navigator url=”/页面路径”> 超链接内容 </navigator> | 点击超链接内容,就会跳转到url指定的页面路径上 url指定的页面路径可用/开头;也可以相对路径 |
11.2 携带参数的页面跳转
语法 | 描述 |
<navigator url = ”/页面路径 ?key1=value1&key2=value2” > 超链接内容 </navigator> | 点击超链接内容,就会跳转到url指定的页面路径上 url指定的页面路径可用/开头,也可相对路径 ?后面的是页面参数 页面参数会被生命周期函数onLoad的第一个参数以对象的形式接收 |
12 编程式导航
通过触发事件通过代码的方式跳转到另一个页面
保留当前页面,跳转到应用内的某个页面。但是不能跳到tabbar页面
编程式导航语法:wx.navigator
12.1 组件结构【目标页面.wxml】
语法 | 描述 |
<button bindtap=”目标事件名”>按钮内容</button> | 点击目标页面按钮内容,触发目标页面.js文件中的目标事件 |
12.2 编程式导航语法
保留当前页面【点击控制台的“AppData”->左边的Pages下面可以看到页面的跳转情况,最下面的是第一个页面,最上面的是当前页面,左边pages下面最多10个页面,超出后编程式导航无效;点击左边对应的页面可以在右边看到对应页面的数据情况。】
使用wx.navigateBack()可以回到上一个页面【和上方的返回小箭头效果一样】
12.2.1 没有参数传递的编程式导航
语法 | 描述 |
wx.navigateTo({ url: '/页面路径', }) | 在目标事件中写这个代码就可以跳转到指定页面。 |
12.2.2 携带参数的编程式导航
语法 | 描述 |
wx.navigateTo({ url: '/页面路径?参数名1=值1 & 参数名2=值2' }) | 在目标事件中写这个代码就可以跳转到指定页面。 |
12.2.3 页面栈
小程序在跳转过程中,会将跳转的页面也保存起来,保存的位置叫做页面栈
使用wx.navigateTo()方法实现页面的跳转,会将页面保存到页面栈中,页面栈最多保留10个页面,超过10个页面后,wx.navigateTo方法就会失效
13 事件方法传参【同一个页面间传递参数】
13.1 wxml组件上使用data-参数名设置参数
语法 | 描述 |
<组件名 data-自定义参数名=值 bindtap=”目标事件名” >内容</组件名> | 传递的参数会通过事件对象的方式保存在事件的第一个参数中【事件对象】 目标事件中可以使用第一个参数.currentTarget.dataset.自定参数名来获取到绑定事件的组件上传递的参数。 目标事件中可以使用第一个参数.target.dataset.自定参数名来获取到被点击的元素上传递的参数。 |
14 Wxss与css的区别
Wxss具有css大部分特性,同时,WXSS还对CSS进行了扩充以及修改,以适应微信小程序的开发
14.1 wxss扩展的特性
rpx尺寸单位【屏幕视口宽度为750rpx,用rpx为单位,默认会将屏幕宽度分为750份】
@import“路径/wxss样式文件名.wxss”【这是引入已写好的wxss样式文件语法】
14.2 wxss-rpx实现原理
鉴于不同设备屏幕的大小不同,未来实现屏幕的自动适配 |
rpx把所有设备的屏幕在宽度上等分为750份 |
当小程序运行在不同设备上时,会自动将rpx的样式单位换算成对应的像素单位来渲染,从而实现屏幕适配 |
与rem的作用是一样的【rem需要我们自己去配置,rpx小程序以及配置完成】 |
14.3 表现
在较小的设备上:1rpx所代表的宽度较小
在较大的设备上:1rpx所代表的宽度较大
15 模块化
小程序也支持模块化;小程序即支持commonjs规范又支持es6规范
15.1 common.js模块化规范【node.js】
模块的导出【暴露】语法 | 模块的导入语法 |
module.exports={} | const 变量名=require(‘文件路径’) |
15.2 es6模块化规范
15.2.1 es6模块化默认导入导出
默认暴露的值和导入时接收的变量名保存的一样
模块的默认导出语法 | 模块对应的默认导入语法 |
export defaut 暴露的值 | import 自定义导入接收名 from “暴露变量的文件路径/暴露变量的文件名.js” |
15.2.2 es6模块化按需导入导出
模块的按需导出语法 | 模块对应的默认导入语法 |
export var 变量名=值 | import {按需导入的变量名} from “暴露变量的文件路径/暴露变量的文件名.js” |
16 查看自己的小程序
微信登陆微信公众平台->点击头像处的昵称->在基本信息里面可以看到小程序码 |
17 项目发布
一个邮箱只能发布一个小程序,一个appid只能发布一个小程序,一个微信可以管理多个小程序
17.1 微信开发者工具
登陆微信开发者工具并打开项目 -> 点击工具栏右侧的“详情” -> 修改发布的AppId ->点击工具栏右侧的上传 |
17.2 微信公众平台
微信扫码登陆微信公众平台【选择上传项目的appid号】 -> 管理 ->”版本管理” -> 多出来的“开发版本”点击“提交审核” -> 审核通过后在“审核版本”点击“提交发布” |
17.3 访问小程序
可以微信直接在小程序中搜索小程序名称,也可以通过下面这种方式
微信扫码登陆微信公众平台【选择上传项目的appid号】-> 点击右侧“头像“-> 点击“昵称”-> 基本设置的“小程序码及线下物料下载” 右侧下载 |
18 全局配置说明:
小程序根目录下的app.json文件是小程序的 全局配置文件
18.1 app.json文件中常见的配置项有:
配置项 | 描述 |
pages | 记录当前小程序所有页面的存放路径【pages里面存放的路径可能是tabbar配置中list数组对象的单个数组项对象的pagePath属性对应的属性值】 |
window | 全局设置小程序窗口的外观 |
tabBar | 设置小程序底部的tabBar效果 |
tabBar是移动端应用的视觉效果,用于实现多页面的快速切换 | |
tabBar中只能配置最少2个,最多5个tab页 | |
语法如下【配置项必须是tabBar,属性必须是list数组,数组中保存着所有tabBar路径信息和文字信息】【path相关的路径不能以/开头】 | |
"tabBar": { "list": [ { "pagePath": "pages/tabbar01demo/index", "text": "首页" }, { "pagePath": "pages/tabbar02demo/index", "text": "我的" } ] } | |
style | 是否启用新版本的组件样式 |
18.2 pages配置
记录当前小程序所有页面的存放路径【属性值为字符串数组,每一项对应一个页面的路径,数组第一项为小程序启动首页】
18.3 window配置
对象中保存着所有属性配置项
全局配置小程序的窗口外观
如果在页面需要配置,直接复制过去就好,不用加window属性。
属性 | 描述 |
navigationBarBackgroundColor | 导航栏背景颜色【只能是十六进制】 |
navigationBarTitleText | 导航栏标题文字内容 |
navigationBarTextStyle | 导航栏标题颜色,仅支持black/white |
enablePullDownRefresh | 是否开启全局的下拉刷新【开启后可以将页面内容盒子往下移动,且出现的间隙会出现加载图标动画,而且会有窗口背景色】 |
backgroundColor | 下拉刷新时多出的窗口的背景色 |
backgroundTextStyle | 导航栏下拉刷新小圆点颜色【只能是black黑色或white白色】 |
18.4 tabBar配置【app.json】
tabBar是移动端应用的视觉效果,用于实现多页面的快速切换【tabBar页面也是页面所以会在pages节点中配置】
tabBar中只能配置最少2个,最多5个tab页
tabBar对象中的list属性用于设置文字内容和图片选中与未选中内容
tabBar对象中的color属性用于配置文字的默认颜色
tabBar对象中的selectedColor属性用于配置被选中的tabBar页面文字颜色
从一个页面跳转到tabBar页面,需要给跳转前的页面添加跳转的事件,事件中使用wx.switchTab({url:”url”})的方式实现【路径需要使用/开头】。
语法 | 描述 |
"tabBar": { "list": [{ "pagePath": "pages/home/index", "text": "第一个", "iconPath": "/图片路径1", "selectedIconPath": "/图片路径2" }, { "pagePath": "pages/tabbar/index", "text": "第二个", "iconPath": "/图片路径1", "selectedIconPath": "/图片路径2" }, …] } | tabBar页面的导航按钮,根据list数组的数组项顺序从左到右排列,所以需要根据tabBar手动配置 tabBar配置页面路径不能以/开头 iconPatc属性配置tabBar没被选中时显示的图片 selectedIconPatc属性配置tabBar被选中时显示的图片 tabBar只能被选中一个 |
19 导航
19.1 普通页面声明式导航
语法 | 描述 |
<navigator url=’/普通页面路径’></navigator> | 可以使用../【相对路径】的方式一层一层的找对应普通页面路径,也可以使用/开头写页面路径【绝对路径】 |
19.2 普通页面编程式导航
语法 | 描述 |
wx.navigatorTo({url:’普通页面路径/普通页面文件名’}) | 可以使用../【相对路径】的方式一层一层的找对应普通页面路径,也可以使用/开头写页面路径【绝对路径】 |
19.3 tabBar页面声明式导航
navigator组件跳转页面需要使用open-type属性指定跳转的是tabBar页面【没有指定默认跳转的是普通页面,如果是tabBar页面没指定就不能完成跳转】
语法 | 描述 |
<navigator open-type=”switchTab” url=’/普通页面路径’></navigator> | 可以使用../【相对路径】的方式一层一层的找对应普通页面路径,也可以使用/开头写页面路径【绝对路径】 |
19.4 tabBar页面编程式导航
跳转到tabBar页面,并关闭其他所有非tabBar页面【会将页面栈中的其他页面清除掉】
语法 | 描述 |
wx.switchTab({ url:’tabBar页面路径’ }) | 可以使用../【相对路径】的方式一层一层的找对应普通页面路径,也可以使用/开头写页面路径【绝对路径】 |
20 网络请求
小程序也可以发送网络请求
小程序中不存在跨域情况【跨域是浏览器的行为,小程序发送请求的行为是微信客户端发送的】
小程序中的网络请求不能称呼为ajax请求【ajax请求时通过XMLHttpRequest对象发送的,而小程序中是通过微信客户端发送的】
如果接口的请求仅仅只是临时发起,可以在微信开发者工具->”详情”->勾选“不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”【这样即使没有在微信公众平台配置的合法域名也可以直接访问,但只有在开发者工具中可以访问,真正上线的域名都需要在微信公众平台的合法域名中配置的。】
20.1 但是出于安全性的考虑,小程序官方对数据接口请求有如下限制:
只能请求HTTPS类型的接口
必须将接口的域名添加到信任列表中【配置合法域名】
20.2 配置合法域名
只有配置了合法域名,以后才可以往request后面的服务器中发请求。
登陆微信公众平台->”开发”->”开发管理”->”开发设置”->”服务器域名”->点击”修改”->微信扫码身份验证->request合法域名输入框粘贴域名 |
21 get请求
语法 | 描述 |
wx.request({ url:’服务器地址’, method:”GET”, data:{ name:’lwt’, age: 24 }, success:(res)=>{} }) | data属性后面的是传递的参数 success函数的第一个参数是请求成功返回的数据。 |
22 post请求
语法 | 描述 |
wx.request({ url:’服务器地址’, method:”POST”, data:{ name:’lwt’, age: 24 }, success:(res)=>{} }) | data属性后面的是传递的参数 success函数的第一个参数是请求成功返回的数据。 |
23 API-加载提示框
23.1 显示加载提示框
语法 | 描述 |
wx.showLoading({ title:’提示文本’ }) | 显示加载提示框,一般用于发送请求前 |
23.2 隐藏加载提示框
语法 | 描述 |
wx.hideLoading({ noConflict: true, success: (res) => { }, fail: (res) => { }, complete: (res) => { }, }) | 隐藏加载提示框,一般用于发送请求完成的complete函数中。 wx.request({ …, complete:() =>{this.hideLoading()} }) |
24 下拉刷新
下拉刷新是移动端得专有名称,指的是通过屏幕上得下拉滑动操作,从而重新加载页面数据得行为
小程序中下拉刷新分为两种:全局开启下拉刷新【所有页面都会有下拉刷新效果】、局部开启下拉刷新【只有设置得页面有下拉刷新效果】【一般局部下拉刷新用得多】
24.1 全局开启下拉刷新【在app.json中配置下拉刷新】
每个页面都可以下拉刷新,下拉刷新哪个页面就会调用哪个页面的onPullDownRefresh生命周期钩子函数。【没有配置下拉刷新就不会有该钩子】
语法 | 描述 |
"window": { …, "enablePullDownRefresh": true } | 开启每个页面的下拉刷新 |
24.2 局部开启下拉刷新【目标页面.json中配置下拉刷新】
目标页面可以下拉刷新,下拉刷新目标页面就会调用目标页面.js文件中的onPullDownRefresh生命周期钩子函数。【没有配置下拉刷新就不会有该钩子】
语法 | 描述 |
{ …, "enablePullDownRefresh": true } | 这是目标页面.json的代码,这个文件只能设置window配置,所以不用加window属性,也不能加window属性 |
25 上拉触底
上拉触底需要满足两个条件【内容高度必须超过视口高度,开启上拉】
当上拉到离底部还剩下的距离小于下拉触底设置的值时,就会触发上拉触底的钩子onReachBottom【每次经过那个临界点都会触发】
该事件常用于上拉触底时发送请求,将每次触底请求的数据扩充到原先的数据中,从而实现原先的数据越来越多。当然,数据不可能无限增多,所以会有一个节流条件,通常是原先数组的长度作为结束条件。
25.1 全局开启上拉触底的距离
语法 | 描述 |
"window": { ..., "onReachBottomDistance": 数字 } | 当屏幕重触顶开始向下拉,当下拉到离底部还剩下的距离小于下拉触底设置的值时,就会触发下拉触底的钩子onReachBottom【每次经过那个临界点都会触发】 |
25.2 局部页面设置下拉触底的
语法 | 描述 |
{ "onReachBottomDistance": 数字 } | 当下拉到离底部的距离还剩设定数字时,就会触发下拉触底的生命周期钩子onReachBottom |
25.3 扩充服务器数据源
语法 | 描述 |
目标方法名(){ wx.request({ url:’请求地址’, data:参数键值对象, success:res=>{ this.setData({ 数据源变量:[ …this.data.数据源变量, …res.data.data ] }) } }) } | 微信小程序中扩充原先数据的方法 |
26 生命周期
生命周期【life Cycle】是指一个对象从创建->运行->销毁的整个过程,强调的是一个时间段。
页面的生命周期范围较小,应用程序的生命周期范围较大,应用生命周期包括了页面生命周期
26.1 小程序的生命周期
小程序的启动,表示生命周期的开始
小程序的关闭,表示生命周期的结束
从启动到关闭这期间,就是小程序的生命周期
26.2 小程序生命周期分类
应用生命周期【小程序从启动->运行->销毁的过程】
页面生命周期【小程序的页面启动->渲染->销毁的过程】
组件生命周期
26.3 小程序应用生命周期
点击小程序右上角的圆圈不会关闭小程序,只是把小程序隐藏到了后台。
应用生命周期函数 | 描述 |
onLaunch | 当小程序初始化完成时,会触发onLaunch【全局只触发一次】【可以用于统计小程序的访问量】 |
onShow | 当小程序启动,或从后台进入前台显示,会触发onShow |
onHide | 当小程序从前台进入后台,会触发onHide |
26.4 小程序页面生命周期
应用生命周期函数 | 描述 |
onLoad | 监听页面加载,一个页面只调用一次【第一次打开目标页面才会执行】【常用于初始化数据】 |
onShow | 监听页面显示【每次显示都会执行】 |
onReady | 监听页面初次渲染完成【一个页面只调用一次】 |
onHide | 监听页面隐藏【当前页面使用navigatorTo跳转会触发当前页面的onHide钩子;点击当前页面右上角的圆圈会进入小程序后台,同样会触发onHide钩子。】 |
onunload | 监听页面卸载 |
onPullDownRefresh | 当前页面设置了下拉刷新配置,就会触发该钩子的执行 |
onReachBottom | 当前页面设置了上拉触底配置,当上拉到触底还剩设定值时就会触发该钩子的执行。【每次上拉到触底还剩设定的数字px像素时都会触发该钩子的执行】 |
27 tabBar页面跳转生命周期执行
应用生命周期onLoad->应用生命周期onShow->tabBar1页面onLoad->tabBar1页面onShow->tabBar1页面onHide->tabBar2页面onLoad->tabBar2页面onShow
28 普通页面navigateTo跳转生命周期的执行
应用生命周期onLoad->应用生命周期onShow->普通1页面onLoad->普通1页面onShow->普通1页面onHide【卸载当前页面】->新页面的onLoad->新页面的onShow
29 普通页面redirectTo跳转生命周期执行
应用生命周期onLoad->应用生命周期onShow->普通1页面onLoad->普通1页面onShow->普通1页面onUnload【卸载当前页面】->新页面的onLoad->新页面的onShow
30 wxs
Wxs时小程序独有的一套脚本语言。结合WXML,可以构建出页面的结构,即帮助页面创建结构
WXML中无法调用在页面中的.js中定义的函数,但是WXML,可以调用WXS中定义的函数,因此,小程序中WXS的典型应用场景是:“过滤器”
Wxs的语法与JS的语法几乎是一样的
31 wxs与js对比
虽然wxs的语法类似于js,但是wxs和js是完全不同的两种语言
区别 | 描述 |
wxs有自己的数据类型 | Number,string,boolean,object,function,array,date,regexp |
wxs不支持类似于ES6及以上的语法形式 | 不支持:let、const、解构赋值、展开运算符、箭头函数、对象属性简写… |
支持var定义变量、普通function函数等类似于ES5的语法 | |
wxs遵循CommonJs规范 | 模块导出:module.exports={} |
模块导入:var xx=require() |
32 内联wxs的使用
在wxml中使用wxs标签内部写js逻辑代码的方式叫内联wxs
在wxml组件中写如下代码
语法 | 描述 |
<wxs module=”自定义模块名”> function 自定义方法名(v){ return v.split(“”).reverse().join() } //暴露方法 module.exports={ 自定义使用方法名:自定义方法名 } </wxs> | 自定义方法的参数v表示数据源 常用于过滤操作。 Wxml中使用该方法使用: {{自定义模块名.自定义使用方法名(数据源变量)}} |
33 外联wxs的使用
33.1 外部创建写wxs的代码文件
function 自定义方法名(v){ return v.split(“”).reverse().join() } //暴露方法 module.exports={ 自定义使用方法名:自定义方法名 } |
33.2 wxml中引入外部创建的wxs文件
<wxs module=”自定义模块名” src=”/wxs/index.wxs”></wxs> |
33.3 wxml中使用模块
{{自定义模块名.自定义方法名(数据源变量)}} |
34 动态设置导航栏标题
语法 | 描述 |
onLoad(options){ let name = options.参数名 wx.setNavigationBarTitle({ title:name }) } | onLoad生命周期函数的第一个参数是参数对象,里面存放着我们传递过来的参数列表 |
35 关闭下拉刷新面板
通常在请求完成的complete函数中关闭下拉面板
语法 | 描述 |
wx.stopPullDownRefresh() | 通常下拉时会重新发请求获取数据 获取到数据我们就需要立刻关闭下拉刷新的面板,给用户更好的体验 |
35.1 项目语法
wx.request({ url:’请求地址’, method:’GET’, data:{数据参数列表}, success:(res)=>{ this.setData({ 数据源变量:res的表达式新值 }) }, complete:()=>{ …, wx.stopPullDownRefresh() } }) |
36 小程序自定义组件分类
以前小程序只有模块,且模块的引入并不能实现js代码的共享,现在小程序支持自定义组件的使用。
36.1 全局组件
全局注册之后,可以在任意页面中使用
36.2 局部组件
页面注册之后,只能在当前页面中使用
37 组件的创建
创建出来的组件要注册完毕之后才能确定它是全局组件还是局部组件
步骤 | 过程 |
1 | 在项目根目录中,创建一个文件夹:components |
2 | 在components中创建一个文件夹:text |
3 | 在test中,右键,新建component |
4 | 文件夹中会自动生成四个文件,后缀名分别为.js、.json、.wxml和.wxss |
37 组件的注册
37.1 注册全局组件【app.json的】
语法 | 描述 |
{ "usingComponents": { "自定义使用组件名": "/组件路径" }, … } | 以后在目标页面需要使用该组件时,只需要在目标页面.wxml对应的位置写<自定义使用组件名></自定义组件名> |
37.2 注册局部组件【目标页面.json】
语法 | 描述 |
{ "usingComponents": { "自定义使用组件名": "/组件路径" }, … } | 以后在目标页面需要使用该组件时,只需要在目标页面.wxml对应的位置写<自定义使用组件名></自定义组件名> |
38 组件与页面的区别
38.1 相同点
都是由四个文件组成:.js、.json、.wxml、.wxss
38.2 不同点
组件中的.json文件需要声明: "component": true
组件中的.js文件中调用的是Component()函数【应用调用的是App()函数;页面调用的是Pages()函数;组件调用的是Component()函数】
组件的事件处理函数需要定义在methods对象里面【和vue语法一样】【但是获取data中的数据还是需要使用this.data.数据变量名的方式】
在项目的根目录中
39 自定义组件- 样式 – 样式隔离
39.1 样式隔离
默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的UI结构
如果小程序页面中使用了两个组件A和B【A组件不会影响页面的样式;A组件不会影响B的样式;页面上的样式也不会影响A】
39.2 意义
防止外界的样式影响组件内部的样式
防止组件的样式破坏外界的样式
39.3 特点
app.wxss中定义的样式是不会影响到组件中的样式
只有class选择器会有样式隔离效果。Id选择器、标签选择器 不受样式隔离的影响【会导致样式污染】
建议:在组件和引用组件的页面中,建议使用class选择器,不要使用id、属性、标签选择器
40 自定义组件 – 样式隔离选项
默认情况下,自定义组件的样式隔离特征能够防止组件内外样式相互干扰的问题。但有时候,我们希望在外界能够控制组件内部的样式。此时可以通过stylesolation【组件.js文件中】修改组件的样式隔离选项
语法 | 描述 |
Component({ options:{ styleIsolation: "apply-shared" }, … }) | 在自定义组件的js文件中添加options配置的styleIsolation: 'apply-shared' 就可以让外界页面的样式能够控制组件内部的样式,但自定义组件中指定的样式不会影响页面。 styleIsolation: 'isolated';默认值。表示启用样式隔离,在自定义组件内外,使用class指定的样式将不会相互影响 styleIsolation: 'isolated';表示页面wxss样式将影响到自定义组件,自定义组件wxss中指定的样式也会影响页面和其他设置了apply-shared或shared的自定义组件。 |
41 自定义组件属性
41.1 自定义组件.js文件中
data:用来定义组件中的数据
methods:用来定义组件中的方法【页面中的方法直接定义在与data同级,组件中的方法要定义到methods中】
如果要接收外界传入的数据,需要使用与vue中不同的属性来接收【properties:用来接收父组件传入的数据】
41.2 页面中使用自定义组件
语法 | 描述 |
<自定义组件名 目标暴露属性:暴露值></自定义组件名 | 使用自定义组件的时候将页面的数据通过属性暴露给自定义组件内部使用 |
41.3 自定义组件.js中配置暴露属性
Component({ /** * 组件的属性列表 */ properties: { 目标暴露属性:{ type:String, //数据的类型 value:’默认值’ } }, |
41.4 自定义组件.wxml中使用暴露属性
语法 | 描述 |
{{目标暴露属性}} | 和自己的普通属性一样使用 |
42 properties与data的区别
properties传入的数据可以在组件内部的方法中修改,且修改的值只会在组件内部生效,页面上除了使用组件内部的值变了,其他地方的值并不会改变
在组件中的方法中this.data===this.properties【所以修改外部传入的数据,就相当于修改组件内部的数据,但并不会影响使用该组件的页面的其他地方的数据变化。】
42.1 开发习惯
data更倾向于存储组件的私有数据;properties更倾向于存储外界传递到组件中的数据
43 自定义组件-侦听器
数据监听,用于监听和响应任何属性和数据字段的变化,从而执行特定的操作。它类似于vue中的watch侦听器
侦听器只能用在组件中,不能用在页面中
43.1 自定义组件.js
侦听基本数据类型属性:
语法 | 描述 |
observers:{ “侦听属性1,侦听属性2,…”:function(newValue1,newValue2,…){
} } | observers配置属性和data属性同级 当自定义组件中侦听属性发生改变时会触发侦听属性后面的函数,函数的参数对应侦听属性改变后的新值 |
侦听对象属性:
语法 | 描述 |
observers:{ “侦听对象.属性1,侦听对象.属性2,…”:function(newValue1,newValue2,…){
} } | observers配置属性和data属性同级 当自定义组件中侦听对象的属性发生改变时会触发侦听属性后面的函数,函数的参数对应侦听属性改变后的新值 |
侦听对象中的所有属性:
语法 | 描述 |
observers:{ "侦听对象.**":function(newValue1,newValue2,…){ this.setData({ 重新渲染变量:表达式 }) } } | observers配置属性和data属性同级 当自定义组件中侦听对象的属性发生改变时会触发侦听属性后面的函数,函数的参数对应侦听属性改变后的新值 |
44 自定义组件-纯数据字段
纯数据字段指的是那些不用于界面渲染的data字段【纯数据字段无法在页面上显示,但可以在逻辑层修改。】。
44.1 应用场景
有些情况下,某些data中的字段既不会展示在界面上,也不会传递给其他组件,仅仅在当前组件内部使用。带有这种特性的data字段适合设置为纯数据字段
44.2 好处
纯数据字段有助于提升页面的性能。
44.3 语法【自定义组件.js】
语法 | 描述 |
Component({ options: { pureDataPattern: /^_/ }, … }) | 设置了这个属性后,以后以_开头的变量都是纯数据变量,纯数据变量只能在逻辑中使用,在页面上无法渲染 |
45 自定义组件-组件生命周期
小程序中的组件也有自己的生命周期
生命走起写在lifetimes节点里面
生命周期钩子 | 描述 |
created | 在组件实例刚刚被创建时执行【相当于vue中的beforeCreated钩子】 |
此时还不能调用setData | |
通过在这个生命周期函数中,只应该用于给组件的this添加一些自定义的属性字段 | |
attached | 在组件实例进入页面节点树时执行【相当于vue中的created钩子】 |
此时this.data已经被初始化完毕 | |
这个生命周期很有用,绝大多数初始化的工作可以在这个时机进行 | |
ready | 在组件在视图层布局完成后执行 |
moved | 在组件实例被移动到节点树另一个位置时执行 |
detached | 在组件实例被页面节点树移除时执行【redirectTo跳转到另一个页面触发,相当于vue中的destroyed钩子】 |
退出一个页面时,会触发页面内每个自定义组件的detached生命周期函数 | |
此时适合做一些清理性质的工作 | |
error | 每当组件方法抛出错误时执行 |
45.1 写法【自定义组件.js】
Component({ …, lifetimes: { attached() { }, detached() {
} } }) |
46 组件所在的页面的生命周期函数【自定义组件.js】
自定义组件的生命周期函数写在pageLifetimes节点对象内部
46.1 自定义组件所在的页面的生命周期函数
生命周期函数 | 描述 |
show | 组件所在的页面被展示时执行 |
hide | 组件所在的页面被隐藏时执行 |
resize | 组件所在的页面尺寸变化时执行 |
46.2 语法【自定义组件.js】
Component({ ..., pageLifetimes: { show() { console.log('页面显示,导致组件显示') }, hide() { console.log('页面隐藏,导致组件隐藏') }, resize() { console.log('页面尺寸发生改变,导致组件尺寸改变') } } }) |
47 自定义组件-插槽-单个插槽
插槽:接收外界传入到组件中的wxml结构
在小程序中,默认每个自定义组件中,只允许使用一个<slot>进行占位,这种个数上的限制叫做单个插槽
47.1 自定义组件单个插槽语法
和vue中插槽一样,只是插槽里面不能嵌套默认内容
<slot></slot> |
47.2 使用自定义组件语法
<自定义组件> 插槽处填充html内容 </自定义组件> |
48 自定义组件 – 多个插槽
在小程序中,如果要定义多个插槽,需要使用multipleSlots,就可以使用多个插槽了
48.1 自定义组件.js
Component({ options: { multipleSlots: true }, ... }) |
48.2 自定义组件.wxml
<slot name=”插槽名”></slot> |
48.3 页面.wxml
<自定义使用组件> <view slot=”对应插槽名”>填充内容</view> </自定义使用组件> |
49 自定义组件-页面与组件的通信-基本概念
小程序中组件与页面之间也可以进行通信
49.1 通信方式
属性绑定【父传子:页面向组件传参 => 用于页面向组件指定属性设置数据,仅能设置JSON兼容的数据】
事件绑定【子传父:组件向页面传参 => 用于组件向页面传递数据,可以传递任意数据】
获取组件实例【this.$refs.xxx】【父组件还可以通过this.selectCompoent()获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法了】
50 自定义组件 – 页面与组件的通信 – 属性绑定
属性绑定用于实现页面向组件传参
只能传递普通类型的数据【不能传方法】
无法将方法传递给子组件
50.1 页面.js
页面中准备数据
Page({ data: { 数据变量:普通类型值 }, ... } |
50.2 页面.wxml
页面中使用自定义组件并暴露数据给自定义组件
<自定义使用组件 暴露属性=”{{页面数据变量}}”></自定义使用组件 |
50.3 自定义组件.js
在自定义组件中接收对应的数据类型和数据属性
Component({ properties: { 接收暴露属性 :{ type: String } }, ... }) |
51 自定义组件 – 页面与组件的通信 – 事件绑定
子组件向页面传递参数
51.1 自定义组件.js
自定义组件内部调用的方法中写入下面代码
第一个参数为事件名,第二个参数为传递给页面的数据
这个事件类型会自动触发页面对应的方法。
this.triggerEvent(“自定义事件名”,this.data.自定义组件内部属性) |
51.2 页面.wxml
页面方法名的第一个参数就是事件对象【e】,e.detail就是传递过来的数据
<自定义组件 bind自定义事件名=”页面方法名”></自定义组件> |
52 页面与组件通信-获取组件实例
52.1 页面.wxml
页面需要使用自定义组件的地方使用并使用选择器设定组件名
例子:<com01 id=”com01”></com01>
<自定义组件 选择器类型=”自定义组件选择器名”></自定义组件> |
52.2 页面.js
在页面的方法中可以通过如下代码获取组件实例
let 自定义获取到的组件对象名=this.selectComponent(‘选择器类型选择器名’) |
获取自定义组件中的方法:自定义获取到的组件对象名.自定义组件中方法名
53 自定义组件 – behaviors【类似于vue中的混入mixins】
behaviors是小程序组件中,用于实现组件间代码共享的特性。类似于vue中的mixins
每个behaviors可以包含一组属性、数据、生命周期函数和方法。【组件引用它时,它的属性、数据、和方法会被合并到组件中】
每个组件中可以引用多个behaviors,behaviors也可以引用其它behaviors
53.1 根目录新建behaviors文件夹
项目名/behaviors
53.2 behaviors新建共享代码文件
项目名/behaviors/共享属性方法文件名.js
在共享代码文件中写我们组件共用的方法和属性
export default Behavior({ data:{ 共享属性:值 }, methods:{ 共享方法(){} } }) |
53.3 组件.js
导入共享的behaviors并配置
import 自定义behaviors接收对象 from “共享属性和方法的文件相对路径” Component({ behaviors:[自定义behaviors接收对象] }) |
53.4 组件.js
在组件的方法中直接使用根目录下的behaviors下的共享属性和方法
Component({ …, methods:{ 方法名(){ this.共享方法名() } } }) |