组件的创建
组件的引用
//json
{
"usingComponents": {
"my-test1":"/components/test/test"
}
}
//wxml
<my-test1></my-test1>
组件与页面的区别
组件样式
//.js
options:{
styleIsolation:'isolated'
},
//或者
//.json
{
"styleIsolation":"isolated"
}
可选值 | 默认值 | 描述 |
---|---|---|
isolated | 是 | 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响 |
apply-shared | 否 | 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面 |
shared | 否 | 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-shared 或 shared 的自定义组件 |
数据、方法和属性
数据监听器
observers:{
'n1,n2':function name(newN1,newN2) {
this.setData({
sum:newN1+newN2
})
}
}
纯数据字段
options:{
//指定纯数据字段格式
pureDataPattern:/^_/
},
data:{
a:true,//普通数据字段
_b:true//纯数据字段
}
组件的生命周期
生命周期函数 | 参数 | 描述说明 |
---|---|---|
created | 无 | 在组件实例刚刚被创建时执行 |
attached | 无 | 在组件实例进入页面节点树时执行 |
ready | 无 | 在组件在视图层布局完成后执行 |
moved | 无 | 在组件实例被移动到节点树另一个位置时执行 |
detached | 无 | 在组件实例被从页面节点树移除时执行 |
error | Object Error | 每当组件方法抛出错误时执行 |
组件实例刚被创建好的时候,created生命周期函数会被触发
在组件完全初始化完毕、进入页面节点树后,attached生命周期函数会被触发
在组件离开页面节点树后, detached生命周期函数会被触发
在小程序组件中,生命周期函数可以直接定义在Component 构造器的第一级参数中,可以在lifetimes字段内进行声明**(这是推荐的方式,其优先级最高**)。
Component({
lifetimes:{ //推荐用法
attached(){ }
},
//attached(){ }, 旧式定义方式
})
组件所在页面的生命周期
生命周期函数 | 参数 | 描述 |
---|---|---|
show | 无 | 组件所在的页面被展示时执行 |
hide | 无 | 组件所在的页面被隐藏时执行 |
resize | Object Size | 组件所在的页面尺寸变化时执行 |
Component({
pageLifetimes:{
show:function(){ },//页面被展示
hide:function(){ },//页面被隐藏
resize:function(size){ }//页面尺寸变化
}
})
插槽
//component.js
options:{
multipleSlots:true
},
//component.wxml
<view>
<slot name="before"></slot>
<view>这里是组件的内部结构</view>
<slot name="after"></slot>
</view>
//pages.wxml
<my-test>
<view slot="before">这里通过before插槽填充的内容</view>
<view slot="after">这里通过after插槽填充的内容</view>
</my-test>
父子组件之间的通信
属性绑定
//父组件data节点
data: {
count:0
},
// 父组件wxml
<my-test5 count="{{count}}"></my-test5>
<view>~~~~~~~~~</view>
<view> 父组件中,count值是:{{count}}</view>
//子组件properties节点
properties: {
count:Number
},
// 子组件wxml
<view>子组件中,count值是:{{count}}</view>
事件绑定
//父组件定义方法
syncCount(e){
this.setData({
count:e.detail.value
})
},
//父组件wxml,使用 bind:自定义事件名称
<my-test5 count="{{count}}" bind:sync="syncCount"></my-test5>
//子组件wxml
<view>子组件中,count值是:{{count}}</view>
<button bindtap="addCount">+1</button>
//子组件方法
methods: {
addCount(){
this.setData({
count:this.properties.count+1
})
this.triggerEvent('sync',{value:this.properties.count})
}
}
获取组件实例
//父组件wxml结构
<my-test5 count="{{count}}" bind:sync="syncCount" class="customA"></my-test5>
<view> 父组件中,count值是:{{count}}</view>
<button bindtap="getChild">获取子组件的实例对象</button>
//父组件js方法 id选择器或者class选择器
getChild(){
const child = this.selectComponent('.customA')
child.setData({count:child.properties.count + 1})
child.addCount()
},
behaviors
//创建文件夹,创建文件
module.exports = Behavior({
data:{username:'zs'},
properties:{},
methods:{}
})
//js文件中使用
const myBehavior = require('../../behaviors/my-behaviors')
// components/test5/test5.js
Component({
behaviors:[myBehavior],
})
可用的节点 | 类型 | 是否必填 | 描述 |
---|---|---|---|
properties | Object Map | 否 | 同组件的属性 |
data | Object | 否 | 同组件的数据 |
methods | Object | 否 | 同自定义组件的方法 |
behaviors | String Array | 否 | 引入其它的 behavior |
created | Function | 否 | 生命周期函数 |
attached | Function | 否 | 生命周期函数 |
ready | Function | 否 | 生命周期函数 |
moved | Function | 否 | 生命周期函数 |
detached | Function | 否 | 生命周期函数 |
npm包的限制
Vant Weapp
安装Vant组件库(详细参考https://youzan.github.io/vant-weapp/#/quickstart#an-zhuang)
使用Vant组件:
//app.json
"usingComponents": {
"van-button": "@vant/weapp/button/index"
}
//pages的wxml结构
<van-button type="primary">按钮</van-button>
定制全局主题样式
page {
//定制警告按钮的背景颜色和边框颜色
--button-danger-background-color:#C00000;
--button-danger-border-color:#D60000;
}
API Promise化
//装包,需重新构建
npm i --save miniprogram-api-promise@1.0.4
//app.js
import {promisifyAll} from 'miniprogram-api-promise'
const wxp = wx.p = {}
promisifyAll(wx,wxp)
全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题
在小程序中,可使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。
//装包,重新构建
npm i --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
//创建MobX的Store实例 创建store文件夹、store.js文件
import {observable,action} from 'mobx-miniprogram'
export const store = observable({
//数据字段
numA:1,
numB:2,
//计算属性
get sum(){
return this.numA + this.numB
},
//actions方法,用来修改store中的数据
updateNum1:action(function(step){
this.numA += step
}),
updateNum2:action(function(step){
this.numB += step
}),
})
//将Store中的成员绑定到页面中 页面的.js文件
import {createStoreBindings} from 'mobx-miniprogram-bindings'
import{store} from '../../store/store'
Page({
onLoad:function(){ //监听页面加载
this.storeBindings = createStoreBindings(this,{
store, //指定要绑定的Store
fields:['numA','numB','sum'],//指定要绑定的字段数据
actions:['updateNum1']//指定要绑定的方法
})
},
onUnload:function(){//监听页面卸载
this.storeBindings.destroyStoreBindings()
}
})
//页面wxml
<view> {{numA}} + {{numB}} = {{sum}} </view>
<van-button type="primary" bindtap="btnHandler1" data-step="{{1}}"> numA+1 </van-button>
<van-button type="danger" bindtap="btnHandler1" data-step="{{-1}}"> numA-1 </van-button>
//组件js
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import {store} from '../..store/store'
Component({
behaviors:[storeBindingsBehavior],
storeBindings:{
store,
fields:{
numA:'numA',
numB:'numB',
sum:'sum'
},
actions:{
updateNum2:'updateNum2'
}
},
})
//组件wxml
<my-numbers></my-numbers>
//组件js
methods: {
btnHandler2(e){
this.updateNum2(e.target.dataset.step)
}
}
概念
分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载
优点:
分包项目由1个主包 + 多个分包组成
使用
subpackages
** 的配置进行分包,subpackages之外的目录将被打包到主包中独立分包
独立分包本质也是分包,可以独立于主包和其他分包而单独运行"independent": true
开发者可以按需,将某些具有一定功能独立性的页面配置到独立分包中
独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源!!
分包预下载
//app.json
"preloadRule": {
"pages/contact/contact":{
//指定的网络模式下进行预下载
"network": "all",
//进入页面后预下载哪些分包
"packages":["pkgA"]
}
},