您好,登錄后才能下訂單哦!
前言
最近碰到了比較多的關于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實例充當事件綁定的媒介。 在所有實例中使用其進行數據的通信。
雙(多)方使用同名事件進行溝通。
問題
所以是否有一種更適用的方案呢?
特殊的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 } }
不同
解決的問題
通信組件需同時存在?數據在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數據傳遞--我有特殊的實現技巧,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。