這篇文章主要介紹了nuxt踩坑之Vuex狀態(tài)樹的模塊方式怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)公司專注于固安企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),電子商務(wù)商城網(wǎng)站建設(shè)。固安網(wǎng)站建設(shè)公司,為固安等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)Vuex狀態(tài)樹-模塊方式官方文檔解讀
狀態(tài)樹還可以拆分成為模塊,store 目錄下的每個 .js 文件會被轉(zhuǎn)換成為狀態(tài)樹指定命名的子模塊
這句話啊,看了半天,我都沒繞出來。之前一直用的是store目錄下文件為:index.js、state.js、mutations.js、actions.js。后三個是index.js的子模塊,你說這每個js文件都是一個模塊?懵逼一分鐘
繼續(xù)往下:使用狀態(tài)樹模塊化的方式,store/index.js 不需要返回 Vuex.Store 實例,而應(yīng)該直接將 state、mutations 和 actions 暴露出來。 到這里我雖然還懵逼著,但是轉(zhuǎn)念一想,nuxt還有這操作,都不用我們自己辛辛苦苦寫export default store = () => new Vuex.Store({}) 了,倒也真的省事兒呢
還是繼續(xù)看例子吧,官方給的這個,看了一遍沒看懂(笨小孩的世界真滴難),你這index.js不是Vuex默認的store文件么,再來一todos.js,同樣暴露出去的對象,不應(yīng)該是index.js同級的么
重點來了,看不會不要緊,照貓畫虎我還是會滴~
照貓畫虎
// store/index.js export const state = () => ({ num: 0 }) export const mutations = { increment (state) { state.num ++ }, decrement (state) { state.num -- } } // store/plus.js export const state = () => ({ plusNum: 1 }) export const mutations = { plus (state) { state.plusNum ++ } } // store/minus.js export const state = () => ({ minusNum: 10 }) export const mutations = { minus (state) { state.minusNum -- } } // pages/store.vue <template> <section class="container"> <table> <tr> <td colspan=4>vuex狀態(tài)樹使用</td> </tr> <tr> <td>頁內(nèi)數(shù)據(jù)</td> <td>index.js</td> <td>plus.js</td> <td>minus.js</td> </tr> <tr> <td>{{ count }}</td> <td>{{ $store.state.num }}</td> <td>{{ $store.state.plus.plusNum }}</td> <td>{{ $store.state.minus.minusNum }}</td> </tr> <tr> <td></td> <td></td> <td></td> <td></td> </tr> </table> </section> </template>
跑一下,??!報錯了,我說同學(xué)們啊,我寫的真的沒有錯?。。?/p>
好吧,報錯內(nèi)容:[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.
意思是我客戶端和vue SSR生成的DOM不一樣,客戶端不也是SSR生成的,這是個問題,有知道的大佬,希望可以告訴我。
不過這個問題我倒是解決了,雖然不知道問什么-_-!,把那一大堆的tr標(biāo)簽都放到tbody里面就OK了
跑起來,沒問題,按示例的寫法,這樣成功拿到了state的數(shù)據(jù)
接著試試mutation的方法
<tr class="mutation-fun"> <td @click="count ++">count ++</td> <td @click="$store.commit('increment')">increment</td> <td @click="$store.commit('plus')">plus</td> <td @click="$store.commit('minus')">minus</td> </tr>
報錯:[vuex] unknown mutation type: plus
修改下:
<tr class="mutation-fun"> <td @click="count ++">count ++</td> <td @click="$store.commit('increment')">increment</td> <td @click="$store.commit('plus/plus')">plus/plus</td> <td @click="$store.commit('minus/minus')">minus/minus</td> </tr>
搞定~
自己先小結(jié)下這個模塊怎么用的吧
nuxt很貼心的幫我們省去了返回Vuex實例的代碼,我們可以不用去寫了
只有store文件夾下的index.js是一級的vuex狀態(tài),其他的js文件都是二級的狀態(tài)樹。(能不能有三級的我不知道,不過感覺沒必要,哈哈哈!?。?/p>
每個狀態(tài)樹文件都可以包含state,mutation,action
使用二級狀態(tài)樹的state用: $store.state.文件名.變量名
使用二級狀態(tài)樹的mutation用: $store.commit(‘文件名/變量名')
使用二級狀態(tài)樹的action用: $store.dispatch(‘文件名/變量名')
官方示例沒有提到的
二級狀態(tài)樹能調(diào)用一級狀態(tài)樹的state和mutation以及action嗎?
我們來給plus.js增加一個修改index.js中的state的方法plusIndex
export const state = () => ({ plusNum: 1 }) export const mutations = { plus (state) { state.plusNum ++ }, plusIndex (state) { state.num ++ console.log('點擊遞增index的num') } }
去試著調(diào)用了一下,文本打印出來了,也沒有報錯,但是完全獲取不到index中的num哇~~
這次聰明點兒,我直接把state打印出來:
export const state = () => ({ plusNum: 1 }) export const mutations = { plus (state) { state.plusNum ++ }, plusIndex (state) { console.log('state: ', state) state.num ++ } }
跑一下試試: 結(jié)果有點兒讓人想哭:state: {num: NaN, plusNum: 1}。再看看頁面上index.js對應(yīng)的num依然是0,這就說明我們這里的num不是index.js里的num,而是下面state ‘.'(點)出來的num,并且沒有給初始值就執(zhí)行了一次 ++ ,所以值為NaN
到這里,我已經(jīng)大概猜測到了這里的彎彎繞是怎么回事兒了 –> 模塊兒的作用域是本文件內(nèi)。但編程不是靠猜的,要用實踐證明的才是對的,下面在深究這個問題
反過來,一級狀態(tài)樹能調(diào)用二級狀態(tài)樹的state和mutation以及action嗎?
這里的情況跟上面一樣,既然我們的這個store是模塊方式生成的,那就要遵循模塊化的規(guī)范,變量作用域只能在文件內(nèi)
通過模塊化編程規(guī)范來獲取一級狀態(tài)樹的state
先把index.js引過來,因為不放心引用過來的還是不是原來那個index.js,所以把它打印出來看看
const indexVuex = require('./index.js') console.log('indexVuex: ', indexVuex)
這下不就炸了嘛,我引過來的居然是一個空的vuex狀態(tài)樹!!!內(nèi)容長這樣子
{ mutation: {}, modules: { plus: { mutation: {}, namespaced: true }, minus: { mutation: {}, namespaced: true } }, namespaced: true }
好吧,我這個用模塊化的方式來使用其他文件內(nèi)的變量的想法也是泡湯了
最后的讓步,我在組件中調(diào)用狀態(tài)樹時再去用二級狀態(tài)樹的方法修改一級狀態(tài)樹的state,先試試:
// plus.js export const state = () => ({ plusNum: 1 }) export const mutations = { plus (state) { state.plusNum ++ }, plusIndex (state, meio) { meio ++ console.log('meio: ', meio) } } // 調(diào)用: <td @click="$store.commit('plus/plusIndex', $store.state.num)">遞增index的num</td>
點擊后,依然沒能修改index.js中的num,查看打印結(jié)果中一直都是1,也就是說我們傳進去的是基本數(shù)據(jù)類型的0~~
那修改一下,我們傳進去一個引用數(shù)據(jù)類型的看看可以不
// plus.js export const state = () => ({ plusNum: 1 }) export const mutations = { plus (state) { state.plusNum ++ }, plusIndex (state, meio) { meio.num ++ console.log('meio: ', meio.num) } } // 調(diào)用: <td @click="$store.commit('plus/plusIndex', $store.state)">遞增index的num</td>
感謝你能夠認真閱讀完這篇文章,希望小編分享的“nuxt踩坑之Vuex狀態(tài)樹的模塊方式怎么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
網(wǎng)站名稱:nuxt踩坑之Vuex狀態(tài)樹的模塊方式怎么用-創(chuàng)新互聯(lián)
URL地址:http://vcdvsql.cn/article14/jiede.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、微信公眾號、響應(yīng)式網(wǎng)站、企業(yè)建站、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容