微信小程序----父子组件通信

组件

  前端开发现在都讲究组件化开发,甚至有的面试官会问啥叫组件化开发。初次听到这个词还是在刚找工作的时候,被面试官问到。当时并没有对一些专业词汇太过关注,因此被问懵了。其实组件化开发,说白了就是,将一部分ui以及样式甚至逻辑抽离出来组成一个单独的文件(模块),然后可以在多个地方使用,需要的数据源有一定的格式规则,产出也是有一定的规则(相同的输入会产生相同的输出)。组件化开发的好处是:增加代码复用性,减少代码量,提高开发效率、便于代码维护、提高系统设计。

  那么当使用组件的时候,就会涉及到数据流向、事件传递的问题。(除非是某些固定的 UI 展示类,不用逻辑,可以简单的写死,类似于静态页)。父组件使用子组件,那么父组件就需要给子组件传值。子组件发生的操作,需要通知父组件,那么就需要将事件或者产生的结果通知到父组件。这就是父子组件的通信。A组件使用B组件,则A是父组件,B是子组件。主要说说,小程序中的父子组件通信和事件的传递。

先看代码:

父组件
// home.wxml 文件
<view class="container">
  <view class="list-wrap">
    <view class="list-item" wx:for="{{list}}" wx:for-item="paper" wx:for-index="idx" wx:key="idx">
      <list-item id="paperItem" paper="{{paper}}" bind:likeFun="likeFun" bind:collectFun="collectFun" />
    </view>
  </view>
</view>

// home.json
  "usingComponents": {
    "list-item": "../components/listItem/listItem"
  }
子组件
// listItem 组件
<!--pages/components/listItem.wxml-->
<view class="list-item">
  <view class="item-title">{{paper.title}}</view>
  <view class="item-author">作者:{{paper.author}}</view>
  <view class="item-action">
    <view class="action-like" bindtap="likeClick" >点赞:{{paper.like}}</view>
    <view class="action-collect" bindtap="collectClick" >收藏:{{paper.collect}}</view>
  </view>
</view>

// listItem.json
{
  "component": true,
  "usingComponents": {}
}

// listItem.wxss 是样式文件,仅对这个组件有效
// listItem.js
// pages/components/listItem.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    paper: Object

  },

  /**
   * 组件的初始数据
   */
  data: {

  },

  /**
   * 组件的方法列表
   */
  methods: {
    likeClick: function() {
      console.log('like');
      let obj = {
        type: 'click',
        event: 'like'
      }
      this.triggerEvent("likeFun", obj)
    },

    collectClick: function() {
      console.log('collect');
      let obj = {
        type: 'tap',
        event: 'collect'
      }
      this.triggerEvent("collectFun", obj)
    }

  }
})

// 点击点赞打印:
 like
 ==外部事件1== {type: "click", event: "like"}
// 点击收藏打印:
collect
==外部事件2== {type: "tap", event: "collect"}
解释0

父组件通过属性的方式(paper),将自己的数据传递给子组件使用,子组件要使用父组件的数据,只能是通过属性的方式接受传递。

父组件通过 bind方法,绑定一个自己的方法,然后传给子组件一个方法。
子组件通过调用 trigger 方法来执行父组件的方法,并将子组件的值通过参数传递给父组件。父组件在 e.detail 中获取到子组件传出来的值,这样就完成了父子组件间的通信(数据传递、事件执行)。

triggerEvent 还可以接受第三个参数来确认事件是否冒泡、事件是否可以穿越组件边界、事件是否拥有捕获阶段。
附上微信链接

获取组件实例

  因为微信和Vue、React类似属于数据驱动视图更新,因此一般不用获取实例。微信小程序提供了获取组件实例的方法:this.selectComponent("选择器")
比如:const child = this.selectComponent('#paperItem');
若需要自定义 selectComponent 返回的数据,可使用内置 behavior: wx://component-export。
使自定义组件中支持 export 定义段,这个定义段可以用于指定组件被 selectComponent 调用时的返回值。

原文地址:https://www.cnblogs.com/xguoz/p/13126805.html