小程序 父子组件通信

发布于 2024-09-01 08:26:57 字数 4469 浏览 11 评论 0

父子组件通信的三种方式:

  1. 属性绑定:用于父组件向子组件的指定属性设置数据,仅能设置 JSON 兼容的数据
  2. 事件绑定:用于子组件向父组件传递数据,可以传递任意数据
  3. 获取组件实例:父组件通过 this.selectComponent() 方法获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法

一、父->子

Page({
  data:{
    count: 0
  }
})
<son count="{{count}}"></son>

son.js

Component({
  properties: {
    count: Number
  },
})

son.wxml

<text>数值:{{count}}</text>

二、子->父( triggerEvent

子组件使用 triggerEvent 方法向父组件传递数据。

父组件:

<!-- 当自定义组件触发“myevent”事件时,调用“onMyEvent”方法 -->
<component-tag-name bindmyevent="onMyEvent" />
<!-- 或者 -->
<component-tag-name bind:myevent="onMyEvent" />
Page({
  onMyEvent: function(e){
    e.detail // 自定义组件触发事件时提供的 detail 对象
  }
})

子组件:

<!-- son.wxml -->
<button bindtap="onTap">点击这个按钮将触发“myevent”事件</button>
<!-- son.js -->
// 使用 triggerEvent 方法,指定事件名、detail 对象、事件选项
Component({
  properties: {},
  methods: {
    onTap: function(){
      var myEventDetail = {} // detail 对象,提供给事件监听函数
      var myEventOption = {} // 触发事件的选项
      this.triggerEvent('myevent', myEventDetail, myEventOption)
    }
  }
})

事件选项包括:

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

以下是使用说明:

// 定义组件 another-component.wxml
<view bind:customevent="anotherEventListener">
  <slot />
</view>

// 定义组件 my-component.wxml
<view bind:customevent="myEventListener">
  <slot />
</view>

// 页面 page.wxml
<another-component bind:customevent="pageEventListener1">
  <my-component bind:customevent="pageEventListener2"></my-component>
</another-component>
// 组件 my-component.js
Component({
  methods: {
    onTap: function(){
      // 1. 只会触发 pageEventListener2
      this.triggerEvent('customevent', {})
      
      // 2. 会依次触发 pageEventListener2 、 pageEventListener1
      this.triggerEvent('customevent', {}, { bubbles: true }) 
      
      // 3. 会依次触发 pageEventListener2 、 anotherEventListener 、 pageEventListener1
      this.triggerEvent('customevent', {}, { bubbles: true, composed: true }) 
    }
  }
})

三、获取组件实例

可在父组件里调用 this.selectComponent ,获取子组件的实例对象。调用时需要传入一个匹配选择器 selector ,如: this.selectComponent(".my-component")

Page({
  data: {},
  getChildComponent: function () {
    const child = this.selectComponent('.my-component'); // 父组件将会获取 class 为 my-component 的子组件实例对象,即子组件的 this 
    console.log(child)
  }
})

注意 :默认情况下,小程序与插件之间、不同插件之间的组件将无法通过 selectComponent 得到组件实例(将返回 null )。如果想让一个组件在上述条件下依然能被 selectComponent 返回,可以自定义其返回结果

  1. 使用内置 behavior : wx://component-export
  2. 自定义组件中的 export 定义段将用于指定组件被 selectComponent 调用时的返回值
// 自定义组件 my-component 内部
Component({
  behaviors: ['wx://component-export'],
  export() {
    return { myField: 'myValue' }
  }
})


<!-- 使用自定义组件时 -->
<my-component id="the-id" />
    
    
// 父组件调用
const child = this.selectComponent('#the-id') // 等于 { myField: 'myValue' }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

瀟灑尐姊

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文