提升篇学习目标
如何自定义小程序组件
小程序组件中behaviors的作用
安装和配置vant-weapp组件库
如何使用MobX实现全局数据共享
如何对小程序API进行Promise化
小程序组件学习目标
创建并引用组件(全局、局部、usingComponent)
修改组件样式(option-stylesolation)
定义和使用数据监听器(observes)
如何定义和使用纯数据字段(option-pureDataPattern)
如何实现组件父子通信三种方式(属性、事件、this.sllectComponent)
如何定义和使用behaviors
1.自定义组件
1.1创建和引用组件
1.1.1创建组件
component-新建test文件夹
test-新建Component
输入名称会自动生成4个文件:.js, .json, .wxml, .wxss
1.1.2 引用自定义组件
分“局部引用”和“全局引用”
局部引用:页面的.json文件中引入组件
//1.组件引用.json
{
"usingComponents": {
"my-test":"/component/test/test1"
}
}
// 2.组件使用.wxml文件
<my-test><my-test>
全局引用:app.json文件中引入
1.1.3组件和页面的区别
组件和页面都是由js、json、wxml、wxss文件组成的;js和json文件有明显不同
组件json文件声明“component”: true 属性
组件js文件调用的是Component()函数
组件的事件处理函数需要定义到methods节点中
1.2 样式
1.2.1 样式隔离
样式隔离:当前组件样式只对当前组件生效,对其他的页面和其他组件没有影响,防止样式污染
样式注意点:app.wxss文件对组件样式无效
只有class选择器才有样式隔离效果,id选择器、属性选择器、标签选择器不受样式隔离影响
建议:在组件和引用页面,尽量使用class选择器!不要使用其他选择器!!
1.2.2修改组件样式的隔离选项
外界能控制组件内部的样式,可以js通过stylesolation修改组件的样式隔离项,可选值如下
Component({
options:{
styleIsolation: 'isolated'
},
})
1.3 数据、方法
data数据:在小程序组件中,用于组件模板的渲染和私有数据,需要定义在data节点中
methods方法:事件处理函数和自定义方法(建议_下划线开头,区分事件处理函数)
// component/test/test1.js
Component({
options:{
styleIsolation: 'isolated'
},
/**
* 组件的属性列表
*/
properties: {
},
/**
* 组件的初始数据
*/
data: {
num: 0
},
/**
* 组件的方法列表
*/
methods: {
addNum() {
this.setData({
num: this.data.num +1
})
this._showNum()
},
_showNum() {
wx.showToast({
title: 'num值是'+this.data.num,
icon: 'none'
})
}
}
})
1.4 properties属性
1.4.1 使用
properties是组件对外属性,用来接收外界传递组件中的数据
//js文件,定义属性
properties: {
// 完整定义写法,需定义默认值,推荐写法
max: {
type: Number,
value: 10
},
// 简化写法,不需要指定属性默认值
max: Number
},
//使用属性,wxml文件
<view><my-test max="9"></my-test></view>
1.4.2 data和properties的区别
在小程序组件中,properties属性和data数据的用法相同,都是可读可写的,区别是
data属性倾向于存储组件的私有数据
properties倾向于存储外界传递到组件中的数据
this.data === this.properties
1.4.3 setData修改properties的值
data数据和properties属性没有本质区别(本质是同一个对象),都可以为数据重新赋值
1.5 数据监听器
1.5.1 基础用法
用于监听和响应任何属性数据字段的变化,从而执行特定的操作,类似vue中watch
observers: {
//'监听属性(逗号分隔可多个)'
'n1, n2': function(new1,new2){
this.setData({
num: new1+new2,
})
}
},
1.5.2 监听对象属性变化
// 监听对象
'num.a, num.b, num.c': function(a,b,c){
this.setData({
newNum : '${a}+${b}+${c}'
})
}
注意:js里面`${}`用来动态绑定属性变化
监听对象中所有属性变化,用**通配符表示
// 监听对象
'num.**': function(obj){
this.setData({
newNum : '${obj.a}+${obj.b}+${obj.c}'
})
}
1.6 纯数据字段
不用于界面渲染的data字段,也不会传递给其他组件的
优点:提高页面更新的性能
options节点中,指定pureDataPattern为正则表达式
options:{
// 匹配所有的_开头的数据字段为纯数据字段
pureDataPattern: /^_/,
},
1.7 组件的生命周期
1.7.1 基本介绍
在小程序组件中,重要的生命周期函数有created、attached、detached三个
created不能调用setData,只能添加自定义属性字段
attached进行大多数初始化工作(如发请求获取初始数据),用的最多
detached适合做清理性质工作,如清理监听事件
1.7.2 lifetimes 节点
lifetimes节点用来定义小程序组件生命周期的
Component({
// 推荐写法
lifetimes: {
attached(){},
datached(){}
},
})
1.7.3 组件所在页面的生命周期
自定义组件的行为依赖页面状态的变化,此时用到组件页面的生命周期
在自定义组件中组件页面的生命周期函数有3个:
1.7.4 pageLifetimes 节点
组件所在页面生命周期函数,需要定义在pageLifetimes节点中
pageLifetimes: {
show: function() {},
hide: function() {},
resize: function() {}
},
1.8 插槽
在wxml结构中,可以使用<slot>节点(插槽),用来承载组件使用者提供的wxml结构
1.8.1 单个插槽
组件只允许使用一个插槽进行占位,这个叫单个插槽
1.8.2 启用多个插槽
在js文件启动
options:{
// 启动多个插槽
multipleSlots: true,
}
定义插槽:在wxml中使用<slot>定义多个插槽,用name区分不同的插槽
<slot name="s1"></slot>
<slot name="s2"></slot>
使用插槽:
<my-test max="9">
<view slot="s1">我是插槽一</view>
<view slot="s2">我是插槽二</view>
</my-test>
1.9 父子组件间的通信
属性绑定:父向子组件指定属性设置数据,仅能设置json兼容的数据(普通类型数据)
//子组件js
properties:{
count: Num
}
// 子组件的wxml结构中
<test>{{count}}</test>
事件绑定:子组件向父组件传递数据,可传递任意数据
父组件js中,定义一个函数,通过自定义事件传递给子组件
syncCount(){
console.log("syn");
},
父组件wxml中,传递给子组件
<my-test max="9" bind:sync="syncCount">
子组件js中,调用this.triggerEvent('自定义事件名称',{参数对象}),将数据发送给子组件
methods: {
addNum() {
this.setData({
num: this.data.num +1
})
this.triggerEvent('sync',{value: this.properties.count})
}
父组件js中,通过e.detail获取子组件传递数据
syncCount(){
this.setData({
count: e.detail.value
})
},
获取组件实例
父用this.selectComponent('id 或者class选择器')获取子组件实例对象,直接访问子组件的数据和方法
父组件wxml文件
<my-test bind:sync="syncCount" class="cl">
</my-test>
<button bindtap="getChild">获取子组件实例</button>
父js文件
getChild(){
const son = this.selectComponent('.cl')
son.setData({count: son.properties.count +1})
son.addCount() //调用子组件方法
},
1.9 behaviors
用于实现组件间代码共享的特性,类似vue的mimins
1.9.1 工作方式
可以包含属性、数据、生命周期函数和方法;属性、数据、方法会合并到数组中
每个组件可以引用多个behavior,behavior可以引用其他的behavior
1.9.2 创建behavior
调用behavior()方法创建一个共享的behavior实例对象,供所有组件使用
在根目录创建behavior/my-behavior.js
module.exports = Behavior({
data: {
name: 'lisa'
},
properties: {},
methods: {}
})
1.9.3 导入并使用
在组件中使用require() 导入,挂载后可访问behavior中的数据或者方法
js文件
const myBeha = require('../../behavior/my-behavior')
Component({
behaviors: [myBeha],
})
1.9.4 可用节点
1.9.5 同名字段覆盖和组合规则
组件和引用的behavior中包含同名字段,参考以下规则:
同名的数据字段(data)
同名的属性(properties)和方法methods
同名的生命周期函数