创建组件
引用组件
- 局部引用 (在页面的.json配置文件中引用组件的方式)
- 全部引用 (在app.json全局配置文件中引用组件的方式)
{
"usingComponents": {
"tabar":"/components/tabar/tabar"
}
}
<tabar></tabar>
组件和页面的区别
- 从表面上看,组件和页面都是由.js、.json、.wxml、和.wxml这4个文件组成。但是,组件和页面的.js与.json文件有明显的不同:
- 组件的.json文件中需要声明
"component":true属性
- 组件.js文件中调用的是
component()函数
- 组件的事件处理函数需要定义到
methods节点中
自定义组件的样式
- 组件样式隔离
- 默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的UI结构
- 组件样式隔离的注意点
- app.wxss中的全局样式对组件无效
- 只有class选择器会有样式隔离效果,id选择器、属性选择器、标签选择器不受样式隔离的影响
- 建议:在组件和引用组件的页面中建议使用class选择器,不要使用id、属性、标签选择器
- 修改组件的样式隔离选项
- 默认情况下,自定义组件的样式隔离特性能够防止组件内外样式互相干扰的问题。但有时,我们希望在外界能够控制组件内部的样式,此时,可以通过
stylelsolation修改组件的样式隔离选项,使用方法如下:
component({
options:{
stylelsolation: 'isolated'
}
})
{
"stylelsolation":"isolated"
}
| 属性值 | 默认值 | 描述 |
|---|
| isolated | 是 | 表示启用样式隔离,在自定义组件内外,使用class指定的样式将不会相互影响 |
| apply-shared | 否 | 表示页面wxss样式将影响到自定义组件,但自定义组件wxss中指定的样式不会影响到页面 |
| shared | 否 | 表示页面wxss样式将影响到自定义组件,自定义组件wxss中指定的样式也会影响到页面和其他设置了apply-shared或shared的自定义组件 |
properties、data、methods(组件.js)
Component({
properties: {
max:{
type:Number,
value:10
},
max:Number
},
data: {},
methods: {}
})
数据监听器
- 用于监听和响应任何属性和数据字段的变化,从而执行特定的操作
- 基本语法
Component({
observers:{
'字段A,字段B':function(字段A的新值,字段B的新值) {
}
}
})
- 监听对象属性的变化(支持监听对象中单个或多个属性的变化)
Component({
observers:{
'对象.属性A,对象.属性B':function(属性A的新值,属性B的新值) {
}
}
})
- 监听对象中所有属性的变化
Component({
observers:{
'对象.**':function(obj) {
}
}
})
纯数据字段
- 应用场景
- 某些data中的字段既不会展示在界面上,也变化传递给其他组件,仅仅在当前组件内部使用。带有这种特性的data字段适合被设置为纯数据字段
- 使用规则
- 在Component构造器的options节点中,指定pureDataPattern为一个正则表达式,字段名符合整个正则表达式的字段将成为纯数据字段
- 如:
Component({
options:{
pureDataPattern:'/^_/'
},
data:{
a:true,
_b:true,
}
})
组件生命周期函数
自定义组件自身的生命周期函数(推荐在lifetimes节点里面使用)
Component({
lifetimes:{
created(){
},
attached(){
},
ready(){
},
moved(){
},
detached(){
},
error(err){
}
}
})
自定义组件所在页面的生命周期函数
Component({
pageLifetimes:{
show:function(){
},
hide:function(){
},
resize:function(size){
}
}
})
组件插槽slot
单个插槽
- 组件
<view>
<view>组件内容</view>
<view>下面是插槽内容</view>
<slot></slot>
</view>
- 在页面上使用组件
<view>
<view>组件所在页面</view>
<tabar >
<view>插槽内容</view>
</tabar>
</view>
多个插槽
- 组件.js
Component({
options:{
multipleSlots:true
}
})
- 组件wxml
<view>
<view>组件内容</view>
<view>下面是插槽before内容</view>
<slot name="before"></slot>
<view>下面是插槽after内容</view>
<slot name="after"></slot>
</view>
- 在页面上使用组件
<view>
<view>组件所在页面</view>
<tabar >
<view slot="after">after插槽内容</view>
<view slot="before">before插槽内容</view>
</tabar>
</view>
父子组件之间的通信
属性绑定
- 用于父组件向子组件的字段属性设置数据,仅能设置JSON兼容的数据
- 子组件
<view>
<view>子组件</view>
<view>父组件传递的值:{{num}}</view>
</view>
Component({
properties:{
num:Number
}
})
- 父组件
<view>
<view>组件所在页面要传递给子组件的值:{{a}}</view>
<tabar num="{{a}}"></tabar>
</view>
Page({
data: {
a:1
}
})
事件绑定
- 用于子组件向父组件传递数据,可以传递任意数据
- 步骤
- 父组件(绑定和接收)
<view>
<view>组件所在页面</view>
<tabar num="{{a}}" bind:syncA="syncAFn"></tabar>
</view>
Page({
syncAFn(e){
console.log('自定义事件返回参数',e.detail)
}
})
- 子组件(触发)
Component({
methods:{
add(){
this.triggerEvent('syncA',1)
},
}
})
获取组件实例
- 父组件还可以通过this.selectComponent('id或class选择器')获取子组件实例对象
- 这样就可以直接访问子组件的任意数据和方法
- 用法
- 子组件
<view>
<view>子组件{{num}}</view>
</view>
Component({
data: {
num: 1
},
methods: {
add() {
this.setData({
num: this.data.num + 1
})
},
}
})
- 父组件
<view>
<view>组件所在页面</view>
<tabar class="tabar_"></tabar>
<button bindtap="setBar">+1</button>
</view>
Page({
setBar() {
const tabrDom = this.selectComponent('.tabar_')
tabrDom.add()
console.log(tabrDom.data.num)
}
})