【微信小程序】生命周期,插槽和组件间通信

news2025/1/16 15:49:57

在这里插入图片描述

一、组件的生命周期

1.1 组件全部的生命周期函数

小程序组件可用的全部生命周期如下表所示

生命周期函数参数描述说明
created在组件实例刚刚被创建时执行
attached在组件实例进入页面节点树时执行
ready在组件在视图层布局完成后执行
moved在组件实例被移动到节点树另一个位置时执行
detached在组件实例被从页面节点树移除时执行
error ObjectError每当组件方法抛出错误时执行

1.2 组件主要的生命周期函数

在小程序组件中,最重要的生命周期函数有 3 个,分别是 created 、 attached 、 detached 。它们各自的特点如下:

  1. 组件实例 刚被创建 好的时候,created 生命周期函数会被触发 此时还不能调用 setData通常在这个生命周期函数中,只应该用于给组件的 this 添加一些自定义的属性字段

  2. 在组件 完全初始化完毕、进入页面节点树后 , attached 生命周期函数会被触发此时, this.data 已被初始化完毕这个生命周期很有用,绝大多数初始化的工作可以在这个时机进行(例如发请求获取初始数据)

  3. 在组件 离开页面节点树后 , detached 生命周期函数会被触发退出一个页面时,会触发页面内每个自定义组件的 detached 生命周期函数此时适合做一些清理性质的工作

/**
* 组件的初始数据
*/
data: {
_rgb:{ // rgb 的颜色值对象
r:0,
g:0,
b:
},
fullColor: '0, 0, 0' //根据rgb对象的三个属性,动态计算fullColor 的值
},
})

生命周期函数 参数 描述
show 无 组件所在的页面被展示时执行
hide 无 组件所在的页面被隐藏时执行
resize Object Size 组件所在的页面尺寸变化时执行

1.3 lifetimes 节点

在小程序组件中,生命周期函数可以直接定义在 Component 构造器的第一级参数中,可以在 lifetimes字段内进行声明( 这是推荐的方式,其优先级最高 )。示例代码如下:

二、组件所在页面的生命周期

2.1 什么是组件所在页面的生命周期

有时, 自定义组件的行为依赖于页面状态的变化 ,此时就需要用到 组件所在页面的生命周期 。例如:每 当触发页面的 show 生命周期函数的时候,我们希望能够重新生成一个随机的 RGB 颜色值。在自定义组件中,组件所在页面的生命周期函数有如下 3 个,分别是:

// components/test3/test3.js
Component({
//旧式的定义方式
created() {
console.log('created'); //在组建实例进入页面节点树时执行
},
attached(){
console.log('attached'); //在组件实例被从页面节点树移除时执行
},
// 推荐用法
lifetimes:{
created() {
console.log('created~'); //在组建实例进入页面节点树时执行
},
attached(){
console.log('attached~');//在组件实例被从页面节点树移除时执行
},
}
})

2.2 pageLifetimes 节点

组件所在页面的生命周期函数,需要定义在 pageLifetimes 节点中,示例代码如下

2.3 生成随机的 RGB 颜色值

// components/test3/test3.js
Component({
pageLifetimes:{
show(){
console.log('show');
},
hide(){
console.log('hide');
},
resize(){
console.log('resize');
}
}

})
// components/test3/test3.js
Component({
/**
* 组件的方法列表
*/
methods: {
changeR(){ //修改 rgb 对象上 r属性的值
this.setData({
'_rgb.r':this.data._rgb.r + 5 > 255? 255 : this.data._rgb.r
+ 5

三、插槽

3.1 什么是插槽

在自定义组件的 wxml 结构中,可以提供一个 节点(插槽),用于 承载组件使用者提供的 wxml结构。

changeG(){ // 修改rgb对象上r属性的值
this.setData({
'_rgb.g':this.data._rgb.g + 5 >255 ?255 :this.data._rgb.g +
})
},
changeB(){//修改 rgb对象上b属性的值
this.setData({
'_rgb.b':this.data._rgb.b + 5 > 255? 255 :this.data._rgb.b
+
})
},
_randomColor() {
this.setData({
_rgb:{
r: Math.floor(Math.random() * 256),
g: Math.floor(Math.random() * 256),
b: Math.floor(Math.random() * 256)
}
})
}
},
pageLifetimes:{
show(){
console.log('show');
this._randomColor()
}
}
})

3.2 单个插槽

在小程序中,默认每个自定义组件中只允许使用一个 进行占位,这种个数上的限制叫做单个插槽。

在components 中新建一个test4文件夹 在文件中新建component

在app.json usingComponents中 添加组件目录

"usingComponents": {
"my-test1":"/components/test/test",
"my-test2":"/components/test2/test2",
"my-test3":"/components/test3/test3",
"my-test4":"/components/test4/test4"
},

在组件.wxml中定义结构

<!--components/test4/test4.wxml-->
<view>
<view>
这里是组件的内部结构
</view>
<slot></slot>
</view>

在页面的.wxml定义结构:

<!--pages/home/home.wxml-->
<my-test4>
<view>
这是通过插槽填充的内容
</view></my-test4>

3.3 定义多个插槽

可以在组件的 .wxml 中使用多个 标签,以不同的 name 来区分不同的插槽。在组件.wxml中 加上一个slot标签 为每个slot标签定义name属性值

// components/test4/test4.js
Component({
options: {
multipleSlots: true //在组件定义时选型中启用多slot支持
},
properties: {/* ... */},
data: {/* ... */},
methods: {/* ... */ }
})
<!--components/test4/test4.wxml-->
<view>
<slot name="before"></slot>
<view> 这里是组件的内部结构 </view>
<slot name="after"></slot>
</view>

四、父子组件之间的通信

4.1 父子组件之间通信的 3 种方式

1. 属性绑定

用于父组件向子组件的指定属性设置数据,仅能设置 JSON 兼容的数据

2. 事件绑定

用于子组件向父组件传递数据,可以传递任意数据

3. 获取组件实例

父组件还可以通过 this.selectComponent() 获取子组件实例对象可以直接访问子组件的任意数据和方法

4.2 属性绑定

属性绑定用于实现父向子传值,而且只能传递普通类型的数据,无法将方法传递给子组件
在home.js中定义数据

<my-test4>
<!-- 这部分内容将被放置在组件 <slot name="after">的位置上 -->
<view slot="after">这是通过插槽填充的内容</view>
<!-- 这部分内容将被放置在组件 <slot name="before">的位置上 -->
<view slot="before">~~~~~~~</view>
</my-test4>
// 父组件的data节点
data: {
count:0
}
在home.js中定义结构

在components 中新建一个test5文件夹 在文件中新建component

在app.json usingComponents中 添加组件目录:

在home首页中使用一下这个组件

子组件在 properties 节点中声明对应的属性,并使用实现子组件按钮自增加一的效果

// 父组件的.wxml结构
<my-test3 count="{{count}}"> </my-test3>
<view>-----</view>
<view>父组件中,count值为:{{count}}</view>
"usingComponents": {
"my-test1":"/components/test/test",
"my-test2":"/components/test2/test2",
"my-test3":"/components/test3/test3",
"my-test4":"/components/test4/test4",
"my-test5":"/components/test5/test5"
},
<my-test5 count="{{count}}"></my-test5>
<view>~~~~~~~~~~~</view>
<view>父组件中,count值是:{{count}}</view>
// components/test5/test5.js
Component({
/**
* 组件的属性列表
*/
properties: {
count:Number

4.3 事件绑定

事件绑定 用于实现子 向父传值 ,可以传递任何类型的数据。使用步骤如下:

步骤 1 :在父组件的 js 中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件。

  1. 在 父组件 的 js 中,定义一个函数,这个函数 即将 通过自定义事件的形式,传递给子组件

  2. 在 父组件 的 wxml 中,通过自定义事件的形式,将步骤 1 中定义的函数引用,传递给子组件

  3. 在子组件的 js 中,通过调用 this.triggerEvent (‘自定义事件名称’, { /* 参数对象 */ }) ,将数据发送到父组件

  4. 在 父组件 的 js 中,通过 e.detail 获取到子组件传递过来的数据

步骤 2 :在 父组件 的 wxml 中(home.wxml),通过 自定义事件 的形式,将步骤 1 中定义的函数引用,

传递给子组件。

使用bind:自定义事件名称 (推荐:结构清晰)

或在bind后面直接写上自定义事件名称

步骤 3 :在子组件的 js 中,通过调用 this.triggerEvent(‘自定义事件名称’, { /* 参数对象 */ }) ,将数据发子组件的.wxml结构(test5.wxml)

子组件的js代码

//在父组件中定义sysncCount方法
// 将来,这个方法会被传递给子组件,供子组件进行调用
Page({
/**
* 页面的初始数据
*/
data: {
count:0
},
sysncCount(){
console.log('sysncCount');
},
 <my-test5 count="{{count}}" bind:sync="sysncCount"></my-test5>
<view>子组件中,count值是:{{count}}</view>
<button type="primary" bindtap="addCount">+1</button>
// components/test5/test5.js
Component({
methods: {
addCount(){
this.setData({
count:this.properties.count + 1
})
// 触发自定义事件,将数值同步给父组件
this.triggerEvent('sync',{value:this.properties.count})
}
}
})

在父组件的 js 中,通过 e.detail 获取到子组件传递过来的数据。

4.4 获取组件实例

可在父组件里调用 this.selectComponent(“id或class选择器”) ,获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器,例如 this.selectComponent(“.my- component”)。
home.wxml定义结构

sysncCount(e){
// console.log('sysncCount');
// console.log(e);
// console.log(e.detail.value);
this.setData({
count: e.detail.value
})
},
<my-test5 count="{{count}}" bind:sync="sysncCount" class="customA" id='cA'>
</my-test5>
<view>~~~~~~~~~~~</view>
<view>父组件中,count值是:{{count}}</view>
<button bindtap="getChild">获取子组件的实例对象</button>
// pages/home/home.js
Page({
/**
* 页面的初始数据
*/
data: {
count:0
},
sysncCount(e){
// console.log('sysncCount');
// console.log(e);
// console.log(e.detail.value);
this.setData({
count: e.detail.value
})
},
getChild(){
//切记不能传递标签选择器否自返回的是null
const child = this.selectComponent('.customA')
// console.log(child);
// 调用子组件的 setData方法
// child.setData({
// count:child.properties.count +1 //注意此处只能用child不能用this
// })
child.addCount()//调用子组件的addCount方法
},
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战案例|聚焦攻击面管理,腾讯安全威胁情报守护头部券商资产安全

金融“活水”润泽千行百业&#xff0c;对金融客户来说&#xff0c;由于业务场景存在特殊性和复杂性&#xff0c;网络安全必然是一场“持久战”。如何在事前做好安全部署&#xff0c;构建威胁情报分析的防护体系至为重要&#xff0c;实现更为精准、高效的动态防御。 客户名片 …

Flink系列-8、Flink DataStream的简介和API开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 流处理的介…

开放式耳机真的比封闭式强很多吗?推荐几款主流的开放式耳机

​开放式耳机&#xff0c;顾名思义&#xff0c;就是通过骨头振动来传导声音的耳机。相比于传统耳机&#xff0c;它的声音传输更加开放&#xff0c;不会对耳膜造成压迫感&#xff0c;也不会对耳膜旁的内毛细胞造成损害。因此开放式耳机既是运动蓝牙耳机&#xff0c;又是音乐蓝牙…

MAC 通过 brew安装 redis 并且设置开机启动

一.安装 mysql 1.安装 mysql 1.安装 redis brew install redis2.查看 redis 安装目录 brew list redis 记住安装目录 3.启动 redis 进入到安装目录下面 cd /opt/homebrew/Cellar/redis/7.0.11 cd bin ./redis-server 二.设置开机启动 上面安装好之后,redis 虽然能正常…

个性化的客户服务策略(二)

继续上次的策略&#xff0c;今天我们继续分享接下来的几点提供更加个性化的客户服务的方法。 6&#xff09;利用社交媒体发挥自己的优势 请求进入社交媒体渠道原因有很多。例如&#xff0c;愤怒的客户可能会对帖子发送直接消息或评论&#xff0c;因为它感觉更直接&#xff0c;…

【刷题之路Ⅱ】LeetCode 3381.搜索旋转排序数组ⅠⅡ

【刷题之路Ⅱ】LeetCode 33&81.搜索旋转排序数组Ⅰ&Ⅱ 一、题目描述二、解题1、方法1——暴力法1.1、思路分析1.2、代码实现 2、方法2——二分法2.1、思路分析2.2、代码实现2.3、升级到81题2.3.1、改进思路分析2.3.1、改进代码实现 3、改进二分法3.1、思路分析3.2、代码…

STM32F407ZIT6 国产替代者NS32F407ZIT6 NS32F407ZGT6 软硬件通用 无需修改任何程序代码

NS32F407ZIT6 NS32F407ZGT6 器件基于高性能的 ARM Cortex-M4 32位 RISC 内核&#xff0c;工作频率高达 168MHz。 Cortex-M4 内核带有单精度浮点运算单元(FPU)&#xff0c;支持所有 ARM 单精度数据处理指令和数据类型。它还 具有一组DSP指令和提高应用安全性的一个存储器保护…

Windows环境下调试DAB-DETR与Deformable-DETR

先前都是在服务器上运行DETR的相关程序&#xff0c;服务器使用的是Linux&#xff0c;所以运行较为简单&#xff0c;但如果想要简单的debug的话就没必要使用服务器了&#xff0c;今天便来在Winodws环境下调试DETR类项目&#xff0c;这里以Deformable-DETR与DAB-DETR为例。 首先是…

深度测评全新大模型「天工」,这些AI体验太香了

ChatGPT火了后&#xff0c;很多人都在关注“国产ChatGPT”的名号究竟花落谁家。 事实上&#xff0c;名号不重要&#xff0c;体验才是王道。ChatGPT能够火成“史上增长最快的消费者应用”&#xff0c;关键在于把体验提升到了新层次。毕竟对于用户来说&#xff0c;并不清楚产品背…

【WSN定位】加权质心定位算法-Matlab代码

文章目录 1. 质心定位算法2. 加权质心定位算法3. 部分代码展示4. 效果图展示5. 资源获取说明 摘要&#xff1a;质心定位算法(Centroid Algorithm)是 Nirupama Bulusu等提出的一种无需测距的粗精度定位算法。质心算法的基本思路&#xff1a;利用未知节点通信范围内的所有锚节点进…

树莓派下编译 PyMiniRacer

文: fasiondog 因需要在树莓派&#xff08;及其其他各类派&#xff09;下使用 akshare&#xff0c;但 akshare 的依赖库 PyMiniRacer 缺少 arm64 架构的包&#xff08;该包已经不再维护&#xff09;&#xff0c;故在此记录下在 linux arm64 架构下编译 PyMiniRacer 的过程。有…

【微信小程序】 权限接口梳理以及代码实现

​ 1、权限接口说明 官方权限说明   部分接口需要经过用户授权统一才能调用。我们把这些接口按使用范围分成多个scope&#xff0c;用户选择对scope进行授权&#xff0c;当授权给一个scope之后&#xff0c;其对应的所有接口都可以直接使用。 此类接口调用时&#xff1a; 如…

小红书报告:2023美妆个护白皮书解读

导语 面对风云变幻的市场&#xff0c;消费行业始终是增长的重要引擎之一&#xff0c;其中美妆个护行业在过去六年里&#xff08;2016-2022年&#xff09;仍保持高增速与消费潜力 。 新的一年&#xff0c;市场呈现什么新变化&#xff0c;品牌又有哪些新动作&#xff1f;本期为…

20-HTML

目录 1.概念 2.创建HTML页面 3.运行HTML程序 4.HTML结构 4.1.HTML文件基本结构 4.2.标签层次结构 PS&#xff1a;开发者工具简单介绍 PS&#xff1a;快速生成代码框架&#xff1a; 5.HTML常见标签 5.1.注释标签 5.2.标题标签&#xff1a;h1 - h6 5.3.段落标签&…

Doris(8):数据导入(Load)之Insert Into

Insert Into 语句的使用方式和 MySQL 等数据库中 Insert Into 语句的使用方式类似。但在 Doris 中&#xff0c;所有的数据写入都是一个独立的导入作业。所以这里将 Insert Into 也作为一种导入方式介绍。 主要的 Insert Into 命令包含以下两种&#xff1b; INSERT INTO tbl S…

PX4控制云台的两种方式

1、配置MNT_MODE_IN参数后重启飞控&#xff0c;释放出mount的设置参数 控制信号输入为RC 则接收机必须连接对应的通道至AUX辅助通道&#xff0c;并通过MNT_MAN_*参数设置pitch/roll/yaw对应的AUX通道 &#xff08;遥控器摇杆 → 接收机通道输出 → 飞控AUX通道输入 → AUX通道…

Spring IOC 入门简介【自定义容器实例】

目录 前言 Spring简介 Spring体系结构 一、IOC控制反转思想 二、IOC自定义对象容器 1. 创建实体类&#xff0c;Dao接口&#xff0c;实现类 2. 创建配置文件bean.properties 3. 创建容器管理类 4. 创建StudentService类 5. 测试方法 6. 测试结果 前言 Spring简介 Spr…

Android 详解基本布局以及ListView和RecyclerView

前言 一个丰富的界面有很多个控件组成&#xff0c;那么就需要布局来实现控件有条不紊的摆放。 一 LinearLayout 线性布局 LinearLayout 又称作线性布局&#xff0c;是一种常用的布局。有横向和竖向两个方向。 通过下面的属性进行设置 android:orientation"vertical"…

【科研】Michaelis–Menten 曲线(米氏曲线)中反应速率的计算

参考文献&#xff1a;Standardized assays for determining the catalytic activity and kinetics of peroxidase-like nanozymes | Nature Protocols SCI-Hub链接&#xff1a; https://sci-hub.se/10.1038/s41596-018-0001-1 科研需要&#xff0c;需要绘制所制备纳米酶的Mi…

亿发软件:中小企业定制一体化管理解决方案,全面提升数据价值

亿发软件&#xff1a;中小企业定制一体化管理解决方案&#xff0c;全面提升数据价值 一体化信息管理系统是为中小企业提供简化运营、提高效率和生产力的工具。随着经济的快速发展&#xff0c;企业细分管理的多样化需求显著增加。很多企业都在为找不到适合自己的一体化信息管理…