国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vue數(shù)據(jù)傳遞--我有特殊的實現(xiàn)技巧

xiaoxiaozi / 2561人閱讀

摘要:同時有一種特殊的實現(xiàn)方案。組件之間傳值有這么幾種數(shù)據(jù)傳遞方式,和特殊的。在所有實例中使用其進行數(shù)據(jù)的通信。雙多方使用同名事件進行溝通。數(shù)據(jù)非長效數(shù)據(jù),無法保存,只在后生效。這樣約定的好處是,我們能夠記錄所有中發(fā)生的改變。

前言

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

組件之間傳值有這么幾種數(shù)據(jù)傳遞方式,vuex、props、eventBus和特殊的eventBus

vuex

我就傳兩個數(shù)據(jù),vuex真是太麻煩了。用是不可能用的,理解又理解不了。

props demo

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

父組件

// 將事件綁定至子組件

// data
info: "sendToSon"
// methods
updateHandler (newVal) {
  this.info = newVal
}

子組件

// props
props: ["info"]
// 觸發(fā)綁定在組件上的事件,向上傳值,在父組件某個方法中使用
this.$emit("update", "got")

父向子傳值-->props
子向父傳值-->子組件綁定事件回調(diào)定義在父組件,子組件觸發(fā)此事件。
因不推薦子組件內(nèi)直接修改父組件傳入的props,需使用自定義事件。

限制

父子組件。

eventBus demo

bus皆為導(dǎo)入的bus實例

// bus
const bus = new Vue()
// 數(shù)據(jù)接收組件
// 當(dāng)前組件接收值則
bus.$on("event1", (val)=>{})
// 數(shù)據(jù)發(fā)出組件
// 當(dāng)前組件發(fā)出值則
bus.$emit("event1", val)

可以看出本質(zhì)是一個vue實例充當(dāng)事件綁定的媒介。
在所有實例中使用其進行數(shù)據(jù)的通信。

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

問題

$emit時,必須已經(jīng)$on,否則將無法監(jiān)聽到事件,也就是說對組件是有一定的同時存在的要求的。(注:路由切換時,新路由組件先created,舊路由組件再destoryed,部分情況可以分別寫入這兩個生命周期,見此問題)。

$on在組件銷毀后不會自動解除綁定,若同一組件多次生成則會多次綁定事件,則會一次$emit,多次響應(yīng),需額外處理。

數(shù)據(jù)非“長效”數(shù)據(jù),無法保存,只在$emit后生效。

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

特殊的eventBus? demo

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

// bus
const bus = new Vue({
  data () {
    return {
      // 定義數(shù)據(jù)
      val1: ""
    }
  },
  created () {
    // 綁定監(jiān)聽
    this.$on("updateData1", (val)=>{
      this.val1 = val
    })
  }
})

// 數(shù)據(jù)發(fā)出組件

import bus from "xx/bus"
// 觸發(fā)在bus中已經(jīng)綁定好的事件
bus.$emit("update1", "123")

// 數(shù)據(jù)接收組件

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

正統(tǒng)的eventBus只是用來綁定觸發(fā)事件,并不關(guān)心數(shù)據(jù),不與數(shù)據(jù)發(fā)生交集。而這個方案多一步將數(shù)據(jù)直接添加在bus實例上。且事件監(jiān)聽與數(shù)據(jù)添加需提前定義好。

數(shù)據(jù)接收方不再使用$on來得知數(shù)據(jù)變化,而是通過計算屬性的特征被動接收。

解決的問題

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

多次綁定?綁定監(jiān)聽都在bus上,不會重復(fù)綁定。

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

探討 為什么使用計算屬性

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

data () {
  return {
    // 多一層結(jié)構(gòu)
    val: {
      result: 0
    }
  }
},
created () {
  this.$on("update1", val => {
    console.log("觸發(fā)1", i1++)
    this.val.result = val
  })
}

數(shù)據(jù)接收組件改為

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

可以看到,data中獲取直接修改值時值的數(shù)據(jù)是無法動態(tài)響應(yīng)的。

為什么要用事件

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

簡化版的vuex

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

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

那么可以用vuex中store對應(yīng)bus實例,state對應(yīng)dataaction對應(yīng)事件dispatch對應(yīng)$emit
同時vuex中組件獲取數(shù)據(jù)的方式正是通過計算屬性,那么其實vuexFlux架構(gòu)的理解和使用也沒有那么難。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/110099.html

相關(guān)文章

  • Vue.js 注意事項與技巧

    摘要:需要注意的是,同樣的行為也適用于。這意味著我們必須重新綁定每個事件。組件的由調(diào)用它的父組件提供,這意味著所有事件都應(yīng)該與父組件相關(guān)聯(lián)。 原文鏈接:Vue.js — Considerations and Tricks showImg(https://segmentfault.com/img/bVbqHOd?w=1600&h=1599); Vue.js 是一個很棒的框架。然而,當(dāng)你開始構(gòu)建...

    lsxiao 評論0 收藏0
  • 7個有用Vue開發(fā)技巧

    摘要:另外需要說明的是,這里只是凍結(jié)了的值,引用不會被凍結(jié),當(dāng)我們需要數(shù)據(jù)的時候,我們可以重新給賦值。1 狀態(tài)共享 隨著組件的細化,就會遇到多組件狀態(tài)共享的情況,Vuex當(dāng)然可以解決這類問題,不過就像Vuex官方文檔所說的,如果應(yīng)用不夠大,為避免代碼繁瑣冗余,最好不要使用它,今天我們介紹的是vue.js 2.6新增加的Observable API ,通過使用這個api我們可以應(yīng)對一些簡單的跨組件數(shù)...

    Godtoy 評論0 收藏0
  • 手摸手,帶你用vue擼后臺 系列五(v4.0新版本)

    摘要:同時增加了單元測試,使用了,增加了可視化配置權(quán)限,增加了自定義布局等等,優(yōu)化了原先的權(quán)限方案,支持不刷新頁面更新路由等等功能。雖然它的初衷是為了單元測試的,但正好滿足了我們的需求。它會重寫瀏覽器的對象,從而才能攔截所有請求,代理到本地。 前言 vue-element-admin 從 2017.04.17提交第一個 commit 以來,維護至今已經(jīng)有兩年多的時間了了,發(fā)布了四十多個版本,...

    MonoLog 評論0 收藏0
  • 手摸手,帶你用vue擼后臺 系列五(v4.0新版本)

    摘要:同時增加了單元測試,使用了,增加了可視化配置權(quán)限,增加了自定義布局等等,優(yōu)化了原先的權(quán)限方案,支持不刷新頁面更新路由等等功能。雖然它的初衷是為了單元測試的,但正好滿足了我們的需求。它會重寫瀏覽器的對象,從而才能攔截所有請求,代理到本地。前言 vue-element-admin 從 2017.04.17提交第一個 commit 以來,維護至今已經(jīng)有兩年多的時間了了,發(fā)布了四十多個版本,收獲了三...

    graf 評論0 收藏0
  • 封裝Vue組件一些技巧

    摘要:根據(jù)組件單向數(shù)據(jù)流和和事件通信機制,需要由子組件通過事件通知父組件,并在父組件中修改原始的數(shù)據(jù),完成狀態(tài)的更新。 本文同步在個人博客shymean.com上,歡迎關(guān)注 寫Vue有很長一段時間了,除了常規(guī)的業(yè)務(wù)開發(fā)之外,也應(yīng)該思考和反思一下封裝組件的正確方式。以彈窗組件為例,一種實現(xiàn)是在需要模板中引入需要彈窗展示的組件,然后通過一個flag變量來控制彈窗的組件,在業(yè)務(wù)代碼里面會充斥著冗余的彈...

    韓冰 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<