首頁 web前端 js教程 vue資料傳遞--我有特殊的實作技巧

vue資料傳遞--我有特殊的實作技巧

May 25, 2018 pm 04:23 PM
實現

這篇文章主要介紹了vue資料傳遞一些特殊梳理技巧,需要的朋友可以參考下

#前言

最近碰到了比較多的關於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架構的理解和使用也沒有那麼難不是嗎。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

基於Ajax技術實作檔案上傳帶進度條

探討Ajax中有關readyState和status的問題

全面解析$.Ajax()方法參數(圖文教學)

#

以上是vue資料傳遞--我有特殊的實作技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

華為手機如何實現雙微信登入? 華為手機如何實現雙微信登入? Mar 24, 2024 am 11:27 AM

華為手機如何實現雙微信登入?

使用Java編寫程式碼實作愛心動畫 使用Java編寫程式碼實作愛心動畫 Dec 23, 2023 pm 12:09 PM

使用Java編寫程式碼實作愛心動畫

如何在華為手機上實現微信分身功能 如何在華為手機上實現微信分身功能 Mar 24, 2024 pm 06:03 PM

如何在華為手機上實現微信分身功能

PHP程式設計指南:實作斐波那契數列的方法 PHP程式設計指南:實作斐波那契數列的方法 Mar 20, 2024 pm 04:54 PM

PHP程式設計指南:實作斐波那契數列的方法

PHP遊戲需求實作指南 PHP遊戲需求實作指南 Mar 11, 2024 am 08:45 AM

PHP遊戲需求實作指南

開發建議:如何利用ThinkPHP框架實現非同步任務 開發建議:如何利用ThinkPHP框架實現非同步任務 Nov 22, 2023 pm 12:01 PM

開發建議:如何利用ThinkPHP框架實現非同步任務

掌握Golang如何實現遊戲開發的可能性 掌握Golang如何實現遊戲開發的可能性 Mar 16, 2024 pm 12:57 PM

掌握Golang如何實現遊戲開發的可能性

如何在Golang中實現精確除法運算 如何在Golang中實現精確除法運算 Feb 20, 2024 pm 10:51 PM

如何在Golang中實現精確除法運算

See all articles