中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue數據傳遞--我有特殊的實現技巧

發布時間:2020-09-05 20:05:34 來源:腳本之家 閱讀:130 作者:toBeTheLight 欄目:web開發

前言

最近碰到了比較多的關于vue的eventBus的問題,之前定技術選型的時候也被問到了,vuex和eventBus的使用范圍。所以簡單的寫一下。同時有一種特殊的實現方案。

有這么幾種數據傳遞方式,vuex、props、eventBus和特殊的eventBus。

vuex

不介紹,數據量和復雜度達不到不用它你才會向下看。

props

demo

父子組件傳值,官方api,只寫個demo。

1.父組件

<son :info="info" @update="updateHandler"/>
// data
info: 'sendToSon'
// methods
updateHandler (newVal) {
 this.info = newVal
}

2.子組件

// props
props: ['info']
// 向上傳值,某個方法中使用
this.$emit('update', 'got')

父向子傳值-->props 子向父傳值-->子組件綁定事件回調定義在父組件,子組件觸發此事件。 因不推薦子組件內直接修改父組件傳入的props,需使用自定義事件。

限制

父子組件。

eventBus

demo

bus皆為導入的bus實例

// bus
const bus = new Vue()
// 數據接收組件
// 當前組件接收值則
bus.$on('event1', (val)=>{})
// 數據發出組件
// 當前組件發出值則
bus.$emit('event1', val)

可以看出本質是一個vue實例充當事件綁定的媒介。 在所有實例中使用其進行數據的通信。

雙(多)方使用同名事件進行溝通。

問題

  1. $emit時,必須已經 $on,否則將無法監聽到事件,也就是說對組件是有一定的同時存在的要求的。(注:路由切換時,新路由組件先 created,舊路由組件再destoryed,部分情況可以分別寫入這兩個生命周期,見此問題)。
  2. $on在組件銷毀后不會自動解除綁定,若同一組件多次生成則會多次綁定事件,則會一次 $emit,多次響應,需額外處理。
  3. 數據非“長效”數據,無法保存,只在 $emit后生效。

所以是否有一種更適用的方案呢?

特殊的eventBus?

demo

我們先來看個代碼,線上代碼。 bus皆為導入的bus實例。

// bus
const bus = new Vue({
 data () {
  return {
   // 定義數據
   val1: ''
  }
 },
 created () {
  // 綁定監聽
  this.$on('updateData1', (val)=>{
   this.val1 = val
  })
 }
})
// 數據發出組件
import bus from 'xx/bus'
// 觸發在bus中已經綁定好的事件
bus.$emit('update1', '123')
// 數據接收組件

{{val1}}
// 使用computed接收數據
computed () {
 val1 () {
  // 依賴并返回bus中的val1
  return bus.val1
 }
}

不同

  1. 正統的eventBus只是用來綁定和觸發事件,并不關心數據,不與數據發生交集。而這個方案多一步將數據直接添加在bus實例上。且事件監聽與數據添加需提前定義好。
  2. 數據接收方不再使用$on來得知數據變化,而是通過計算屬性的特征被動接收。

解決的問題

通信組件需同時存在?數據在bus上存儲,所以沒有要求。

多次綁定?綁定監聽都在bus上,不會重復綁定。

數據只在$emit后可用?使用計算屬性直接讀取存在bus上的值,不需要再次觸發事件。

探討

為什么使用計算屬性

其實應該是為什么不能直接添加到data上,如 data1: bus.data1?我們可以再看一段代碼,線上代碼。 將bus修改為

data () {
 return {
  // 多一層結構
  val: {
   result: 0
  }
 }
},
created () {
 this.$on('update1', val => {
  console.log('觸發1', i1++)
  this.val.result = val
 })
}

數據接收組件改為

// template
data中獲取直接修改值:{{dataResult}}
data中獲取直接修改值的父層:{{dataVal}}
computed中依賴直接修改值:{{computedResult}}
// js
data () {
  return {
   // 獲取直接修改值
   dataResult: bus.val.result,
   // 獲取直接修改值的父層
   dataVal: bus.val
  }
 },
 computed: {
  computedResult () {
   // 依賴直接修改值
   return bus.val.result
  }
 }

可以看到,data中獲取直接修改值值的數據是無法動態響應的。

為什么要用事件

其實不用 $emit觸發,使用 bus.val = 1直接賦值也是可以的,那么為什么不這么做呢?

簡化版的vuex

其實這種eventBus就是簡化版的vuex。 vue文檔中有這樣一段話:

組件不允許直接修改屬于 store 實例的 state,而應執行 action 來分發 (dispatch) 事件通知 store 去改變,我們最終達成了 Flux 架構。這樣約定的好處是,我們能夠記錄所有 store 中發生的 state 改變。

store對應 bus實例, state對應 data, action對應 事件, dispatch對應 $emit。 同時vuex中組件獲取數據的方式正是通過計算屬性,那么其實vuex和Flux架構的理解和使用也沒有那么難不是嗎。

總結

以上所述是小編給大家介紹的vue數據傳遞--我有特殊的實現技巧,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安岳县| 临泽县| 台山市| 利辛县| 德安县| 汝城县| 泰兴市| 高阳县| 加查县| 伊春市| 泸定县| 绍兴县| 隆子县| 运城市| 资溪县| 怀集县| 油尖旺区| 神农架林区| 上虞市| 泗水县| 水城县| 孟村| 海门市| 夏津县| 民权县| 汝城县| 蓬莱市| 兴宁市| 罗山县| 吉林省| 肇州县| 旅游| 德格县| 广安市| 光山县| 五台县| 长阳| 余干县| 澳门| 白城市| 同江市|