小程序組件之間的通信


前言:

其實之前就想寫這個的,因為我覺得這么模塊化的框架,組件之間通信是非常重要的,也是最經常用到的一塊兒,

只是之前在項目里一直沒用到跨組件通信,現在用到了,也會用了,就一起寫出來得了 :)

 

一、父、子組件之間的通信

注:首先我們先將子組件在父組件中注冊,並且在父組件上使用!!!            
1.創建組件:
     在微信開發者工具中,我們可以直接創建組件;
     先右鍵創建一個文件夾,然后在創建的這個文件夾上右鍵,新建Component;
     這樣就成功的創建了一個組件;
2.在父組件中注冊,並使用:
     首先,我們去到父組件中的.json文件中,在"usingComponents"中進行注冊
     例: "usingComponents":{
        "自定義name":"子組件的路徑(可以是絕對路徑,也可以是相對路徑)"
        }
     注冊完之后,我們就可以使用了,在父組件的.wxml文件中,直接使用
     例: <b-detail-swiper /> (里面填的就是我們在注冊時,起的自定義name)

----------------------------華麗的分割線-------------------------------

1.父組件向子組件傳遞數據
     父組件向子組件傳遞數據,可以傳遞number、array、object、string等數據
     以上傳遞是數據是在項目中常用的,當然null跟undefined也是可以傳遞的
     舉個例子吧:我們要像輪播圖組件中傳遞幾張圖片
     注:imgList是我們自定義的名字,也是要在子組件中接收的名字
       {{imgList}}中的imgList是我們父組件中js文件中data中的數據
     例:<b-detail-swiper imgList="{{imgList}}" />

     -----------------上面的代碼就是我們父組件向子組件傳遞數據的過程--------------------

     父組件中傳遞了數據,子組件中就要接收參數
     子組件中的.js文件中有一個Component對象,在這個對象中有一個properties的對象
     例子:properties:{
          imgList:{
            type:Array //type: 數據類型(根據傳遞過來的數據進行填寫)
            value:[]     //value:默認值(當你沒有傳遞值的時候,就使用value中的值,類似default)    
          }

        }
     這樣就接收到了父組件傳遞過來的數據,在子組件中的.wxml文件中使用mastache語法:{{imgList}}引用

2.子組件向父組件傳遞自對應事件
     舉個例子:我們在子組件中的wxml中,使用bind:tap監聽了一個onClick方法
     在.js文件中的Component對象中的methods中使用onClick方法
     在onClick方法使用triggerEvent發送自定義事件
     例:methods:{
        onClick(){
          console.log('監聽到點擊事件')
          const index = 1
          this.triggerEvent("handleClick",{index},{})
        }
       }
     //trigerEvent("method-name",{index},{});
      該方法有3個參數:第一個參數:方法名,第二個參數:要傳遞的數據,
      重點:第三個參數:沒有用過,不是很了解,希望有無意或有意看到的朋友在評論區給出自己的理解
     
     
---------------------------在父組件中使用------------------------------
     
     例:
     在父組件中的.wxml文件中:
     <b-detail-swiper bind:handleClick="handleClick" />
     在父組件中的.js文件中
     在Page對象中
     handleClick(event){
      //獲取event對象
      const index = event.detail.index;
      console.log(index)
     }
     這樣我們獲取到子組件向父組件傳遞的數據

 

 二、非父子組件之間的通信

wx小程序中的非父子組件通信其實特別簡單,
在我們創建小程序的時候就會生成一個app.js、app.json等文件
我們的非父子組件之間的通信就需要用到app.js文件

例子:
app.js文件:
      App({
          onLaunch:function(){
            
          },
          addObj(obj){
            this.globalData.proList.push(obj)
          }
          globalData:{
           name:'',
           proList:[] 
          }
        })
注:home組件跟profile組件不是父子組件的關系

在home跟profile組件的js文件中我們先進行引用,這一步是必須的,先獲取全局對象嘛
 const app = getApp();

------------------------------發送數據----------------------------------

home.js文件:
  const app = getApp();
  Page({
    onLoad:function(options){
      app.globalData.name = 'b-clouds'
    }
  })
在home.js文件中,我們將app中的globalData中的name屬性的值改為'b-clouds',
這時全局對象中的name屬性的值就變成了'b-clouds'

---------------------------------獲取數據----------------------------------

profile.js文件:
  const app = getApp();
  Page({
    onLoad:function(options){
    
    },
    //onClick只是一個單純的點擊事件
    onClick(){
      const name = app.globalData.name;
      console.log(name)
      //控制台打印出來的結果就是: b-clouds
    }
  })

上面的只是String類型數據的傳遞,那么其他類型呢?
  number跟String類型傳遞數據的方法是一樣的

-------------------------------傳遞數據---------------------------------

  而對象和數組傳遞數據的方式是一樣的
  例子:
home.js:
   Page:{
    data:{
      id:1001,
      name:'b-clouds',
      age:22,
      height:1.81
    }
    onClick(){
      const obj = {}
      obj.id = this.data.id
      obj.name = this.data.name
      obj.age = this.data.age
      obj.height = this.data.height
      app.addObj(obj)
    }
   }
這樣在home文件中就將全局對象中的proList的值改變;

---------------------------------獲取數據-----------------------------------

 profile.js文件:
   const app = getApp();
   Page({
    data:{
     proList:[]
    }
    //監聽頁面顯示
    onShow:function(){
      const proList = app.globalData.proList
      this.setData({
        proList //es6增強語法: proList:proList === proList
      })
    }
   })
 profile.wxml文件:
   這里就可以直接使用mastache語法使用proList {{proList}}


 


免責聲明!

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



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