<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
        主站蜘蛛池模板: 免费看内射乌克兰女| 无码人妻精品一二三区免费| 久久成人18免费网站| 国产成人无码精品久久久免费| 七色永久性tv网站免费看| 一个人免费观看在线视频www| 免费中文字幕在线观看| 亚洲av无码不卡| 亚洲sss综合天堂久久久| 白白色免费在线视频| 久久午夜羞羞影院免费观看 | 亚洲爆乳无码专区| 亚洲啪啪免费视频| a级毛片黄免费a级毛片| 永久中文字幕免费视频网站| 亚洲va在线va天堂va888www| 国产精品亚洲综合一区在线观看| 哒哒哒免费视频观看在线www| 五月婷婷免费视频| 免费欧洲美女牲交视频| 亚洲午夜精品在线| 日本无吗免费一二区| 亚洲国产精品人久久电影| 中文字幕免费观看视频| 吃奶摸下高潮60分钟免费视频| www免费黄色网| 久久久久久亚洲Av无码精品专口| 边摸边吃奶边做爽免费视频99 | 亚洲首页国产精品丝袜| 亚洲精品偷拍视频免费观看| 亚洲国产精品无码av| 最近的中文字幕大全免费版| 香港经典a毛片免费观看看| 国产精品久久久亚洲| 精品久久久久国产免费| 亚洲免费在线观看视频| 亚洲国产成人久久精品99| 亚洲xxxxxx| 成人人观看的免费毛片| 亚洲一卡2卡3卡4卡5卡6卡 | 亚洲精品无码久久久久YW|