<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 国产黄色片免费看| 亚洲免费一区二区| 曰批全过程免费视频播放网站| 亚洲毛片网址在线观看中文字幕| 国产精品亚洲专区无码不卡| 国产免费观看黄AV片 | 成人无遮挡毛片免费看| 亚洲激情校园春色| 青娱分类视频精品免费2| 亚洲欧洲一区二区| 67194国产精品免费观看| 亚洲天堂一区二区三区| 一色屋成人免费精品网站| 亚洲av成人综合网| 啦啦啦在线免费视频| 亚洲AV女人18毛片水真多| 亚洲国产成人五月综合网| 中文字幕在线视频免费| 亚洲嫩草影院久久精品| 最近中文字幕mv免费高清在线| 91亚洲自偷手机在线观看| aa级一级天堂片免费观看| 亚洲欧美熟妇综合久久久久| 又大又硬又爽免费视频| 两个人看的www免费| 久久丫精品国产亚洲av不卡| 毛片免费观看视频| 亚洲一区二区三区免费| 亚洲国产成人一区二区精品区 | 亚洲国产日韩在线视频| 51精品视频免费国产专区| 亚洲看片无码在线视频| 亚洲成人一区二区| 日韩精品无码免费专区午夜不卡| 亚洲精品第一国产综合精品| 国产无遮挡吃胸膜奶免费看视频| 人人揉揉香蕉大免费不卡| 亚洲日韩AV一区二区三区中文 | 91在线免费视频| 亚洲影视一区二区| 亚洲精品和日本精品|