赞
踩
学习网站:框架 | 微信开放文档
00.一个小程序页面由四个文件组成,分别是:
xxx
xxx.js 页面逻辑
xxx.json 页面配置
xxx.wxml 页面结构
xxx.wxss 页面样式
01.小程序框架组成在小程序中 ,通过App()来注册一个小程序 ,通过Page()来注册一个页面
1.逻辑层
1.注册小程序
2.注册页面
3.页面生命周期
4.页面路由
5.模块化
6.API
2.视图层
1.wxml
2.wxss
3.wxs
wxs是微信小程序自身的脚本语言,用来过滤和计算。wxs可以通过文件可模块标签来定义,文件需要.wxs后缀文件
wxs是专门用于wxml页面的,如果你有在页面中使用js脚本的需求可以使用,但是wxs是不能被其它js文件引用的
实际开发应该根据情况,选择使用js或wxs,但本人的绝大部分开发都是用js中完成的
## 示例1:小程序的生命周期02.注册小程序
每个小程序都需要在 app.js 中调用 App 方法注册小程序实例,绑定生命周期回调函数、
错误监听和页面不存在监听函数等
1.创建App实例,小程序生命周期函数(vue叫钩子函数)
// app.js
App({
onLaunch (options) {//监听小程序初始化 当小程序初始化完成时,会触发 onLaunch(全局只触发一次)
// Do something initial when launch.
},
onShow (options) {//监听小程序显示 当小程序启动,或从后台进入前台显示,会触发 onShow
// Do something when show.
},
onHide () {//监听小程序隐藏 当小程序从前台进入后台,会触发 onHide
// Do something when hide.
},
onError (msg) {//错误监听函数 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息
console.log(msg)
},
globalData: 'I am global data'
})
注1:与SPA项目的比较
1.相当于SPA项目中的main.js中定义全局Vue对象,
2.onLaunch/onShow/onHide/onError就相当于钩子函数
注2:其他开发者可以添加任意的函数或数据到 Object 参数中,用 this 可以访问
2.整个小程序只有一个 App 实例,是全部页面共享的。开发者可以通过 getApp 方法
获取到全局唯一的 App 实例,获取App上的数据或调用开发者注册在 App 上的函数。
// xxx.js var let const 定义常量
const appInstance = getApp()
appInstance = ..... // XXXXX
console.log(appInstance.globalData) // I am global data## 示例2:数据绑定/生命周期/数据继承
03.注册页面
对于小程序中的每个页面,都需要在页面对应的 js 文件中进行注册,指定页面的初始数据、生命周期回调、事件处理函数等
简单的页面可以使用Page(Object object)构造器进行构造。
Page(Object object)构造器作用:
注册小程序中的一个页面。接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等Page({
data: {//页面第一次渲染使用的初始数据
text: "This is page data."
},
onLoad: function (options) {//监听页面加载
console.log("page ---onLoad---");
},
onReady: function () {//监听页面初次渲染完成
console.log("page ---onReady---");
},
onShow: function () {//监听页面显示
console.log("page ---onShow---");
},
onHide: function () {//监听页面隐藏
console.log("page ---onHide---");
},
onUnload: function () {//监听页面卸载
console.log("page ---onUnload---");
}
})
其中,打开小程序后会依次执行onLoad,onShow和onReady方法
前后台切换会分别执行onHide和onShow方法,
当小程序页面销毁时会执行onUnload方法
注1:如何让让多个页面有相同的数据字段和方法(bindInput)?在页面中使用 behaviors(vue中无此功能)
// my-behavior.js
module.exports = Behavior({
data: {
sharedText: 'This is a piece of data shared between pages.111'
},
methods: {
sharedMethod: function() {
return "This is a piece of data shared between pages.222";
}
}
})// page-a.js
var myBehavior = require('./my-behavior.js')
Page({
behaviors: [myBehavior],
onLoad: function() {
console.log(this.data.sharedText)//继承属性及方法的调用
console.log(this.sharedMethod())
}
})
注2:Page构造器适用于简单的页面。但对于复杂的页面使用 Component 构造器构造页面
omponent 构造器的主要区别是:方法需要放在 methods: { } 里面
Component({
data: {
text: "This is page data."
},
methods: {
onLoad: function(options) {
// 页面创建时执行
},
onPullDownRefresh: function() {
// 下拉刷新时执行
},
// 事件响应函数
viewTap: function() {
// ...
}
}
})注1:重要的事情说三次“不要在vscode中创建页面,微信开发者工具不会进行编译,在app.json的pages添加ctrl+s即可”
04.页面生命周期(了解)
### 重要
05.小程序配置1.全局配置文件(重要)
小程序根目录下的 app.json 文件用来对微信小程序进行全局配置,决定页面文件的路径、
窗口表现、设置网络超时时间、设置多 tab 等
-tabbar(最少2个分栏)
演示示例:首页、购物车、我的
-pages
演示示例:小程序标题、页面标题文字
-window
2.sitemap.json(了解)
小程序根目录下的 sitemap.json 文件用来配置小程序及其页面是否允许被微信索引## 示例3:页面路由:组件跳转(绝对路径和相对路径),API跳转
06.页面路由
在小程序中所有页面的路由全部由框架进行管理。
框架以栈的形式维护了当前的所有页面。
1.当发生路由切换的时候,页面栈的表现如下
路由方式 页面栈表现
初始化 新页面入栈
打开新页面 新页面入栈
页面重定向 当前页面出栈,新页面入栈
页面返回 页面不断出栈,直到目标返回页
Tab 切换 页面全部出栈,只留下新的 Tab 页面
重加载 页面全部出栈,只留下新的页面
开发者可以使用 getCurrentPages() 函数获取当前页面栈。2.路由方式
对于路由的触发方式以及页面生命周期函数具体详情见官网文档注1:栈是一个先进后出的数据结构(子弹夹)
注2:演示如何指定页面启动(重要)
1.修改路由配置
2.添加启动配置,指定启动页面小程序中:this.data.xxx和this.setData区别
##示例4-1:路由中添加参数
##示例4-2:数字自增与自减(如何在事件中传递参数+1或-1)
##示例4-3:数据双向绑定07.微信小程序事件绑定(重要)
1.事件类别:
tap:点击事件
input:输入事件
longtap:长按事件;
touchstart:触摸开始;
touchend:触摸结束;
touchcansce:取消触摸;注1:小程序中请求处理方法是不能传递参数,正确方式:通过data-xxx属性传递参数,再通过事件源获得参数
错误
<button bindtap="handletap(-1)"
正确
<button bindtap="handletap" data-number="{{-1}}"正解:传递固定值-1
data-number="{{-1}}"
还可以绑值
data-number="{{n}}"再从事件对象中获取
e.currentTarget.dataset.number
注2:在微信小程序中,js的数据和前端显示的数据是单数据流。
即js里边的数据变了,前端能立刻显示,但如果前端数据变了,js不能改变,怎么办呢!
我们可以通过bindinput方法,来实现双向数据绑定。
原理:我们使用bindinput事件来获取input的输入值,然后根据dataset获取要跟 data数组里的对象进行数据绑定
具体写法
//1.在data中定义dataList属性,并在其中定义要双向绑定的属性名
//2.定义bindInput方法
//3.<input class="input" bindinput="bindInput" data-name="username" placeholder="请输入帐号" auto-focus/>
bindInput(e) {
console.log("bindInput");
//debugger
// 表单双向数据绑定
var that = this;
var dataset = e.target.dataset;
// data-开头的是自定义属性,可以通过dataset获取到,dataset是一个json对象
var name = dataset.name;
var value = e.detail.value;//小问题:规则接收数据属性只能叫dataList
that.data.dataList[name] = value; //逻辑层数据的更改
// 拼接对象属性名,用于为对象属性赋值
var attributeName = "dataList." + name;
that.setData({//视图层数据的更改
[attributeName]: value
});
console.log(that.data.dataList);
}
2.事件绑定:
bind绑定;
catch绑定;(能阻止事件冒泡)
例如:绑定点击事件 bindtap
page.wxml 文件3.接收参数
Page({
onLoad: function(options) {
//小程序Data的赋值必须使用setData方法,错误:this.Data.title='xxx';
this.setData({
title: options.title
})
}
})
## 示例4:模块化
08.模块化
可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块
注1:可参考utils/util.js被logs/logs.js引用
注2:定义模块时建立直接定义一个对象
//common.js
module.exports = {
sayHello: function (name) {
console.log("Hello %s", name);
},
sayGoodbye: function (name) {
console.log("Goodbye %s", name);
}
};
09.API(重要)
小程序开发框架提供丰富的微信原生API,可以方便的调起微信提供的能力,
如获取用户信息,本地存储,支付功能等
API的分类
1.事件监听API
以 on 开头的 API 用来监听某个事件是否触发,如:wx.onSocketOpen
2.同步 API
以 Sync 结尾的 API 都是同步 API, 如 wx.setStorageSync3.异步 API
大多数 API 都是异步 API,如 wx.request,wx.login 等。这类 API 接口通常都接受一个 Object 类型的参数,
这个参数都支持按需指定以下字段来接收接口调用结果
### 视图层
10.wxml(重要)wxml(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构
小程序模板语法
1.数据绑定
2.列表渲染(即循环)
演示示例:block标签的使用(写代码时存在,页面在渲染时则没有任何显示)
3.条件渲染(即if)
演示示例:数据绑定、for、if4.模板(与vue不同)
WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用。
①.定义模板
<template name="msgItem">...</template>
②.使用模板
<template is="msgItem" data="{{...item}}"/>
5.引用
WXML 提供两种文件引用方式import和include
注1:有vue经验掌握此内容非常容易^_^11.WXSS
WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式
WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。
为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。
与 CSS 相比,WXSS 扩展的特性有:
尺寸单位
rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。
如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。样式导入
12.WXS(略,不重要)
WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构
附录一:require函数简要说明
require(...)是Javascript中用于模块化编程的一个函数,用于加载模块。
假定有一个数学模块math.js,就可以像下面这样加载
var math = require('math');
然后,就可以调用模块提供的方法:
var math = require('math');
math.add(2,3); // 5
附录二:微信开发者工具 黑屏的解决方案
注1:每个人的User Data下的估计名字不一样,但是都在WeappLocalData目录下
C:\Users\Administrator\AppData\Local\微信开发者工具\User Data\a8265259807471d9496af75b01f1850f\WeappLocalData
###附录三的问题使用wechat_devtools_1.03.2009140_x64版本进行开发始终无法解决--20201030
###20201104解决方案:清除缓存,重新打开此项目即可
###
附录三:未找到 app_json 中的定义的 pages pages-category-index 对应的 WXML 文件的解决方案
是编辑器的bug,解决方案是,比如我要建立一个order文件,他有两种建立方式:
第一种: 直接在app.json里面建立pages/order/order,编辑器会自动创建相应的文件夹以及文件,并且不会报错;
第二种: 我们手动在pages下面建立文件集order,并创建相应的文件,再在app.json里添加相应的路径,
但是这时候系统就会报:未找到 app.json 中的定义的 pages “pages/order/order” 对应的 WXML 文件,很诡异。
然后我们需要怎么解决呢,把app.json的pages删除(记得备份),然后保存,
关闭编辑器,再打开,把刚复制的路径重新放进去,发现不报错了,可以愉快的玩耍了如果成功:控制台会显示如下信息
[sitemap 索引情况提示] 根据 sitemap 的规则[0],当前页面 [pages/reg/reg] 将被索引未找到 app.json 中的定义的 pages "pages/xxx/xxx" 对应的 WXML 文件
问题定位:
编辑器的bug解决方法:
1.将app.json中关于页面pages中的清空(记得备份)
2.清空后保存
3.关闭微信开发工具,重启
4.将文件配置复制粘贴回来
5.页面生成成功
附录四:微信小程序this.data和this.setData({})的区别this.data.xx是用来获取页面data对象的----------只是js(逻辑层)数据的更改;
this.setData是用来更新界面的---------用于更新view层的。
总结一下就是:this.data与this.setData的关系就是this.setData里面存储的是this.data的副本,
而界面是从this.setData里面托管的this.data的副本取数据的。
所以我们更改this.data并不会直接更新界面,因为这个时候的this.setData里面的副本还是没有更新前的。
详情可参考:资料/06 01.mht~06 03.mht
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。