【微信小程序】父子组件的创建、通信与事件触发;组件生命周期

news2024/11/19 1:43:51

前言

关于微信小程序中父子组件的创建、传值,以及涉及到的组件生命周期。

使用组件的优点

组件的使用可以提高开发效率确保功能在各个页面上的应用和修改的一致性
例如,对于一些重复的功能,比如顶部导航栏或评论区,将其提炼成组件后,我们只需要在不同的页面中引用该组件,而无需重复编写相同的代码。这样能够减少代码量,提高代码的可维护性。
当需要修改这些功能时,只需在组件定义的地方进行修改,即可实现所有引用该组件的页面都得到更新,避免了在每个页面单独修改的麻烦。

正文

创建与基本使用

1.1 创建组件
组件一般创建在components文件夹下。
首先在components中新建一个文件夹,在此文件夹上右击选择新建component选项(也可以自己新建page,再将对应生成的四个子文件移入components中新建的组件文件夹中),建好的目录结构如下
在这里插入图片描述
1.2 使用组件->在父页面或者父组件的json文件里注册子组件

{
  "usingComponents": {
    "topNav": "/components/topNav/topnav"
  }
}

1.3 在父页面或者父组件上应用组件

<!-- 父组件中 -->
<view class="container">
    <!-- 顶部菜单 -->
    <topNav></topNav>
</view>

相互传值或调用方法

上面的例子只是基础的用法,不涉及到父子组件之间的通信。
父子组件之间的通信包括:
父组件传值给子组件、子组件传值给父组件、父组件调用子组件的方法、子组件调用父组件的方法。

1.父组件传值给子组件

这个是最简单也最常用的,主要就是注意子组件中使用properties去接收就好了

  1. 父组件传值:
  • childValue 是子组件用来接收父组件传递的值
  • parentValue 是父组件传递给子组件的值。
// 父组件.wxml
<text>这是父组件Component</text>
<view>
  <ChildComponent childValue="{{parentValue}}"></ChildComponent>
</view>


// 父组件.js
Page({
	data: { parentValue : 'Parent'}
})
  1. 子组件接收与使用:
// 子组件.js
// 在子组件中声明要接收的数据类型
Component({
	properties: {
		childValue: String,  // String代表接收的参数类型
	}
})

//使用父组件传递过来的数据:

// 子组件.wxml
<text>我是子组件ChildComponent</text>
<view>父组件传递过来的数据:{{childValue}}</view>

这样子组件就可以接收到父组件传递过来的值。

2.子组件传值给父组件

这个相对复杂一些。
使用 triggerEvent() 方法,用法类似于 Vue 中的 $emit(),关键代码:
this.triggerEvent(‘myevent’, value) myevent是对应父组件中接收的方法

  1. 给子组件自定义一个事件,并且传值
// 子组件.wxml
<view class="childContent">
  <text>我是子组件ChildComponent</text>
  <button type="primary" bindtap="handleTap">给父组件传值</button>
</view>

// 子组件.js
methods: {
	handleTap() {
		// 定义要传递的数据
		let value = "ChildValue"
		// 触发绑定事件, myevent为绑定的父组件中的事件名
		this.triggerEvent('myevent', value)
	},
}
  1. 为父组件中引入的子组件绑定事件
// 父组件.wxml
<view class="parentContent">
  <text>这是父组件Component</text>
  <view>
  	// 绑定子组件中`triggerEvent()`对应的事件方法
    <ChildComponent bindmyevent="myevent"></ChildComponent>
  </view>
  <view>父组件:子组件传递过来的数据 {{ParentValue}}</view>
</view>

//接收子组件传递过来的内容
// 父组件.js
methods: {
	myevent(e) {
		// 这里通过 e 就可以接收子组件传过来的内容了
		console.log(e.detail)
      	this.setData({
        	ParentValue: e.detail
		})
	}
}

3.父组件调用子组件方法

通过给子组件绑定 id 或 class 选择器,在父组件里调用 this.selectComponent 获取子组件的实例对象,就可以调用子组件中的方法。

其实就是获取到了子组件的实例对象,那可以调用它的方法,其实也可以获取它的属性了。

// 子组件.js
methods: {
    Foo() {
      console.log("子组件的方法");
    }
  }

// 父组件.wxml
<view class="parentContent">
  <text>这是父组件Component</text>
  <view>
    <ChildComponent class="ChildEvent"></ChildComponent>
  </view>
  <button type="primary" bindtap="ChildFoo">父组件的按钮</button>
</view>

// 父组件.js
methods: {
	// 父组件点击事件,调用子组件方法
    ChildFoo() {
    	// 获取子组件的实例,可以提前获取
      	let Child = this.selectComponent('.ChildEvent');
      	// 调用子组件中定义的方法Foo()
      	Child.Foo();
    }
}

4. 子组件调用父组件方法

子组件通过 this.triggerEvent() 来调用父组件的方法。

在父组件引入的子组件上添加事件与方法名:
ChildFun是子组件中的方法名,ParentFun是父组件中的方法名;
我们通过子组件的ChildFun来调用父组件的ParentFun。

// 父组件.wxml
<view>
	<ChildComponent bind:ChildFun="ParentFun"></ChildComponent>
</view>

在父组件中定义方法:
// 父组件.js
methods: {
	ParentFun() {
		console.log('父组件的方法');
	}
}

在子组件中添加了一个点击事件,当用户触发点击事件clickParent()的时候,会执行子组件调用父组件:

// 子组件.js
methods: {
    clickParent() {
      this.triggerEvent('ChildFun' , )
    }
}

点击后,子组件就会执行在父组件中的ParentFun()。

注意:this.triggerEvent(‘父组件中子组件上绑定的事件名’ , 参数(可选))
后面的参数根据父组件的方法进行填写。
如果父组件没有接收参数, 则空着不写,如果接收一个参数就写一个,两个参数传入两个值。

总结

简单总结:

  • 父组件传值给子组件:子组件properties接收
  • 子组件传值给父组件:子组件this.triggerEvent()激发传给父组件
  • 父组件调用子组件的方法:父组件使用this.selectComponent 获取子组件的实例对象
  • 子组件调用父组件的方法:子组件this.triggerEvent()激发传给父组件
    可以看出来如果是子组件要想与父组件通信,无论是传参还是调用方法,都可以通过this.triggerEvent()实现。
    传参也只是调用方法的一种特殊情况而已。主要看父组件中的调用的方法是如何使用这个参数的。

组件生命周期

具体可查看微信小程序官网内容: 小程序官方组件生命周期

组件的生命周期写法:

Component({
  lifetimes: {
    attached: function() {
      // 在组件实例进入页面节点树时执行
    },
    detached: function() {
      // 在组件实例被从页面节点树移除时执行
    },
  },
  // 以下是旧式的定义方式,可以保持对 <2.2.3 版本基础库的兼容
  attached: function() {
    // 在组件实例进入页面节点树时执行
  },
  detached: function() {
    // 在组件实例被从页面节点树移除时执行
  },
  // ...
})

关于执行的顺序,可以参考微信小程序——组件生命周期这篇文章的解释。

总结:

  • 小程序在挂载、初始化的时候,是从内到外(从组件到page),在卸载的时候也是从内到外的
  • 页面回退时,可以触发 pageLifetimes 的 show,这个特性可用来更新组件

组件所在页面的生命周期

Component({
  pageLifetimes: {
    show: function() {
      // 页面被展示
    },
    hide: function() {
      // 页面被隐藏
    },
    resize: function(size) {
      // 页面尺寸变化
    }
  }
})

参考

图片与创建父子组件部分内容参考微信小程序公共组件封装,父子组件之间相互传值和相互调用方法
父子组件传值通信与事件触发主要参考:微信小程序之父子组件传值通信与事件触发(最全实用总结)

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

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

相关文章

MongoDB基础知识点

MongoDB基础知识点 1.MongoDB简介1.1基本信息1.2作用1.3下载 2.MongoDB安装1.Ubuntu22.042.Windows(非msi) 3.MongoDB基本操作1.基本概念2.MongoDB文件增删改查(CURD)1.插入数据2.查询数据3.修改数据4.删除数据5.删除字段 4.MongoDB实战管理系统数据库设计1.设计数据库2.Mongod…

c++ folly::baton

Baton folly::Baton 是 Facebook 开源的一个同步原语&#xff0c;它提供了一种简单而灵活的方式来进行线程间的同步。它属于 Folly 库&#xff0c;是 C 编程语言的一个组件。 Baton 通常用作线程间同步、等待、通知的标识符号&#xff0c;常用姿势是&#xff0c;一些线程调用…

正中优配:红筹股是啥意思?

随着我国经济的高速开展&#xff0c;越来越多的人开始参加到股票出资中。其中&#xff0c;红筹股作为一种特别类型的股票&#xff0c;备受一些出资者的关注&#xff0c;但对于一般出资者来说&#xff0c;红筹股详细含义还不是特别清楚。本文将从多个角度探讨红筹股的含义、特征…

分库分表知识大全及Sharding-JDBC实践

文章目录 一、为什么要分库分表1.1 什么是分库1.2 什么是分表1.3 为什么要分库1.3.1 磁盘存储1.3.2 并发连接支撑 1.4 为什么要分表 二、分库分表解决方案2.1 垂直&#xff08;纵向&#xff09;切分2.1.1 垂直切分优点2.1.2 垂直切分缺点 2.2 水平&#xff08;横向&#xff09;…

了解NAT

局域网内的终端是如何共用一个wan口来上网的&#xff1f; 主要通过NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;协议来实现的 NAT是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地…

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎&#xff0c;它是小型且经过时间考验的数据库引擎&#xff0c;sqflite软件包提供了许多函数&#xff0c;可以有效地与SQLite数据库一起使用&#xff0c;它提供了操作SQLite数据…

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…

nepctf2023 部分web复现

目录 <1> EZJAVA_CHECKIN(shiro550) <2> 独步天下-转生成为镜花水月中的王者(环境变量提权) <3> 独步天下-破除虚妄_探见真实(Venom代理&ping%0a绕过rce&c文件描述符未关闭连接父进程修改文件权限) <4> 独步天下-破除试炼_加冕成王(tp6rceu…

STM32F103C8T6引脚图及引脚功能说明

内容部分引用STM32F103C8T6引脚图_karwen2020的博客-CSDN博客_stm32引脚图

1688采集商品主图,价格,规格接口

采集1688商品主图&#xff0c;价格接口&#xff0c;点击测试 在如今的电商时代&#xff0c;越来越多的人开始选择在1688平台上寻找商品&#xff0c;而采集软件的方式也有很多种&#xff0c;但是在市面上&#xff0c;各种采集软件琳琅满目&#xff0c;令人眼花缭乱&#xff0c;…

【玩玩Vue】使用el-menu作为菜单时,通过一二级路由控制菜单高亮

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、Vue路由二、路由一级控制高亮&#xff08;常用&#xff09;1.vue中路由文件2.网址样式3.Vue文件4.$route的内容 三、路由二级控制高亮…

基于白鲸算法优化的BP神经网络(预测应用) - 附代码

基于白鲸算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于白鲸算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.白鲸优化BP神经网络2.1 BP神经网络参数设置2.2 白鲸算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

Multisim14.0仿真(四)方波发生器

一、仿真原理图&#xff1a; 二、仿真效果&#xff1a;

C语言 语法积累

参考博文&#xff1a; c语言中int默认是有符号还是无符号,C语言迷题&#xff1a;有符号数与无符号数的问题_旋斡勃人的博客-CSDN博客前些天偶然看到了一个收集C语言迷题的网站&#xff0c;很是感兴趣。本人对C/C语言本身很是感兴趣&#xff0c;曾经做过几年相应的开发&#xf…

「网页开发|前端开发|Vue」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转

本文主要介绍如何使用路由控制来实现将一个单页面网站扩展成多页面网站&#xff0c;包括页面扩展的逻辑&#xff0c;vue的官方路由vue-router的基本用法以及扩展用法 文章目录 本系列前文传送门一、场景说明二、基本的页面扩展页面扩展是在扩什么创建新页面的代码&#xff0c;…

基于BES2300YP 蓝牙耳机在线EQ调整功能设计

+他V hezkz17进数字音频系统研究开发交流答疑群(课题组) 1 BES SDK支持EQ 在运行中修改 </

Python 画图:饼图,箱线图

饼图 饼图&#xff08;pie char&#xff09;是一个划分为几个扇形的圆形统计图表&#xff0c;一般用于描述频率或百分比之间的相对关系。在饼图中&#xff0c;每个扇区的弧长&#xff08;以及圆心角和面积&#xff09;的大小与其所表示的数量呈固定比例。画饼图使用 pyplot 中…

C语言入门 Day_11 判断的嵌套

目录 前言 1.判断的嵌套 2.switch判断 3.易错点 4.思维导图 前言 之前我们都只是面临的简单判断&#xff0c;也就是面对的是两三种不同的判断条件&#xff0c;执行两三种不同的代码分支。 但是让我们遇到更复杂的情况&#xff0c;需要进行更复杂的判断的时候。就需要使用…

编程题四大算法思想(三)——贪心法:找零问题、背包问题、任务调度问题

文章目录 贪心法找零问题&#xff08;change-making problem&#xff09;贪心算法要求基本思想适合求解问题的特征 背包问题0/1背包问题0/1背包问题——贪心法 分数背包问题 任务调度问题 贪心法 我在当前情况下&#xff0c;我把我做到最好。我也不管全局如何&#xff0c;整体如…

计算机图形软件(三)6-4 使用GLUT进行显示窗口管理

使用GLUT进行显示窗口管理 我们从使用简化的、最少的操作来显示一个图开始。使用 OpenGL 实用库的第一步是初始化GLUT。该初始化函数也能处理任何命令行变量&#xff0c;但不需要在第一个示例程序中使用参数。完成GLUT初始化的语句是 glutInit (&argc&#xff0c;argv); …