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

这篇具有很好参考价值的文章主要介绍了【微信小程序】父子组件的创建、通信与事件触发;组件生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

使用组件的优点

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

正文

创建与基本使用

1.1 创建组件
组件一般创建在components文件夹下。
首先在components中新建一个文件夹,在此文件夹上右击选择新建component选项(也可以自己新建page,再将对应生成的四个子文件移入components中新建的组件文件夹中),建好的目录结构如下
<component ></component> 子级触发事件,微信小程序,小程序
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) {
      // 页面尺寸变化
    }
  }
})

参考

图片与创建父子组件部分内容参考微信小程序公共组件封装,父子组件之间相互传值和相互调用方法
父子组件传值通信与事件触发主要参考:微信小程序之父子组件传值通信与事件触发(最全实用总结)文章来源地址https://www.toymoban.com/news/detail-780085.html

到了这里,关于【微信小程序】父子组件的创建、通信与事件触发;组件生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序(四)--- 自定义组件详解(properties,数据监听器,纯数据字段,插槽,父子间通信,behaviors)

    目录 一、创建组件 二、引用组件 1、局部引用 2、全局引用 三、组件和页面的区别 四、组件样式隔离 1、注意点 2、修改组件的样式隔离选项  五、数据、方法、属性 1、data数据 2、methods方法 3、properties属性  4、data和properties的区别  5、使用setData修改properties的值  六、数据

    2024年01月24日
    浏览(53)
  • 微信小程序web-view上覆盖原生组件,解决cover-view点击事件无法触发问题

    结合了以下文章,都没有找到办法 https://blog.csdn.net/WEIGUO19951107/article/details/94305964 https://blog.csdn.net/weixin_39461487/article/details/80075140 https://developers.weixin.qq.com/community/develop/doc/cbd33199b42aec724e54419ebe6371d7 图片显示是这个文章给我了参考,并且成功 https://blog.csdn.net/one_girl/article/deta

    2024年02月11日
    浏览(56)
  • 微信小程序:父子组件传值

    在微信小程序里,父组件可以向子组件传值,子组件也可以向父组件传值,不过这两种传值方式不大相同,下面先简单介绍这两种传值的区别。 两者的区别 父组件向子组件传值,使用的是   属性绑定   的方法,并且只能传递普通类型的数据 子组件向父组件传值,使用的是

    2024年02月07日
    浏览(62)
  • 【微信小程序】父子组件之间传值

    1. 父组件向子组件 传值 2. 子组件向父组件 传值 父向子传值使用的是 属性绑定 ,子组件中的 properties 对象进行接收父组件传递过来的值。 子向父传值使用的是 自定义事件 ,父组件通过自定义事件中的 事件对象e 来接收子组件传递过来的值。 1.1 在父组件的.json文件中导入子

    2024年02月16日
    浏览(48)
  • 微信小程序数据绑定和事件触发

    数据绑定和修改 微信小程序数据绑定是指将数据和视图进行关联,当数据发生变化时,视图也会相应地发生变化。微信小程序数据绑定主要有以下几种方式: 双向绑定:双向绑定是指数据和视图之间的双向关联,当数据发生变化时,视图也会相应地发生变化,反之亦然。在

    2024年02月10日
    浏览(64)
  • 微信小程序长按与单击事件触发

    方式一 wxml 片段 js 片段 解析 tap 触摸事件采用 catch 阻止事件冒泡 1.5.0之后支持 longpress 事件,手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 方式二(不推荐) longtap 事件,但在触发时会同时触发单击事件,需配合 touchstart 和

    2024年02月12日
    浏览(87)
  • 微信小程序-如何点击marker触发事件更改图标icon

    最近在做课设,要求实现一个找附近停车位的功能 绿色marker为空闲车位,红色marker为占用车位,现要求实现点击绿色marker,进行上锁操作,并让绿色锁改为红色锁。 如下图所示: 点击中间绿色锁,跳出弹窗,点击关锁,则锁变红色。 倘若点击红色锁的关锁,则会提示 “该

    2024年02月03日
    浏览(69)
  • 微信小程序 button按钮怎么触发事件? bindtap语法怎么使用?

    在前端网页中我们需要触发一个事件如果按钮点击后调用函数,文本、图片、链接被点击后调用一个函数一个事件,我们都知道用click,可是微信小程序中的click是不存在的, 他怎么才能和网页中一样的使用click的呢? 这时候有人肯定会问,我不是来学习click的怎么教我bindt

    2024年01月16日
    浏览(116)
  • 微信小程序上拉触底事件函数onReachBottom不触发的解决方案

    配置属性问题 高度问题 滚动条不在顶部 需要回到顶部重新计算高度 onReachBottom函数被覆盖 1.配置属性问题 在app.json或者本页的json文件中配置 onReachBottomDistance 属性,区别在于全局还是只在本页生效 2.高度问题 3. 切换页面时 滚动条滚回到顶部 4. onReachBottom() 函数被覆盖 每个页

    2024年02月11日
    浏览(38)
  • 【微信小程序】使用全局事件实现在不同页面之间共享数据或触发特定的操作

    在微信小程序中,你可以使用全局事件来实现在不同页面之间共享数据或触发特定的操作。以下是一个示例代码: 在app.js文件中,定义全局事件: 在上述代码中,我们在App对象中定义了globalData对象,用于存储全局数据。同时,我们定义了onLaunch方法,在小程序初始化时执行

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包