首頁 >web前端 >js教程 >VueX中狀態管理器的應用

VueX中狀態管理器的應用

不言
不言原創
2018-08-04 10:05:031511瀏覽

這篇文章跟大家介紹的內容是關於VueX中狀態管理器的應用,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

VueX狀態管理器

cnpm i vuex axios -S
1 创建Vuex 仓库
import Vue from 'vue'
import Vuex from 'vuex'
vue.use(Vuex)
const store = new VueX.store({
    state: {//存放状态},
    mutations:{//唯一修改状态的地方,不在这里做逻辑处理}
})
export default store

2 在入口文件main.js下引入store
import store from './store/index.js'
将store 放到根实例里  以供全局使用
new Vue({
    el:'#app',
    store,
    components:{App},
    template:<App/>
})
开始使用store(以home组件为例)

Vuex的使用也是一種漸進式的,你可以從最簡單的開始使用,根據經驗和技術的增加,再漸進增強對它的使用,如果按照等級算vuex的使用可以從最基本的t1等級開始,先總結最基本的前三個版本,後續有時間再總結其他的。

T1等級

1.
在hoome/script.js中进行请求数据
import Vue from 'vue'
import axios from 'axios'
export default {
    mounted(){
        axios.get('请求数据的接口')
        .then((res)=>{this.$store.commit('changeList',res.data)})
           //changeList相当于调用了在store.mutations中定义的修改状态的方法
                    //res.data  就是在改变状态时要修改的数据,需要在这传递过去。
        .catch((err)=>{console,log(err)})
        }
    }
2.
在store/index.js中定义
import Vue from 'vue'
import Vuex from 'vuex'
vue.use(Vuex)
const store = new VueX.store({
    state: {
        //存放状态
        list: [ ]     //存放一个空的数组
},
    mutations:{
        //唯一修改状态的地方,不在这里做逻辑处理
        //定义一个修改list的方法
            //state 指上面存放list的对象,data 为在请求数据出传过来请求到的数据
        changeList (state,data) {
            state.list = data  //将请求来的数据赋值给list
      }
    }
   })
export default store

3.
在home/index.vue中渲染
<template>
    //渲染数据的时候通过this.store.state.list直接从store中取数据
    //还可以从其他组件通过这种方法去用这个数据无需重新获取
    <li v-for=&#39;item of this.store.state.list&#39; :key=&#39;item.id&#39;>{{item.name}}</li>
</template>

注意點:如果我們在home元件中取得的數據,可以在其他元件中使用,但是當頁面刷新預設進入home頁,也就是相當於修改了數據,再點擊其他頁面也能有數據。如果我們在user元件中取得的資料要在home元件中使用,當頁面重新整理資料是不會顯示的,因為此時還沒有觸發user元件中的變更資料的方法,所以資料為空,當點擊user頁面時,就會有數據,這時候再去點擊home頁面我們就能夠看到在home 元件中使用user元件中取得的數據了。解決這種問題的辦法可以將資料存到本地一份或都在首頁進行請求資料

#T2等級

在頁面進行渲染的時候我們需要透過this.store.state去拿數據,這樣的寫法太長而且不太好
用計算屬性結合mapState去解決這個問題

1
在home/script.js中进行操作
import Vue from 'vue'
import mapState from 'vuex'
import axios from 'axios'
export default {
    computed:{
        //mapState为辅助函数
        ...mapState(['list'])
    },
    mounted(){
        axios.get('请求数据的接口')
        .then((res)=>{this.$store.commit('changeList',res.data)})
        .catch((err)=>{console,log(err)})
        }
    }

2
在home/index.vue中渲染
<template>
    <li v-for=&#39;item of  list&#39; :key=&#39;item.id&#39;>{{item.name}}</li>
</template>

T3級別

使用常數去代替事件類型(方便查看狀態,利於維護)

    1
    在store下创建mutation-type.js
    export const  CHANGE_LIST = 'CHANGE_LIST'
    
    2
    在store/index.js引入mutation-type.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    import {CHANGE_LIST }  from‘./mutation-type.js’
    vue.use(Vuex)
    const store = new VueX.store({
        state: {
            list: [ ]     //存放一个空的数组
    },
        mutations:{
        //我们可以使用Es6风格的计算属性命名功能来使用一个常量作为函数名
            [CHANGE_LIST] (state,data) {
                state.list = data  //将请求来的数据赋值给list
          }
        }
       })
    export default store
    
    3
    在home/script.js中进行引入
    import Vue from 'vue'
    import mapState from 'vuex'
    import axios from 'axios'
    import {CHANGE_LIST} from ‘../../store/mutation-type.js’
    export default {
        computed:{
            //mapState为辅助函数
            ...mapState(['list'])
        },
        mounted(){
            axios.get('请求数据的接口')
            .then((res)=>{this.$store.commit(CHANGE_LIST,res.data)})
            .catch((err)=>{console,log(err)})
            }
        }

相關文章推薦:

vue中權限控制動態路由的建立流程(圖文)

vue指令與$nextTick操作DOM有何不同?

以上是VueX中狀態管理器的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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