亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

小程序數據通信方法大全(推薦)

2019-11-19 11:46:47
字體:
來源:轉載
供稿:網友

本文論述的是子或孫向父傳遞數據的情況,自下而上

相信大家平時在小程序開發中肯定遇到過頁面或者組件之間的數據通信問題,那小程序數據通信都有哪些方式呢?如何選擇合適的通信方式呢?這就是本文要討論的重點。

關系劃分

在討論都有哪些數據通信方式之前,我們先來定義一下,小程序頁面、組件之間都有哪些關系。我總結了一下,大概分為以下3類:

  1. 父子關系
  2. 兄弟關系
  3. 爺孫關系

不同的關系里面,不同角色之間有可能是頁面,也有可能是組件,接下來我們就一個個來揭示如何進行數據通信。

父子關系

父子關系一般主要就是兩種情況:

父為頁面,子為組件 父為組件,子為組件

這種關系可能是頻率出現最高的了,畢竟大部分小程序頁面都是以小而美為主,可能沒有分的太細,碰到這種情況,我們可以通過在父頁面監聽子組件觸發的事件來完成數據通信。

方法一

<!-- 當自定義組件觸發“myevent”事件時,調用“onMyEvent”方法 --><component-tag-name bindmyevent="onMyEvent" /><!-- 在自定義組件中 --><button bindtap="onTap">點擊這個按鈕將觸發“myevent”事件</button>Component({ methods: {  onTap() {   const myEventDetail = {} // detail對象,提供給事件監聽函數   const myEventOption = {} // 觸發事件的選項   this.triggerEvent('myevent', myEventDetail, myEventOption)  } }})

 

兄弟關系

兄弟關系同樣分為兩種情況:

  1. 兄弟間都是頁面
  2. 兄弟間都是組件

兄弟間都是頁面

這種關系指的就是,同層次間的頁面,簡單理解其實就是頁面之間的跳轉,那從頁面A跳到頁面B,頁面B如何修改頁面A的數據呢?

方法二

頁面生命周期里面都有 onShow``onHide 方法,通過 localStorage 或者 globalData 作為數據中轉,進入到不同頁面時,在前一個頁面 onShow 里面取出數據,在后一個頁面 onShow 里面存儲數據,具體做法如下:

<!--app.js-->App({  globalData: { count: 0 },});<!--頁面A-->onShow(){  let countValue = wx.getStorageSync('count');    <!--globalData的方式-->  let countValue = getApp().globalData.count;  <!---->    if(countValue){    this.setData({      count:countValue    })  }    <!--globalData的方式 清除數據-->  getApp().globalData.count = null  <!---->}onHide(){  wx.removeStorageSync('count') }<!--頁面B-->onShow(){  <!--globalData的方式-->  getApp().globalData.count = 1  <!---->    wx.setStorageSync('count',1);}

 

爺孫關系

爺孫關系算是數據通信中最復雜的了,因為不是直系傳遞,若是通過 方法一 來監聽,那就需要通過多級傳遞事件了,如果節點比較深,可想而知代碼是得多難理解且難以維護。

我們可以通過全局創建一個事件總棧 EventBus ,利用這個 EventBus 來訂閱發布事件,也就是我們經常使用的 發布訂閱模式 ,那在小程序里面如何實現呢?

方法三

<!--第一步:實現一個事件總棧類-->class EventBus {  constructor() {    this.bus = {};  }  // on 訂閱  on(type, fun) {    if (typeof fun !== 'function') {      console.error('fun is not a function');      return;    }    (this.bus[type] = this.bus[type] || []).push(fun);  }  // emit 觸發  emit(type, ...param) {    let cache = this.bus[type];    if (!cache) return;    for (let event of cache) {      event.call(this, ...param);    }  }  // off 釋放  off(type, fun) {    let events = this.bus[type];    if (!events) return;    let i = 0,      n = events.length;    for (i; i < n; i++) {      let event = events[i];      if (fun === event) {        events.splice(i, 1);        break;      }    }  }}module.exports = EventBus;<!--第二步:在app.js文件中引入-->import EventBus from './common/event-bus/index.js';App({  eventBus: new EventBus(),});<!--第三步:在父頁面或者父組件中監聽某個事件-->onLoad: function(options) {  app.eventBus.on('add-count', this.addCount);}onUnload: function(options) {  app.eventBus.off('add-count', this.addCount);}<!--第四步:在子組件里面觸發事件-->methods: {  addCount() {    app.eventBus.emit('add-count');  }}

除此之外,還有一種方式,我們可以在每個頁面 onLoad 周期里面將該頁面的 pageModel 對象緩存起來,之后在孫輩組件里面拿到祖孫的頁面對象,從而觸發祖孫頁面對象對應的方法。

<!--第一步:實現一個pageModel,用來緩存頁面對象-->class PageModel {  constructor() {    this.pageCache = {};  }  add(page) {    let pagePath = this._getPageModelPath(page);    this.pageCache[pagePath] = page;  }  get(path) {    return this.pageCache[path];  }  delete(page) {    delete this.pageCache[this._getPageModelPath(page)];  }  <!--這一段代碼是關鍵,存儲的是__route__屬性-->  _getPageModelPath(page) {    return page.__route__;  }}export default PageModel ;<!--第二步:app.js中引入-->import PageModel from './common/page-model/index.js';App({  pageModel: new PageModel(),});<!--第三步:頁面onLoad周期里緩存頁面-->onLoad: function(options) {  app.pageModel.add(this);}<!--第四步:子孫獲取祖輩方法-->methods: {  addCount() {    app.pageModel.get('pages/communicate/index').addCount();  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产乱人伦真实精品视频| 怡红院精品视频| 成人欧美一区二区三区在线| 国产婷婷成人久久av免费高清| 国产亚洲精品久久久久久| 91国内产香蕉| 96国产粉嫩美女| 26uuu亚洲国产精品| 欧美精品免费在线观看| 亚洲乱码国产乱码精品精天堂| 日韩精品视频在线免费观看| 欧美激情视频一区| 日韩不卡在线观看| 久久天天躁夜夜躁狠狠躁2022| 欧美大片免费看| 亚洲精品美女在线观看播放| 成人精品久久一区二区三区| 久久久国产视频91| 久久久久久久久久亚洲| 欧美中文字幕在线视频| 欧美激情综合色综合啪啪五月| 久久99精品久久久久久琪琪| 欧美日韩午夜视频在线观看| 欧美色播在线播放| 国产精品视频成人| 日韩av手机在线| 亚洲一区二区三区四区视频| 国产69久久精品成人看| www.99久久热国产日韩欧美.com| 日韩三级成人av网| 性欧美激情精品| 欧美国产日韩二区| 91精品久久久久久| 91精品视频专区| 国产精品久久久久久av福利软件| 亚洲国产欧美一区| 日韩国产精品亚洲а∨天堂免| 一本一道久久a久久精品逆3p| 国产精品网址在线| 欧美又大又硬又粗bbbbb| 成人黄色免费网站在线观看| 国产成人精品久久二区二区91| 日韩美女在线观看| 91精品久久久久久综合乱菊| 亚洲天堂一区二区三区| 91情侣偷在线精品国产| 欧美国产日产韩国视频| 久久久久久久久综合| 91久久嫩草影院一区二区| 欧美性xxxxhd| 亚洲久久久久久久久久| 国产精品久久综合av爱欲tv| 九色精品免费永久在线| 国产精品久久久久久久7电影| 91日韩在线视频| 激情av一区二区| 亚洲欧美国产一本综合首页| 亚洲精品视频免费在线观看| 日韩欧美在线播放| 国产91精品黑色丝袜高跟鞋| 中文字幕一区电影| 国产精品久久久久久中文字| 国产亚洲精品成人av久久ww| 欧美国产日韩中文字幕在线| 国产97在线亚洲| 日韩有码片在线观看| 国产一区深夜福利| 亚洲精品视频网上网址在线观看| 亚洲性av在线| 国产精品久久久久久久久| 欧美视频一区二区三区…| 久久成人精品视频| 欧美成人精品h版在线观看| 欧美日韩国产激情| 色视频www在线播放国产成人| 亚洲最大福利视频网站| www.亚洲一区| 亚洲欧洲日本专区| 亚洲最大福利网站| 18久久久久久| 久久国产精品亚洲| 一区二区成人精品| 亚洲精品中文字幕女同| 97成人在线视频| 亚洲激情久久久| 最近中文字幕mv在线一区二区三区四区| 中文字幕v亚洲ⅴv天堂| 亚洲国产精品成人精品| 一本大道久久加勒比香蕉| 欧美综合在线观看| 久久久久女教师免费一区| 最新中文字幕亚洲| 国内精品久久久久久影视8| 青青久久aⅴ北条麻妃| 疯狂做受xxxx欧美肥白少妇| 久久国产视频网站| 91在线精品播放| 欧美黑人巨大精品一区二区| 亚洲人成网站在线播| 国产不卡视频在线| 亚洲一区二区中文字幕| 国产精品视频久| 尤物精品国产第一福利三区| 欧美精品videossex性护士| 国产精品三级在线| 国产精品女视频| 日韩在线观看免费| 成人激情春色网| 久久人91精品久久久久久不卡| 色777狠狠综合秋免鲁丝| 久久99久久久久久久噜噜| 国产一区二区三区视频免费| 久久影院资源站| 亚洲成人久久久| 精品丝袜一区二区三区| 中文字幕欧美精品在线| 亚洲国产精品一区二区久| 91久久久国产精品| 91精品国产91久久久久| 欧美一级成年大片在线观看| 91日本在线视频| 亚洲成人激情图| 免费91麻豆精品国产自产在线观看| 欧美日韩国产影院| 国产精品成人观看视频国产奇米| 亚洲精品一区二三区不卡| 日韩视频免费看| 亚洲aa在线观看| 91免费版网站入口| 久久免费国产视频| 92裸体在线视频网站| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲综合大片69999| 国产不卡一区二区在线播放| 欧美极品美女电影一区| 久久这里有精品| 欧美成人激情图片网| 久久天天躁狠狠躁夜夜躁2014| 91日本在线视频| 日韩人体视频一二区| 日韩综合视频在线观看| 国模视频一区二区| 亚洲第一中文字幕| 成人久久久久久久| 国产精品美女在线| 国产精品扒开腿爽爽爽视频| 97超视频免费观看| 欧美黑人视频一区| 欧美国产日韩一区二区在线观看| 国产成人福利夜色影视| 免费av在线一区| 中文字幕国内精品| 亚洲日韩欧美视频| 亚洲欧美激情视频| 欧美一级大片在线观看| 成人午夜在线影院| 久久午夜a级毛片| 在线不卡国产精品| 国内伊人久久久久久网站视频| 国产精品激情自拍| 日韩免费看的电影电视剧大全| 91最新在线免费观看| 国产精品96久久久久久又黄又硬| 日韩欧美国产中文字幕|