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


組件

  前端開發現在都講究組件化開發,甚至有的面試官會問啥叫組件化開發。初次聽到這個詞還是在剛找工作的時候,被面試官問到。當時並沒有對一些專業詞匯太過關注,因此被問懵了。其實組件化開發,說白了就是,將一部分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 調用時的返回值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM