组件一般放在 components 文件夹下
在页面的 json
配置文件中引用组件的方式,叫做局部引用
// 只可以在当前页面使用该组件
"usingComponents": {
"my-test": "组件路径"
}
<my-test>my-test>
在 app.json
全局配置文件中引用组件的方式,叫做全局引用
// 所有组件和页面都可以使用该组件
"usingComponents": {
"my-test": "组件路径"
}
component: true
属性在组件中存在样式隔离
app.wxss
中全局样式的 class 选择器对于组件存在样式隔离效果,id、属性、标签不受样式隔离的影响
可以通过配置去更改样式隔离的模式,这两种方式都可以配置
// 在组件的 js 文件中
Component({
options: {
styleIsolation: "isolated"
}
})
// 或在组件的 json 文件中
{
"styleIsolation": "isolated"
}
styleIsolation
的可选值
用法和 Vue 的一样
用法和 Vue 的一样
用法和 Vue 的 props 差不多,但是 this.properties === this.data
,都是可读可写的
用法和 Vue 的 watch 差不多
// 只不过只有函数式写法
observers: {
// 参数始终为最新的值
"data1, data2"(newData1, newData2) {
console.log("我被修改了", newData1, newData2);
}
}
概括:有些情况下,某些 data
中的字段(包括 setData
设置的字段)既不会展示在界面上,也不会传递给其他组件,仅仅在当前组件内部使用,可以用于提升页面更新性能
代码示例:
Component({
options: {
pureDataPattern: /^_/ // 指定所有 _ 开头的数据字段为纯数据字段
},
data: {
a: true, // 普通数据字段
_b: true, // 纯数据字段
},
methods: {
myMethod() {
this.data._b // 纯数据字段可以在 this.data 中获取
this.setData({
c: true, // 普通数据字段
_d: true, // 纯数据字段
})
}
}
})
<view wx:if="{{a}}"> 这行会被展示 view>
<view wx:if="{{_b}}"> 这行不会被展示 view>
用法和 Vue 的 mixin 类似
// 创建 behavior
module.exports = Behavior({
properties: { },
data: { },
methods: { }
})
// 使用 behavior
var myBehavior = require('my-behavior')
Component({
behaviors: [myBehavior]
})
Component({
// 最好是写在 lifetimes 中
lifetimes: {
attached: function() {
// 在组件实例进入页面节点树时执行
},
detached: function() {
// 在组件实例被从页面节点树移除时执行
},
},
// 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容
attached: function() {
// 在组件实例进入页面节点树时执行
},
detached: function() {
// 在组件实例被从页面节点树移除时执行
},
// ...
})
生命周期 | 参数 | 描述 | 最低版本 |
---|---|---|---|
created | 无 | 实例刚刚被创建时执行 | 1.6.3 |
attached | 无 | 实例进入页面节点树时执行 | 1.6.3 |
ready | 无 | 视图层布局完成后执行 | 1.6.3 |
moved | 无 | 实例被移动到节点树另一个位置时执行 | 1.6.3 |
detached | 无 | 实例被从页面节点树移除时执行 | 1.6.3 |
error | Error |
组件方法抛出错误 | 2.4.1 |
还有一些特殊的生命周期,当组件所在页面发生对应的变化时,会在对应生命周期中,触发对应的生命周期函数
Component({
pageLifetimes: {
show: function() {
// 页面被展示
},
hide: function() {
// 页面被隐藏
},
resize: function(size) {
// 页面尺寸变化
}
}
})
// 这里插槽的用法和 Vue 的一模一样
// 只不过多个插槽,需要在组件中去开启配置
Component({
options: {
multipleSlots: true,
}
})
用法和 Vue 的 props 一模一样
<myTest msg="我是要传入的数据">myTest>
// 子组件中
Component({
// 我接收到了数据
properties: {
msg: String
},
})
用法和 Vue 的自定义事件相似
页面/父组件内容
<myTest bind:myChangeCount="changeCount">myTest>
changeCount(e) {
// 子组件传过来的数据
console.log(e.detail)
}
子组件内容
<button bindtap="btn">
点击向父组件传入数据
button>
methods: {
btn() {
this.triggerEvent("myChangeCount", {
// 传入的数据
})
}
}
用法和 Vue 的 refs 相似
<myTest class="test">myTest>
// 通过 css 选择器,获取组件实例,可以拿到组件任意的属性和方法
this.selectComponent(".test")