赞
踩
目录
小程序与网页开发的区别
运行环境不同
API不同
开发模式不同
pages用来存放所有小程序的页面
utils用来存放工具性质的模块(例如:格式化时间的自定义模块)
app.js 小程序项目的入口文件
app.json小程序项目的全局配置文件
app.wxss小程序项目的全局样式文件
project.config.json项目的配置文件
sitemap.json 用来配置小程序及其页面是否允许被微信索引
其中,每个页面由4个基本文件组成,它们分别是:
.js 文件(页面的脚本文件,存放页面的数据、事件处理函数等)
.json文件(当前页面的配置文件,配置窗口的外观、表现等)
.wxml文件((页面的模板结构文件)
.wxss文件(当前页面的样式表文件)
json是一种数据格式,总是以配置文件的形式出现,通过不同的.json配置文件,可以将小程序项目进行不同级别的配置
json是一种轻量级的数据交换格式,JSON文件都是被包裹在一个大括号中 {},通过key-value的方式来表达数据,JSON的Key必须包裹在一个双引号中.
不能使用注释
JSON的值只能是以下几种数据格式:
数字,包含浮点数和整数
字符串,需要包裹在双引号中
Bool值,true 或者 false
数组,需要包裹在方括号中 []
对象,需要包裹在大括号中 {}
Null
pages:用来记录当前小程序所有页面的路径
window:全局定义小程序所有页面的背景色、文字颜色等
style:全局定义小程序组件所使用的样式版本
sitemapLocation:用来指明sitemap.json的位置
项目根目录中的project.config.json配置文件
setting 中保存了编译相关的配置
projectname中保存的是项目名称
appid中保存的是小程序的账号ID
用来配置小程序页面是否允许微信索引,allow表示允许,不想允许时只需要设置为disallow
关闭警告"checkSiteMap": false,
对本页面的窗口外观进行配置,页面中的配置项会覆盖app.json(全局)的window中相同的配置项,页面配置的优先级更高
在app.json下找到pages,添加新增页面的存放路径,小程序开发工具会自动生成文件夹
调整app.json下的pages数组在页面路径的前后顺序,即可修改项目的首页。小程序会默认将排在第一位的页面当作首页进行渲染
和HTML 一样都是标签语言,用来构建小程序页面的结构
标签名称不同
属性节点不同
提供了类似vue中的模板语法
是一套样式语言,严格区分大小写。
没有被定义的变量的或者是被设置为 undefined 的变量不会被同步到 wxml 中,
属性值也可以动态的去改变,在插值语法外加上双引号,即可实现动态的数据绑定。
<text data-test="{{test}}"> hello world</text>
新增了rpx尺寸单位,不需要手动进行换算(rem需要),在不同的屏幕大小上会自动进行换算。
提供了全局样式和局部样式
仅支持部分CSS样式选择器
.class和#id
element
并集选择器、后代选择器
::after和::before等伪类选择器
.js文件分为三大类
app.js
是整个函数的入口文件,通过调用App()函数来启动整个小程序
页面的.js文件
是页面文件的入口,通过调用page()函数来创建并运行页面
普通js文件
用来封装公共的函数或属性供页面使用
宿主环境是指程序运行所必须的依赖环境,Android和iOS是两个不同的宿主环境,软件脱离宿主环境无法运行。手机微信是小程序的宿主环境
小程序正在通信的主体是渲染层和逻辑层,二者之间进行交互
渲染层:包含WXML和WXSS
逻辑层:包含JS脚本
渲染层逻辑层之间的通信是由微信客户端进行转发的,而逻辑层和第三方服务器之间的通信是由微信客户端进行转发。
把小程序的代码包下载到本地
解析app.json全局配置文件
执行app.js 小程序入口文件,调用App()
创建小程序实例渲染小程序首页
小程序启动完成
加载解析页面的.json配置文件
加载页面的.wxml模板和.wxSS样式
执行页面的.js文件,调用Page()创建页面实例
页面渲染完成
由宿主环境提供,分为九大类
视图容器
view:普通视图区域,类似于div是块级元素,常用来实现页面的布局效果
scroll-view:可以滚动视图区域,常用于实现列表滚动效果
swiper和swiper-item:轮播图容器组件和轮播图item组件
swiper组件的常用属性
基础内容
text:文本组件,类似span,是一个行内元素
selectable属性,实现长按文本选中的效果
rich-text:富文本正在组建,能解析标签
表单组件
导航组件
媒体组件
map地图组件
canvas画布组件
开放能力
无障碍访问
其他常用按钮
Button组件
通过type指定按钮的颜色
通过size="mini"指定按钮的大小
添加plain属性设置镂空按钮
image组件
可以通过mode属性指定图片的裁剪和缩放模式
事件监听API
以on开头,用来监听某些事件的触发
同步API
以Sync结尾的API都是同步API
同步API的执行结果,可以通过函数返回值直接获取,如果执行错误会抛出异常
异步API
类似于jQuery 中的$.ajax(options)函数,需要通过success、fail、complete接收调用的结果
在data中定义一个对象属性,在wxml中通过插值语法来绑定data对象属性,用双引号将属性值包裹起来,即可实现动态的绑定
<text data-test="{{test}}"> hello world</text>
事件是渲染层到逻辑层的通讯方式
tap:触摸后离开,类似点击事件
input:文本框输入事件
change:状态改变时触发
转存失败重新上传取消转存失败重新上传取消
当事件回调触发时,会收到一个事件对象event
target触发的是源头组件,而currentTarget触发的是当前事件所绑定的事件
例如:在view组件中嵌套了一个button组件,点击button时,会以冒泡的形式向外扩散,也会触发外层view的tap事件处理函数。
对于外层的view来说
e.target指向触发事件的源头组件,即内部的button正在组件
e.currentTarget指向的是当前事件所绑定的事件,即为外层的view组件
语法
<view wx:if="{{condition}}"> True </view>
还可以搭配else-if和else使用
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
将条件放在一个标签上,则标签内包含的多个内容可以一起进行判断
<view hidden="true"></view>
也可以控制元素的显示与隐藏
wx:if :以动态创建和移除元素控制元素的展示于隐藏(类似Vue中的v-if)
hidden:切换样式{dispaly:none/block;},控制元素的显示与隐藏(类似Vue中的v-show)
当切换频繁时,建议使用hidden
当切换条件复杂时性能消耗比较大,建议使用wx:if搭配else else-if来进行展示与隐藏的切换。
V-if:依赖于DOM节点的控制,在切换模块时,Vue有一个局部编译/卸载的过程,v-if时真实的条件渲染,但同时也是"懒惰的",当初始渲染条件时为假,则什么都不做,当条件为真时,才会渲染模块。
v-show:依赖于DOM节点的display属性,当v-show传入的值为true时,对应的display的值为block,当传入的值为false时,display的值为none。不管初始条件是什么,元素总是会被选入,但只是基于CSS进行切换。
使用wx:for绑定一个数组,默认数组下标名为index 变量名默认为item
- <view wx:for="{{array}}"> {{index}}: {{item.message}} </view>
-
- Page({
-
- data: {
-
- array: [{ message: 'foo', },
-
- { message: 'bar' }]
-
- }
-
- })
指定唯一的key值,提高渲染效率
类似于CSS
rpx尺寸单位
能解决屏幕适配,rpx把屏幕宽度等分为750份,总和为750rpx。在不同大小的屏幕上一个rpx所代表的大小不同。
rpx与px之间的换算:750rpx = 当前屏幕大小的px
@import导入
import + “需要导入样式的相对路径”;
全局样式中的样式会应用于所有页面
当全局样式和局部样式冲突时,根据就近原则局部样式会覆盖掉全局样式
只有当局部样式的权重大于或等于全局样式时,才会覆盖全局样式。(如果全局样式的权重高,则采用全局样式)
根目录下的app.json是小程序的全局配置文件
pages:记录所有页面的存放路径
window:设置小程序窗口的外观
常用配置项
tabBar:设置底部的tabBar效果
style:是否启用新版的组件样式
"window": { //下拉 loading 的样式,仅支持 dark(小圆点是暗色的) / light(小圆点的是白色的) "backgroundTextStyle": "light", //导航栏的背景色,只支持十六进制的颜色,不支持文本格式的颜色 "navigationBarBackgroundColor": "#fff", //导航栏顶部的文字 "navigationBarTitleText": "Weixin", //设置导航栏的文字颜色(只支持黑色和白色) "navigationBarTextStyle": "black", //设置下拉菜单 "enablePullDownRefresh": true, //设置下拉菜单刷新时窗口的背景色 "backgroundColor": "#eeeeee" },
上拉触底是通过手指在屏幕上的上拉滑动操作,从而加载更多的数据的行为,默认距离是50px
"onReachBottomDistance": 50
有顶部和底部tabBar
可以设置最少两个最多五个的tab页签
当渲染顶部tab时不显示icon,只显示文本
backgroundColor:tabBar的背景色
selectIconPath:选中时的图片路径
borderStyle:tabBar上边框的颜色
iconPath:未选中时的图片路径
selectedColor:tab上的文字选中的颜色
color:tab上的文字(默认)未选中的颜色
准备好图片资源
包含active的是选中后的图标,不包含active的是未选中时的图标
在app.json文件中新增pages节点,新建对应的tab页面(tab页面必须放在普通页面的前面才能正常运行)
打开app.json,新增tabBar节点,新增list数组,在这个数组中存放着每个Tab项的配置对象,其中list中的每一个对象包含的属性有
pagePath:指定当前tab对应的页面路径(必填)
text:指定当前tab上按钮的文字(必填)
iconPath:指定当前tab未选择时的图片路径
selectedIconPath:指定当前tab被选中后高亮的图片路径
每个页面中都有.json配置文件,用来对当前页面的窗口外观、页面效果进行配置。
app.json中的window节点中的配置,对所有页面都生效。想单独配置页面时,只需要在对应的json文件中进行配置即可。
根据就近原则,如果产生冲突,最终效果以页面配置为准(全局配置将会被覆盖)
建议"enablePullDownRefresh": true属性不要再全局配置中使用,当某个页面需要使用下拉刷新时,再去添加这个属性
出于安全性的考虑,小程序只能使用HTTPS类型的接口,必须将接口的域名添加到信任列表中。
登录到微信小程序管理后台—>开发管理—>开发设置—>服务器域名 开始配置—>修改request合法域名
注意事项:
域名只支持https协议
域名不能使用IP地址或者localhost
域名必须经过ICP备案
服务器域名一个月内最多可申请5次修改
使用微信提供的wx.request()方法,可以发起GET数据请求
- getInfo() {
-
- wx.request({
-
- url: 'https://www.escook.cn.api/get',
-
- method:'GET',
-
- data: {
- name:'xiaoyu', age:20
- },
-
- success:(res) => {
- console.log(res);
- }
- })
- },
- postInfo() {
-
- wx.request({
-
- url: 'https://www.escook.cn.api/get',
-
- method:'POST',
-
- data: {
-
- name:'zhangzan',
-
- age:23
-
- },
-
- success:(res) => {
-
- console.log(res.data);
-
- }
- })
- },
在页面刚加载的时候,自动请求一些初始化的数据,只需要在页面的onLoad事件中调用获取数据的函数
- onLoad() {
-
- this.getInfo()
-
- this.postInfo()
-
- },
在微信开发者工具中,临时开启「开发环境不校验请求域名、TLS 版本及HTTPS 证书」选项,跳过request 合法域名的校验。
仅限在开发与调试阶段使用
以上两种情况在小程序中都不存在。
跨域只存在浏览器中,而小程序的宿主环境是微信,所以不存跨域的问题。
Ajax的核心技术是依赖于浏览器的XMLHttpRequest这个对象,在小程序中不能叫做发起“Ajax请求”,而是叫做“发起网络数据请求”
创建一个小程序项目,新建页面
设置头部导航栏
在app.json中修改window节点的配置
设置tabBar
每一个list都是一个小图标
pagePath和text必须设置
实现轮播图效果
实现九宫格效果
实现页面间的相互跳转,<a>/location.href(js的API)都可以在浏览器在实现页面导航。
声明式导航
在页面上声明一个<navigator>导航组件,通过点击<navigator>组件实现页面跳转
编程式导航
调用小程序的API,实现页面的跳转
导航到tabBar页面
在页面上声明一个<navigator>导航组件
- //参考跳转到非tab页面
- <navigator url="/pages/test/test?name=xiaoyu&age=20">跳转到test页面</navigator>
导航到非tabBar页面
通过点击<navigator>组件实现页面跳转
- <navigator url="/pages/test/test" open-type="navigate">导航到非Tab页面</navigator>
- //url是要跳转的页面的路径必须是以/开头
- //open-type是跳转的方式,必须为navigate (可以省略,默认跳转到非tab页面)
后退导航
- <navigator open-type="navigateBack" delta="1">后退</navigator>
- //open-type的值为navigateBack,表示进行后退
- //delta的值必须是数字,表示后退的层级,为1的时候可以省略(1为默认属性)
导航到tabBar页面
调用wx.switchTab(Object object)方法
- <button bindtap="gotoMessage">跳转到Tab页面</button>
-
- //通过编程式导航,跳转到message页面
-
- gotoMessage() {
-
- wx.switchTab({
-
- url: '/pages/message/message',
-
- })
-
- },
导航到非tabBar页面
调用wx.navigateTo(Object object)方法
- <button bindtap="gotoTest">跳转到非Tab页面</button>
-
- //通过编程式导航,跳转到test页面
- gotoTest() {
-
- wx.navigateTo({
-
- url: '/pages/test/test',
-
- })
-
- },
后退导航
调用wx.navigateBack(Object object)方法
- <button bindtap="gotoBack">后退</button>
-
- // 编程式导航,后退到上一页面
-
- gotoBack() {
-
- wx.navigateBack()
-
- },
navigator 组件的url 属性用来指定将要跳转到的页面的路径。路径携带的参数:
参数与路径之间使用?分隔
参数键与参数值用=相连
不同参数用&分隔
- //参考跳转到非tab页面
-
- <navigator url="/pages/test/test?name=xiaoyu&age=20">跳转到test页面</navigator>
调用wx.navigateTo(Object object)方法跳转页面时,也可以携带参数
- <button bindtap="gotoTest2">跳转到test页面</button>
-
-
- gotoTest2() {
-
- wx.navigateTo({
-
- url: '/pages/test/test?name=lele&age=23',
-
- })
-
- },
通过声明式导航传参或编程式导航传参所携带的参数,可以直接在onLoad 事件中直接获取到
- onLoad:function(options) {
-
- //options就是导航传过来的参数对象
-
- console.log(options)
-
- }
下拉页面从重新加载页面数据
- //在app.json的Windows中配置即可开启全局下拉刷新
-
- "enablePullDownRefresh": true
- //在需要进行下拉刷新的页面的json配置文件中
-
- "enablePullDownRefresh": true
- //设置下拉刷新的背景颜色
-
- "backgroundColor": "#efefef",
-
- //设置小圆点的颜色
-
- "backgroundTextStyle": "dark"
在页面的.js 文件中,通过onPullDownRefresh() 函数即可监听当前页面的下拉刷新事件
- <view>count值是{{count}}</view>
-
- <button bindtap="addCount">点我加1</button>
-
- addCount() {
-
- this.setData({
-
- count:this.data.count + 1
-
- })
-
- }
-
- // 页面相关事件处理函数-监听用户下拉动作
-
- onPullDownRefresh() {
-
- this.setData({
-
- count : 0
-
- })
-
- wx.stopPullDownRefresh()
-
- }
通过上拉滑动从而加载更多数据的行为,调用onReachBottom() 函数即可实现当前页面上拉触底事件的监听效果。
onReachBottom() { }
触发上拉触底事件时,滚动条距离页面底部的距离,可以在页面的.json配置文件中,设置onReachBottomDistance属性开配置上拉触底的距离,默认为50px,(不带单位)
1.定义随机获取颜色的方法
- data: {
-
- colorList:[]
-
- },
-
- getColors() {
-
- }
2.在页面加载时获取初始数据
- success:({data:res}) => {
-
- this.setData({
-
- colorList:[...this.data.colorList,...res.data]
-
- })
- }
3.渲染UI 结构并美化页面效果
4.在上拉触底时调用获取随机颜色的方法
- onReachBottom() {
-
- this.getColors()
-
- }
5.添加loading 提示效果
- wx.showLoading({
-
- title: '数据加载中...',
-
- })
6.对上拉触底进行节流处理
生命周期:(时间段)是一个对象从创建-> 运行-> 销毁的过程。
生命周期函数:(时间点)是小程序框架提供的内置函数,会伴随生命周期自动按次序执行。它允许在特定的时间点,执行某些特定的操作。
特指小程序从启动->运行->销毁的过程
需要在app.js中声明
- App({
-
- //初始化完成时,执行此函数,全局只触发一次
-
- onLaunch:function(options){},
-
- //小程序启动或从后台切换到前台时触发
-
- onShow:function(options){},
-
- //从前台切换到后台时触发
-
- onHide:function(){}
-
- )}
特指小程序在每个页面的加载->渲染->销毁的过程
需要在页面的.js文件中声明
- Page({
-
- //监听页面加载,一个页面只调用一次
-
- onLoad:function(options){},
-
- //监听页面显示
-
- onShow:function(){},
-
- //监听页面初次渲染完成,一个页面只调用一次
-
- onReady:function(){},
-
- //监听页面隐藏
-
- onHide:function(){},
-
- //监听页面卸载,只调用一次
-
- onUnload:function(){}
-
- )}
(weixin Script)是小程序独有的一套脚本语言。在wxml中无法调用在.js文件中定义的函数,到那时可以调用wxs中定义的函数。
语法类似于JavaScript,但是存在很大区别。
wxs有自己的数据类型
number数值类型、string字符串类型、boolean布尔类型、object对象类型、function函数类型、array数组类型、date日期类型、regexp正则
不支持es6及以上的语法形式
不支持:let、const、解构赋值、展开运算符、箭头函数、对象属性简写、etc...
支持:var 定义变量、普通function 函数等类似于ES5 的语法
wxs遵循CommonJS规范
module对象
require() 函数
module.exports 对象
编写在wxml文件中的<wxs>标签内,必须提供module属性,指定当前wxs的模块名称,方便再wxml中访问模块中的成员
- <view> {{m1.toLower(country)}} </view>
-
- <wxs module="m1">
-
- module.exports.toUpper = function(str) {
-
- return str.toUpperCase()
-
- }
-
- </wxs>
编写在utils文件下,以.wxs后缀结尾
- function toLower(str) {
-
- return str.toLowerCase()
-
- }
-
- module.exports = {
-
- toLower : toLower
-
- }
使用的时候必须为<wxs>标签添加module和src属性
mdule:指定模块的名称
src:指定要引入的脚本的路径(相对路径)
- <view> {{m2.toLower(country)}} </view>
-
- <wxs src="../../utils/tools.wxs" module="m2"/>
- //外联脚本
-
- function toLower(str) {
-
- return str.toLowerCase()
-
- }
-
- module.exports = {
-
- toLower : toLower
-
- }
与JavaScript 不同
不能作为组件的事件回调
wxs 的运行环境和其他JavaScript 代码是隔离的
①wxs 不能调用js 中定义的函数
②wxs 不能调用小程序提供的API
在iOS 设备上,WXS会比JavaScript 快2 ~ 20 倍。但在android 设备上,二者的运行效率无差异。
在项目的根目录上新建components文件夹,新建test文件夹—>新建component,输入组件的名称,会自动生成四个文件。
在页面的.json文件中引入组件(以键值对的形式)
- "usingComponents": {
-
- "my-test1":"/componets/test/test"
-
- }
然后在.html中使用
<my-test1></my-test1>
过程和局部组件类似,只不过声明组件的位置在app.json中,在所有的.html文件中都可以使用声明过的组件。(全局引用)
当使用频率高时使用全局引用,反之则使用局部引用。
组件的.json文件在需要声明"component":true属性
组件的.js文件中调用的是Component()函数
组件的事件处理函数需要定义到methods节点中
自定义组件只对当前组件生效,既可以防止外界的样式影响组件内部的样式,也可以防止组件的样式破坏外界的样式。
注意:只有class选择器有样式隔离效果,id、属性、标签选择器都不受样式隔离的影响,所以在组件和引用组件的页面尽量不要使用以上三种选择器。
可以在组件的.js文件下新增如下配置
- Component({
-
- options:{
-
- styleIsolation:'isolated'
-
- }
-
- })
或者.json文件中新增
styleIsolation:'isolated'
定义用于组件模板渲染的私有数据
定义事件处理函数和自定义方法(建议以_开头)
用来接收外界传递到组件中的数据,可以使用setData 为properties 中的属性重新赋值
完整定义属性的方式
- max:{
-
- type:Number,
-
- //属性值的数据类型
-
- value:10
-
- //默认属性值
-
- }
简化定义的方式
- max:Number
-
- //不需要指定属性的默认值,可以使用简化方式
data存储组件的私有数据
properties存储外界传递到组件中的数据
二者都是可读可写(不同于vue中的prop只能读取不能更改值)使用setData为properties中的属性重新赋值。
observers类似于Vue重点watch侦听器
监听器支持监听对象中单个或多个属性的变化
- component({
-
- observers: {
-
- '对象.属性A,对象.属性B': function(属性A的新值,属性B的新值){
-
- //触发此监听器的3种情况:
-
- //【为属性A赋值】使用setData设置this.data.对象.属性A 时触发
-
- //【为属性B赋值】使用setData 设置this.data.对象.属性B 时触发
-
- //【直接为对象赋值】使用setData 设置this.data.对象 时触发
-
- }
-
- }
-
- })
不用于界面渲染的data字段
有助于提高页面性能
使用:在Component 构造器的options 节点中,指定pureDataPattern为一个正则表达式,字段名符合这个正则表达式的字段将成为纯数据字段
Created组件刚刚被创建时执行
Attached 在组件实例进入页面节点树时执行
Ready 在组件在视图层布局完成后执行
Moved 在组件实例被移动到结点数的另一个位置时执行
Detached 在组件实例被从页面节点树移除时执行
Error 每当组件方法抛出错误时执行
最重要的生命周期函数有3 个,分别是created、attached、detached。特点如下:
组件实例刚被创建好的时候,created 生命周期函数会被触发
还不能调用setData
通常在这个生命周期函数中,只应该用于给组件的this 添加一些自定义的属性字段
组件完全初始化完毕、进入页面节点树后,attached 生命周期函数会被触发
this.data已被初始化完毕
绝大多数初始化的工作在这个时机进行(例如发请求获取初始数据)
组件离开页面节点树后,detached 生命周期函数会被触发
退出一个页面时,会触发页面内每个自定义组件的detached 生命周期函数
清理性质的工作
生命周期函数可以直接定义在Component的,在lifetimes字段内进行声明(优先级最高)
Show 组件所在页面被展示时执行
Hide 组件所在页面被隐藏时执行
Resize 组件所在页面尺寸变化时执行
组件所在页面的生命周期函数,需要定义在pageLifetimes 节点中
- pageLifetimes: {
-
- show() { },
-
- hide() { },
-
- resize() { }
-
- }
属性绑定
父向子的指定属性设置数据,仅限JSON兼容的数据
事件绑定
子向父传递数据,可传递任何数据
获取组件实例
父组件通过this.selectComponent()获取子组件实例对象,可以访问子组件的任意数据和方法
属性绑定用于实现父向子传值,而且只能传递普通类型的数据,不能传递方法
子组件在properties节点中声明对应的属性并使用
实现子向父传值,可以传递任何类型的数据
实现子向父传值,可以传递任何类型的数据
在父组件的js中定义一个函数
在父组件的wxml中通过自定义事件的形式,将之前定义的函数传递给子组件
在子组件的js中,调用this.triggerEvent('自定义事件名称', { /* 参数对象*/ }),将数据发送到父组件
在父组件的js 中,通过e.detail 获取到子组件传递过来的数据
在父组件里调用this.selectComponent("id或class选择器") ,获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。