当前位置:   article > 正文

小程序组件引用、子父组件传值、监听等详细介绍、component、observers_微信小程序 observers

微信小程序 observers

目录

组件生命周期 

组件引用

组件传值

父组件给子组件传值

 子组件给父组件传值

observers 数据监听 

注意事项


组件生命周期 

在介绍组件属性时,先介绍下组件的生命周期,可用的全部生命周期如下表所示:

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

关于lifetimes :自小程序基础库版本 2.2.3 起,组件的的生命周期也可以在 lifetimes 字段内进行声明(这是推荐的方式,其优先级最高)。

组件所在页的生命周期:

生命周期参数描述最低版本
show组件所在的页面被展示时执行2.2.3
hide组件所在的页面被隐藏时执行2.2.3
resizeObject Size组件所在的页面尺寸变化时执行2.4.0

注意:自定义 tabBar 的 pageLifetime 不会触发。

  1. Component({
  2. pageLifetimes: {
  3. show: function() {
  4. // 页面被展示
  5. },
  6. hide: function() {
  7. // 页面被隐藏
  8. },
  9. resize: function(size) {
  10. // 页面尺寸变化
  11. }
  12. }
  13. })

 关于 组件生命周期 详见官方文档

组件引用

准备页面:组件header   与  页面index

1、创建组件文件

右键 >  新建文件夹components > 新建文件夹header (如果没有那么多组件可以省略,如果组件多的话最好文件夹分开)  > 右键 新建Component  (这里是global-header )

global-header.wxml内容

  1. <view class="header">
  2. <input type="text" placeholder="请输入内容"></input>
  3. <view bindtap="confirmBtn" class="btn">确定</view>
  4. </view>

2、index页面引入组件

pages目录下 index.json

  1. {
  2. "usingComponents": {
  3. "header":"../../components/header/global-header"
  4. }
  5. }

解释:

usingComponents: {
    "组件名": "组件所在路径"
}

pages目录下 index.wxml

<header></header>

解释:

<组件名></组件名>  这个名字就是对应刚刚在 index.json 里起的名字

到此组件的引用就实现了,组件header的内容就引入到index里了

关于组件properties、attached、observers、methods 的解释说明, (global-header.js

  1. Component({
  2. /**
  3. * properties类似vue组件里的 props
  4. * 组件的对外属性,用来接收外界传到组件中的数据
  5. */
  6. properties: {//倾向于存储外界传递到组件中的数据
  7. /**
  8. name:{// 属性名
  9. type:类型,//可选值为: Number,String、Boolean、Object、Array、null(表示不限制类型)
  10. value:值 ,
  11. },
  12. */
  13. // 如 用户信息 userInfo 对象类型,默认是空对象
  14. userInfo: { // 属性名
  15. type: Object, // 属性类型
  16. value:{},// 属性默认值
  17. },
  18. // 如 样例 demo 字符串类型,默认值'测试demo'
  19. demo: { // 属性名
  20. type: string, // 属性类型
  21. value:'测试demo',// 属性默认值
  22. },
  23. },
  24. // 组件的初始数据
  25. data:{},//倾向于存储组件的私有数据
  26. lifetimes: {},
  27. attached: function () {},
  28. //数据监听器 监听和响应任何属性和数据的变化,类似vue中watch
  29. observers: { },
  30. // 组件的方法列表,定义组件的事件处理函数
  31. methods: {
  32. //如 增加的方法
  33. add(){console.log('增加')},
  34. //如 删除的方法
  35. del(){console.log('删除')}
  36. }
  37. })

关于 组件 Component 属性方法 等详细介绍见官方文档

组件传值

父组件给子组件传值

父组件(页面index)给子组件(组件header )传值  

1、在组件global-header.js中定义接收值的属性并设置类型以及初始值

  1. /**
  2. * 组件的属性列表
  3. * 在组件属性列表里定义 要接收值的 属性:valueText
  4. * 默认值为空,字符串类型,即input的value值
  5. */
  6. properties: {
  7. valueText:{
  8. type:String,
  9. value:''
  10. }
  11. },

2、global-header.wxml 中添加标签

  1. <view class="header">
  2. <input type="text" value="{{valueText}}" placeholder="请输入内容"></input>
  3. <view bindtap="confirmBtn" class="btn">确定</view>
  4. </view>

3、父组件,也就是index文件下,设置值并传给global-header

valueText 是 global-header中定义接收的属性名

value 是 index 中设置的值

  1. <!-- index.wxml -->
  2. <header valueText="{{value}}"></header>
  1. // index.js
  2. Page({
  3. data: {
  4. value:'index页面传给input的value值' // 从接口获取、或者自定义的 要传给 global-header的值
  5. },
  6. })

到此 父组件的值就传给了子组件,运行如下:

 子组件给父组件传值

子组件给父组件传值要 使用  this.triggerEvent() 方法 ,该方法接收 3 个参数

  1. //this.triggerEvent('自定义方法名', 传到组件外的数据 , 是否冒泡选项 )
  2. this.triggerEvent('confirmBtn', myEventDetail, myEventOption)

第三个 myEventOption 是否冒泡的参数  又分  3 个选项,即下表

触发事件的选项包括:

选项名类型是否必填默认值描述
bubblesBooleanfalse事件是否冒泡
composedBooleanfalse事件是否可以穿越组件边界,为 false 时,事件将只能在引用组件的节点树上触发,不进入其他任何组件内部
capturePhaseBooleanfalse事件是否拥有捕获阶段

子组件给父组件传 例:

当点击按钮 “确定” 的时候,给父组件 传新的 valueText 值

  1. <!-- 子组件页面 global-header.wxml -->
  2. <view class="header">
  3. <input type="text" value="{{valueText}}" placeholder="请输入内容"></input>
  4. <view bindtap="confirmBtn" class="btn">确定</view>
  5. </view>
  1. // 子组件 global-header.js
  2. Component({
  3. /**
  4. * 组件的属性列表
  5. */
  6. properties: {
  7. valueText:String, //输入框内容
  8. },
  9. /**
  10. * 组件的方法列表
  11. */
  12. methods: {
  13. //确定按钮 给父组件index 传值
  14. confirmBtn(e){
  15. // this.triggerEvent('传递给父组件的自定义事件名称 newValue',传给父组件的数据 valueText)
  16. this.triggerEvent('newValue',{valueText:'子组件更改了value'})
  17. },
  18. },
  19. })

父组件 index 接收传过来的值

父组件监听事件  bindnewValue = "newValue"  等同与  bind:newValue="newValue" 

bind的是子组件自定义的方法名字newValue  ,父组件方法名字 newValue2(这里为了区分写了newValue2)

  1. <!-- index.wxml --> 
  2. <header valueText="{{value}}" bindnewValue="newValue2"></header>
  1. // 父组件 index.js
  2. Page({
  3. data: {
  4. value:'value值'
  5. },
  6. onLoad() {},
  7. newValue2(e){
  8. console.log('e:',e)
  9. console.log('e.detail:',e.detail)
  10. },
  11. })

到此子组件传值,父组件接收完毕,运行如下:

关于 组件通信 与 事件 详见官方文档

observers 数据监听 

类似 vue 中的 watch 功能,小程序基础库版本 2.6.1 开始支持

组件内global-header.js 监听 

  1. // global-header.js
  2. Component({
  3. /**
  4. * 组件的属性列表
  5. */
  6. properties: {
  7. valueText:String, //输入框内容
  8. },
  9. /**
  10. * 组件的方法列表
  11. */
  12. methods: {
  13. confirmBtn(e){
  14. console.log('确定')
  15. this.triggerEvent('newValue',{valueText:'子组件更改了value'})
  16. },
  17. },
  18. observers:{
  19. //监听valueText 值变化
  20. // '字段valueText'(字段valueText的新值) {
  21. // console.log(字段valueText的新值)
  22. // do something
  23. // }
  24. 'valueText'(newVal) {
  25. console.log(newVal)
  26. }
  27. }
  28. })

也可以同时监听多个

  1. observers:{
  2. //字段 A 和 B
  3. // 'A,B'(A_val, B_val) {
  4. // console.log(A_val, B_val)
  5. // do something
  6. // }
  7. 'A,B'(newA,newB) {
  8. console.log(newA,newB)
  9. }
  10. }

父组件内新增一个按钮以便触发再次改变value 值

  1. <!-- index.wxml -->
  2. <header valueText="{{value}}" bindnewValue="newValue2"></header>
  3. <view bindtap="changeVal">点击再次改变value值</view>
  1. // index.js
  2. Page({
  3. data: {
  4. value:'value值'
  5. },
  6. onLoad() {},
  7. newValue2(e){
  8. console.log('e:',e)
  9. console.log('e.detail:',e.detail)
  10. },
  11. //触发按钮 在一次改变 传给 子组件的valueText的值
  12. changeVal(e){
  13. this.setData({
  14. value:'再次改变value值'
  15. })
  16. },
  17. })

到此observers监听数据变化已完毕,运行如下

一次 setData 最多触发每个监听器一次。同时,监听器可以监听子数据字段

注意事项

  • 数据监听器监听的是 setData 涉及到的数据字段,即使这些数据字段的值没有发生变化,数据监听器依然会被触发。
  • 如果在数据监听器函数中使用 setData 设置本身监听的数据字段,可能会导致死循环,需要特别留意。
  • 数据监听器和属性的 observer 相比,数据监听器更强大且通常具有更好的性能。

关于 observer 数据监听 详见官方文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/298526
推荐阅读
相关标签
  

闽ICP备14008679号