右键新建Component,自动生成四个文件
局部引用:
在页面的.json
文件中的usingComponents
对象引用组件
{
"usingComponents": {
"my-test1":"/components/test/test"
}
}
在wxml中使用组件
<my-test1>my-test1>
全局引用
在app.json
中的usingComponents
对象引用组件
从文件组成来看,二者相同,但是具体内容会有不同之处
.json
文件中需要声明"component":true
属性.js
文件中调用的是Component()
函数methods
节点中默认情况下自定义组件的样式只对当前组件生效,不会影响到组件之外的结构
注意点:
默认情况下,自定义组件具有样式隔离的特性,但有时我们确实需要对组件内部的样式进行控制
修改方式有两种
.js
文件中新增如下配置stylesolation
Component({
options:{
stylesolation:'isolated'
}
})
.json
文件新增stylesolation
属性节点stylesolation的可选值
同vue
同vue的props
properties:{
// 完整定义
max:{
type: Number,
value: 10
},
// 简化定义
max: Number
}
注意:在小程序中,properties和data中的数据都是可读可写的
使用setData可以修改properties的值
同vue的watch
observers:{
'字段A,字段B':function(newA,newB){
// do something
}
}
监听对象中的属性
触发对象监听器的3种情况,使用setData
// 指定监听
observers:{
'obj.A,obj.B':function(newA,newB){
// do something
}
}
// 监听所有属性
observers:{
'obj.**':function(newObj){
// do something
}
}
只存在于业务逻辑中,不需要渲染到页面的数据
在Component
构造器的options节点中,指定pureDataPattern
为一个正则表达式,字段名符合这个正则表达式的将成为纯数据字段
options:{
// 定义纯数据字段类型
// 下划线开头的data就是纯数据字段
pureDataPattern:/^_/
},
小程序中定义生命周期函数有两种方式
lifetimes:{
attached(){},
detached(){}
}
attached(){},
detached(){}
当页面中的组件想在页面的某些生命周期进行操作,则需要用到组件在页面的生命周期函数
如何使用这些生命周期函数呢,还是在组件中
pageLifetimes:{
show:function(){}, // 页面被展示
hide:function(){}, // 页面被隐藏
resize:function(){} // 页面尺寸变化
}
小程序默认自定义组件中只能使用一个
插槽
需要在.js
文件中启用多插槽
Component({
options:{
multipleSlots:true
}
})
定义方法和vue相同,用name指明
<slot name="before">slot>
<slot name="after">slot>
使用
<view slot="before">插槽填充内容view>
// 子组件 this.triggerEvent == this.$emit
this.triggerEvent('事件名',{参数对象})
<my-test bind:事件名="syncCount">my-test>
// 父组件 e.detail接收参数
syncCount(e){
console.log(e.detail);
}
this.selectComponent("id或class选择器")
获取子组件实例
<my-test bind:sync="syncCount" id="cA">my-test>
<button bindtap="getChild">获取子组件实例button>
// 父组件
getChild(){
const child = this.selectComponent('#cA')
// child中包含子组件的所有信息
console.log(child);
}
实现组件间的代码共享,类似于mixins混入
在项目根目录创建behavior文件夹用于保存,直接创建js文件
调用Behavior(Object object)
方法创建并共享出去
module.exports = Behavior({
data:{
userName: 'zs'
},
properties:{},
methods:{}
})
const myBehavior = require('../../behaviors/my-behaviors')
Component({
behaviors:[myBehavior],
})
之后就可以像在普通js文件一样直接使用behaviors中的数据
总的来说就是,以用户最舒服的方式来解决冲突