• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    詳解如何實現一個簡單的 vuex

    來源:懂視網 責編:小采 時間:2020-11-27 22:19:35
    文檔

    詳解如何實現一個簡單的 vuex

    詳解如何實現一個簡單的 vuex:首先我們需要知道為何要使用 vuex。父子組件通信用 prop 和自定義事件可以搞定,簡單的非父子組件通信用 bus(一個空的 Vue 實例)。那么使用 vuex 就是為了解決復雜的非父子組件通信。 僅僅會使用 vuex 沒什么,看過文檔敲敲代碼大家都會。難道你就不想知道
    推薦度:
    導讀詳解如何實現一個簡單的 vuex:首先我們需要知道為何要使用 vuex。父子組件通信用 prop 和自定義事件可以搞定,簡單的非父子組件通信用 bus(一個空的 Vue 實例)。那么使用 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 代碼的實現如下:

    <div id="app">
     <child-a></child-a>
     <child-b></child-b>
    </div>
    

    非父子組件的實現

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

    // 待實現
    const store = new Store(Vue, {
     state: {
     count: 0
     }
    })
    
    // 子組件 a
    const childA = {
     template: '<button @click="handleClick">click me</button>',
     methods: {
     handleClick () {
     this.$store.state.count += 1
     }
     }
    }
    
    // 子組件 b
    const childB = {
     template: '<div>count: {{ count }}</div>',
     computed: {
     count () {
     return this.$store.state.count
     }
     }
    }
    
    new Vue({
     el: '#app',
     components: {
     'child-a': childA,
     'child-b': 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,從而實現了非父子組件之間的響應同步。全部源碼參考這里 。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    詳解如何實現一個簡單的 vuex

    詳解如何實現一個簡單的 vuex:首先我們需要知道為何要使用 vuex。父子組件通信用 prop 和自定義事件可以搞定,簡單的非父子組件通信用 bus(一個空的 Vue 實例)。那么使用 vuex 就是為了解決復雜的非父子組件通信。 僅僅會使用 vuex 沒什么,看過文檔敲敲代碼大家都會。難道你就不想知道
    推薦度:
    標簽: 有一個 VUE 詳解
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 2022国内精品免费福利视频| 国产在线精品免费aaa片| 最新在线精品国自av| 午夜精品久久久久久99热| 亚洲视频精品在线| 久久Av无码精品人妻系列| 久久精品中文字幕第23页| 日韩精品在线看| 国产精品视频一区二区三区四| 久久久人妻精品无码一区| 欧美亚洲国产精品久久蜜芽| 99久久99久久精品免费看蜜桃| 亚洲综合国产精品第一页| 精品日韩在线视频一区二区三区| 国产精品一区二区久久| 久久精品国产第一区二区三区| 三级高清精品国产| 欧美精品黑人粗大欧| 国产乱码精品一区二区三| 欧美激情精品久久久久| 高清免费久久午夜精品| 国产在线精品免费aaa片| 亚洲AV无码国产精品麻豆天美| 日本精品夜色视频一区二区| 国产精品伊人久久伊人电影| 98精品国产自产在线XXXX| 久久精品成人免费看| 国产成人精品福利网站在线| 国产精品亚洲A∨天堂不卡| 精品人妻无码一区二区色欲产成人| 亚洲国模精品一区| 亚洲精品无码日韩国产不卡?V| 精品国产福利盛宴在线观看| 国产精品一区二区三区99 | 国产精品一区二区久久不卡| 亚洲精品美女久久777777| 亚洲人成国产精品无码| 亚洲线精品一区二区三区 | 久久精品无码免费不卡| 精品国产亚洲男女在线线电影 | 中文无码久久精品|