首頁 web前端 js教程 詳解如何實現vuex(詳細教學)

詳解如何實現vuex(詳細教學)

Jun 06, 2018 pm 02:18 PM
vuex 簡單 簡單使用

本篇文章主要介紹如何實現一個簡單的 vuex,現在分享給大家,也給大家做個參考。

首先我們需要知道為何要使用 vuex。父子元件通訊用 prop 和自訂事件可以搞定,簡單的非父子元件通訊用 bus(一個空的 Vue 實例)。那麼使用 vuex 就是為了解決複雜的非父子元件通訊。

只會使用 vuex 沒什麼,看過文檔敲擊程式碼大家都會。難道你不想知道 vuex 是如何實現的? !

拋開 vuex 的源碼,我們先來想想如何實作一個簡單的 "vuex"。有多簡單呢,我不要 getter、mutation、action 等,我只要 state 就行了。

非父子元件通訊

在實現之前,我們得來溫故一下bus 的實現,借用官網的例子:

var bus = new Vue()

// 触发组件 A 中的事件
bus.$emit('id-selected', 1)

// 在组件 B 创建的钩子中监听事件
bus.$on('id-selected', function (id) {
 // ...
})
登入後複製

遙想當年,實例化後的bus 不知放哪好,最後無奈將其放到了window 下,一直window.bus 的使用。雖然這樣也沒問題,但還是影響到了全域作用域。

突然的某一天,我發現可以掛載在vue 的根實例下(從此告別window.bus),於是便有了:

var app = new Vue({
 el: '#app',
 bus: bus
})

// 使用 bus
app.$options.bus

// or
this.$root.$options.bus
登入後複製

然後又發現了,bus 其實不只是on 事件才可以通訊。其實 bus 是 Vue 實例,其中 data 是回應的。例如在 app 這個根實例下有兩個非父子元件,都使用到了 bus 的 data,那麼它們是回應同步的。

var bus = new Vue({
 data: {
  count: 0
 }
})
登入後複製

以上,子元件 a 修改了 count,如果子元件 b 有用到 count,那麼它就能回應到最新 count 的值。

說了這麼多,你還沒發現嗎?這不就是實現了非組件之間通信,vuex 的 state 嗎? !

封裝 bus

是的,把剛剛的 bus 封裝一下,這就是一個最簡單的 "vuex" (只剩下 state 的功能)。首先,我們將有一個根實例 app ,實例下有兩個非父子元件 childA 和 childB 。

html 程式碼的實作如下:

<p id="app">
 <child-a></child-a>
 <child-b></child-b>
</p>
登入後複製

非父子元件的實作

然後是兩個非父子元件和app 的實現,子元件都使用到了bus 的count,這裡用store.state 表示,跟vuex 一致:

// 待实现
const store = new Store(Vue, {
 state: {
  count: 0
 }
})

// 子组件 a
const childA = {
 template: &#39;<button @click="handleClick">click me</button>&#39;,
 methods: {
  handleClick () {
   this.$store.state.count += 1
  }
 }
}

// 子组件 b
const childB = {
 template: &#39;<p>count: {{ count }}</p>&#39;,
 computed: {
  count () {
   return this.$store.state.count
  }
 }
}

new Vue({
 el: &#39;#app&#39;,
 components: {
  &#39;child-a&#39;: childA,
  &#39;child-b&#39;: childB
 },
 store: store
})
登入後複製

#看到程式碼裡還有一個Store 待實作。所需的參數,因為這裡懶得用 Vue.use() ,所以直接將 Vue 作為參數傳入以供使用,然後第二個參數跟我們使用 vuex 傳入的參數一致。

Store 的實作

接下來就是Store 的實現,兩步驟實作:

  1. 建立一個bus 實例;

  2. 讓子元件都能存取this.$store。

第1 步驟上面已經有了,第2 步驟主要用到了Vue.mixin 來全域混入,但只找到有store 的根實例並賦值Vue 原型上的store,也能讓根實例app 不用專門寫mixins 混入。

class Store {
 constructor (Vue, options) {
  var bus = new Vue({
   data: {
    state: options.state
   }
  })

  this.install(Vue, bus)
 }
 
 install (Vue, bus) {
  Vue.mixin({
   beforeCreate () {
    if (this.$options.store) {
     Vue.prototype.$store = bus
    }
   }
  })
 }
}
登入後複製

實現的 Store 就是一個簡單的 "vuex",它擁有了 vuex 的 state,足以讓非父子元件之間進行簡單通訊。

在 Store 的建構子裡建立一個 bus 實例,並將其註入 Vue 的原型,實作了元件都能存取到 this.$store 即 bus 實例。 this.$store 就是一個 Vue 實例,所以存取了 this.$store.state.count 其實就是存取到了 data,從而實現了非父子元件之間的回應同步。全部源碼參考這裡 。

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

相關文章:

使用node應用程式中timing-attack存在哪些安全漏洞

在vue元件傳遞物件中實作單向綁定,該怎麼做?

在Vue元件中如何使用 TypeScript的方法(詳細教學)

以上是詳解如何實現vuex(詳細教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

最簡單的硬碟序號查詢方式 最簡單的硬碟序號查詢方式 Feb 26, 2024 pm 02:24 PM

硬碟序號是硬碟的一個重要標識,通常用於唯一標識硬碟以及進行硬體識別。在某些情況下,我們可能需要查詢硬碟序號,例如在安裝作業系統、尋找正確裝置驅動程式或進行硬碟維修等情況下。本文將介紹一些簡單的方法,幫助大家查詢硬碟序號。方法一:使用Windows命令提示字元開啟命令提示字元。在Windows系統中,按下Win+R鍵,輸入"cmd"並按下回車鍵即可開啟命

如何使用Java來寫一個簡單的學生成績報表產生器? 如何使用Java來寫一個簡單的學生成績報表產生器? Nov 03, 2023 pm 02:57 PM

如何使用Java來寫一個簡單的學生成績報表產生器?學生成績報表產生器是可以幫助老師或教育者快速產生學生成績報告的工具。本文將介紹如何使用Java來撰寫簡單的學生成績報表產生器。首先,我們要定義學生對象和學生成績對象。學生對象包含學生的姓名、學號等基本訊息,而學生成績對象則包含學生的科目成績和平均成績等資訊。以下是一個簡單的學生物件的定義:public

如何透過PHP編寫一個簡單的線上預約系統 如何透過PHP編寫一個簡單的線上預約系統 Sep 26, 2023 pm 09:55 PM

如何透過PHP編寫一個簡單的線上預約系統隨著網路的普及和使用者對便利性的追求,線上預約系統越來越受到歡迎。無論是餐廳、醫院、美容院或其他服務業,都可以透過簡單的線上預約系統來提高效率並為使用者提供更好的服務體驗。本文將介紹如何使用PHP編寫一個簡單的線上預約系統,並提供具體的程式碼範例。建立資料庫和表格首先,我們需要建立一個資料庫來儲存預約資訊。在MyS

MySQL表設計指南:建立一個簡單的員工考勤表 MySQL表設計指南:建立一個簡單的員工考勤表 Jul 01, 2023 pm 01:54 PM

MySQL表設計指南:建立一個簡單的員工考勤表在企業管理中,員工的考勤管理是至關重要的任務。為了準確記錄和統計員工的考勤情況,我們可以利用MySQL資料庫來建立一個簡單的員工考勤表。本篇文章將指導您如何設計和建立這個表,並提供相應的程式碼範例。首先,我們需要確定員工考勤表所需的欄位。一般來說,員工考勤表至少需要包含以下欄位:員工ID、日期、上班時間、下班時

快速入門:使用Go語言函數實現簡單的圖書管理系統 快速入門:使用Go語言函數實現簡單的圖書管理系統 Jul 30, 2023 am 09:18 AM

快速入門:使用Go語言函數實現簡單的圖書管理系統引言:隨著電腦科學領域的不斷發展,軟體應用的需求也越來越多樣化。圖書管理系統作為常見的管理工具,也成為許多圖書館、學校和企業必備的系統之一。在本文中,我們將使用Go語言函數來實作一個簡單的圖書管理系統。透過這個例子,讀者可以學習到Go語言中函數的基本用法以及如何建立一個實用的程式。一、設計思路:我們首先來

如何透過C++寫一個簡單的掃雷遊戲? 如何透過C++寫一個簡單的掃雷遊戲? Nov 02, 2023 am 11:24 AM

如何透過C++寫一個簡單的掃雷遊戲?掃雷遊戲是一款經典的益智類遊戲,它要求玩家根據已知的雷區佈局,在沒有踩到地雷的情況下,揭示所有的方塊。在這篇文章中,我們將介紹如何使用C++來寫一個簡單的掃雷遊戲。首先,我們需要定義一個二維陣列來表示掃雷遊戲的地圖。數組中的每個元素可以是一個結構體,用於儲存方塊的狀態,例如是否揭示、是否有雷等資訊。另外,我們還需要定義

如何透過C++寫一個簡單的音樂推薦系統? 如何透過C++寫一個簡單的音樂推薦系統? Nov 03, 2023 pm 06:45 PM

如何透過C++寫一個簡單的音樂推薦系統?引言:音樂推薦系統是現代資訊科技的研究熱點,它可以根據使用者的音樂偏好和行為習慣,向使用者推薦符合其口味的歌曲。本文將介紹如何使用C++來寫一個簡單的音樂推薦系統。一、收集用戶資料首先,我們需要收集用戶的音樂偏好資料。可以透過線上調查、問卷調查等方式來獲得使用者對不同類型音樂的喜好程度。將資料保存在一個文字檔案或資料庫

使用ubuntu安裝cmake及其簡單使用方法 使用ubuntu安裝cmake及其簡單使用方法 Jan 01, 2024 am 08:57 AM

前言最近突然想將開發環境轉移到Linux上,同時也準備閱讀些github上的開源程式碼,發現現在開源專案一般都是用cmake管理的。所以就在自己的虛擬機器上搗鼓。一開始我也不知道cmake是啥,後來透過折騰也大概知道其作用,它所做的事其實就是告訴編譯器如何去編譯連結原始碼。你也許想問不是有makefile嗎,為什麼還要它?這裡就牽涉到跨平台問題。在windows平台下是透過project檔案去管理這些的,如果不用cmake,那我們為window和linux系統就要寫對應的project檔案和make

See all articles