声明式导航:使用
组件实现页面跳转。
导航到消息页面
导航到info页面
返回上一页
tabBar
页面:需指定url
属性(以/
开头)和open-type="switchTab"
。tabBar
页面:指定url
属性(以/
开头),open-type="navigate"
(可省略)。open-type="navigateBack"
和delta
属性(后退层级,可省略)。编程式导航:调用小程序的导航 API 实现页面跳转。
// 导航到tabBar页面
Page({
gotoMessage() {
wx.switchTab({
url: '/pages/message/message'
})
}
})
// 导航到非tabBar页面
Page({
gotoInfo() {
wx.navigateTo({
url: '/pages/info/info'
})
}
})
// 后退导航
Page({
gotoBack() {
wx.navigateBack()
}
})
tabBar
页面:调用wx.switchTab
方法,传入包含url
等属性的对象。tabBar
页面:调用wx.navigateTo
方法,传入包含url
等属性的对象。wx.navigateBack
方法,可传入delta
属性。声明式导航传参:navigator
组件的url
属性后面携带参数,格式为?参数键=参数值&参数键=参数值
。
跳转到info页面
编程式导航传参:调用wx.navigateTo
方法跳转页面时,url
属性中携带参数。
// 编程式导航传参
Page({
gotoInfo2() {
wx.navigateTo({
url: '/pages/info/info?name=ls&gender=男'
})
}
})
在onLoad
中接收导航参数:通过options
对象获取传递过来的参数。
// 在onLoad中接收导航参数
Page({
onLoad: function (options) {
console.log(options)
}
})
// 全局开启下拉刷新(app.json示例)
{
"window": {
"enablePullDownRefresh": true
}
}
// 局部开启下拉刷新(页面.json示例)
{
"enablePullDownRefresh": true
}
// 配置下拉刷新窗口的样式(页面.json示例)
{
"backgroundColor": "#ffffff",
"backgroundTextStyle": "dark"
}
// 监听页面的下拉刷新事件
Page({
data: {
count: 0
},
onPullDownRefresh: function () {
this.setData({
count: 0
})
wx.stopPullDownRefresh()
},
countAdd() {
this.setData({
count: this.data.count + 1
})
}
})
启用下拉刷新
app.json
的window
节点中,将enablePullDownRefresh
设置为true
。.json
配置文件中,将enablePullDownRefresh
设置为true
(推荐)。backgroundColor
(16 进制颜色值)和backgroundTextStyle
(dark
或light
)配置。.js
文件中,通过onPullDownRefresh
函数监听,可重置数据并手动停止下拉刷新(wx.stopPullDownRefresh
)。// 监听页面的上拉触底事件
Page({
onReachBottom: function () {
console.log("触发了上拉触底的事件")
}
})
// 配置上拉触底距离(页面.json示例)
{
"onReachBottomDistance": 80
}
.js
文件中,通过onReachBottom
函数监听。.json
配置文件中,通过onReachBottomDistance
属性配置,默认50px
。// 上拉触底案例
Page({
data: {
colorList: []
},
onLoad: function (options) {
this.getColors()
},
onReachBottom: function () {
this.getColors()
},
getColors() {
wx.showLoading({
title: "数据加载中..."
})
wx.request({
url: 'https://www.escook.cn/api/color',
method: 'GET',
success: ({ data: res }) => {
this.setData({
colorList: [...this.data.colorList,...res.data]
})
},
complete: () => {
wx.hideLoading()
}
})
}
})
loading
提示效果、对上拉触底进行节流处理。app.js
中声明,包括onLaunch
(初始化完成时触发)、onShow
(启动或从后台进入前台显示时触发)、onHide
(从前台进入后台时触发)。 App({
onLaunch: function (options) {
// 小程序初始化完成时,可做一些初始化工作
},
onShow: function (options) {
// 小程序启动,或从后台进入前台显示时触发
},
onHide: function () {
// 小程序从前台进入后台时触发
}
})
.js
文件中声明,包括onLoad
(监听页面加载,只调用 1 次)、onShow
(监听页面显示)、onReady
(监听页面初次渲染完成,只调用 1 次)、onHide
(监听页面隐藏)、onUnload
(监听页面卸载,只调用 1 次)。 Page({
onLoad: function (options) {
// 监听页面加载,一个页面只调用1次
},
onShow: function () {
// 监听页面显示
},
onReady: function () {
// 监听页面初次渲染完成,一个页面只调用1次
},
onHide: function () {
// 监听页面隐藏
},
onUnload: function () {
// 监听页面卸载,一个页面只调用1次
}
})
WXML
构建页面结构。wxml
中无法调用页面.js
中定义的函数,但可调用wxs
中定义的函数。ES6
及以上的语法形式,支持类似于ES5
的语法。CommonJS
规范。wxml
文件中的
标签内,需提供module
属性。 {m1.toUpper(username)}
// 将文本转为大写形式zs->ZS
module.exports.toUpper = function(str) {
return str.toUpperCase()
}
.wxs
为后缀名的文件内。 // tools.wxs文件
function toLower(str) {
return str.toLowerCase()
}
module.exports = {
toLower: toLower
}
wxml
中引入时,需为
标签添加module
和src
属性。 {m2.toLower(country)}
JavaScript
不同:语法相似但本质不同。JavaScript
代码隔离。iOS
设备上比JavaScript
代码快。components
文件夹,在其中创建组件文件夹,右键点击 “新建 Component” 并输入组件名称,会自动生成.js
、.json
、.wxml
和.wxss
四个文件。test.js
Component({
// 组件逻辑代码
})
test.json
{
"component": true
}
test.wxml
这是一个自定义组件
test.wxss
view {
color: red;
}
.json
配置文件中引用,如{"usingComponents": {"my-test1": "/components/test1/test1"}}
,在页面的.wxml
文件中使用
。 {
"usingComponents": {
"my-test": "/components/test1/test1"
}
}
app.json
全局配置文件中引用,如{"usingComponents": {"my-test2": "/components/test2/test2"}}
,在页面的.wxml
文件中使用
。 {
"usingComponents": {
"my-global-test": "/components/global-test/global-test"
},
"pages": [/* 页面列表 */]
}
.json
文件需声明"component": true
属性,.js
文件调用Component()
函数,事件处理函数定义在methods
节点中。app.wxss
中的全局样式对组件无效,只有class
选择器有样式隔离效果。 .red-text {
color: red;
}
页面文本
styleIsolation
修改,在组件的.js
文件中Component({options: {styleIsolation: 'isolated'}})
Component({
options: {
styleIsolation: 'apply-shared'
}
})
或在.json
文件中{"styleIsolation": "isolated"}
设置,可选值有isolated
(启用样式隔离)、apply-shared
(页面样式影响组件,组件样式不影响页面)、shared
(页面和组件样式相互影响)。 {
"styleIsolation": "apply-shared"
}
data
节点中 Component({
data: {
count: 0
}
})
methods
节点中 Component({
methods: {
increment() {
this.setData({
count: this.data.count + 1
});
}
}
})
properties: {max: {type: Number, value: 10}}
Component({
properties: {
maxValue: {
type: Number,
value: 10
}
}
})
或简化定义max: Number
Component({
properties: {
maxValue: Number
}
})
在组件中使用
data
倾向于存储私有数据,properties
倾向于存储外界传递的数据。setData
重新赋值,如在组件的.wxml
文件中max属性的值为:{{max}}
,在.js
文件中Component({properties: {max: Number}, methods: {addCount() {this.setData({max: this.properties.max + 1});}}})
。vue
中的watch
侦听器,基本语法格式为Component({observers: {'字段A,字段B': function(字段A的新值,字段B的新值) { // do something }}})
。Component({
data: {
num1: 0,
num2: 0,
sum: 0
},
methods: {
incrementNum1() {
this.setData({
num1: this.data.num1 + 1
});
},
incrementNum2() {
this.setData({
num2: this.data.num2 + 1
});
}
},
observers: {
'num1,num2': function (num1, num2) {
this.setData({
sum: num1 + num2
});
}
}
})
Component({observers: {"对象.属性A,对象.属性B': function(属性A的新值,属性B的新值) { // do something }}})
。Component({
options: {
pureDataPattern: /^_/
},
data: {
_privateData: 10,
publicData: 20
}
})
data
字段。Component
构造器的options
节点中,指定pureDataPattern
为正则表达式,符合的字段为纯数据字段,如Component({options: {pureDataPattern: /^_/}, data: {a: true, _b: true}})
。Component({
lifetimes: {
created: function () {
// 在这里可以给组件的this添加一些自定义的属性字段
this.myProperty = 'created';
}
}
})
Component({
lifetimes: {
attached: function () {
// 在这里可以进行一些初始化操作,如获取数据
this.setData({
dataFromServer: '初始化数据'
});
}
}
})
Component({
lifetimes: {
detached: function () {
// 在这里可以进行一些清理操作,如清除定时器
clearTimeout(this.timer);
}
}
})
created
(组件实例创建时执行)、attached
(进入页面节点树时执行)、ready
(视图层布局完成后执行)、moved
(被移动到节点树另一个位置时执行)、detached
(从页面节点树移除时执行)、error
(组件方法抛出错误时执行)。created
(此时不能调用setData
,可添加自定义属性字段)、attached
(this.data
已初始化完毕,可进行初始化工作)、detached
(适合做清理工作),生命周期函数可在lifetimes
节点内声明。Component({
pageLifetimes: {
show: function () {
// 在这里可以根据页面展示重新生成一些数据
this.setData({
pageData: '页面展示时更新的数据'
});
},
hide: function () {
// 在这里可以进行一些与页面隐藏相关的操作
this.cleanUp();
},
resize: function (size) {
// 这里可以根据页面尺寸变化进行相关操作
console.log('页面尺寸变化:', size);
}
}
})
show
(页面被展示时执行)、hide
(页面被隐藏时执行)、resize
(页面尺寸变化时执行),这些函数需定义在pageLifetimes
节点中。wxml
结构中,
节点用于承载组件使用者提供的wxml
结构。
,
组件内部文本
插槽内容
.js
文件中通过options: {multipleSlots: true}
启用。 Component({
options: {
multipleSlots: true
}
})
.wxml
中使用多个
标签,以不同的name
区分,
中间文本
slot
属性将节点插入到不同的
中
头部插槽内容
底部插槽内容
,子组件在properties
节点声明对应属性。 Component({
properties: {
value: String
}
})
wxml
中传递函数引用给子组件,子组件通过this.triggerEvent('自定义事件名称', { /* 参数对象 */ })
发送数据,父组件通过e.detail
获取数据。js
文件中定义函数): Page({
methods: {
handleChildData(data) {
console.log('收到子组件数据:', data);
}
}
})
wxml
文件中传递函数引用给子组件):
js
文件中发送数据): Component({
methods: {
sendDataToParent() {
this.triggerEvent('event', {
data: '子组件数据'
});
}
}
})
this.selectComponent("id或class选择器")
获取子组件实例对象,访问其数据和方法。
js
文件中获取子组件实例并操作): Page({
methods: {
getChildComponent() {
const child = this.selectComponent('#child-component-id');
child.setData({
value: '新值'
});
child.doSomeMethod();
}
}
})
Vue.js
中的 “mixins
”。behavior
包含属性、数据、生命周期函数和方法,组件引用时会合并这些内容,组件可引用多个behavior
,behavior
也可引用其他behavior
。Behavior(Object object)
方法创建 const myBehavior = Behavior({
properties: {},
data: {
behaviorData: 'behavior数据'
},
methods: {
behaviorMethod() {
console.log('behavior方法');
}
}
});
module.exports = myBehavior;
require()
方法导入,挂载到behaviors
数组节点中 const myBehavior = require('./my-behavior');
Component({
behaviors: [myBehavior],
methods: {
useBehaviorMethod() {
this.behaviorMethod();
}
}
})