vue中使用vuex詳解

vue中使用vuex

首先創建一個store文件夾 在srore文件夾下 創建一個index.jx文件(文件夾命名看個人愛好)

State的使用(類似vue實列中的data數據源,來存取數據)

index.js文件中的內容

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
    state:{
        count:0
    }
})
export default store

father.vue中的內容,獲取state中的值

<template>
  <div>
   Store的使用
   vue中的state的count值:{{count}}
  </div>
</template>
 
<script>
import { mapState } from 'vuex'
export default {
  data() {
    return {
     msg:1
    };
  },
 computed:{
  //  基本獲取
  // count(){
  //  return this.$store.state.count
  // },
   
   // 利用輔助函數獲取state中的值 首先要先導入
   // ...mapState({
        // 第一種方法
        // count: state => state.count,

        // 第二種 // 傳字符串參數 'count' 等同於 `state => state.count`
         //count: 'count'
        //第三種想要使用this獲取局部狀態  必須使用常規函數
    //     count(state){
    //    return state.count + this.msg
    //     }
  //  })
  //也可以這樣
  ...mapState(['count'])
 },
};
</script>
<style  scoped>
</style>

頁面效果

在這裏插入圖片描述

getter的使用(類似vue實列中的計算屬性,依賴宇state)

index.js文件中的內容

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
    state:{
        todos: [
            { id: 1, text: 'name1', done: true },
            { id: 2, text: 'name2', done: false }
          ]
    },
    getters: {
        // 傳一個參數,state就是vuex中state中的所有值
        doneTodos: state => {  //依賴於state中的值 類似計算屬性
          return state.todos.filter(todo => todo.done)  //過濾  只返回todo.done爲true的值
        },
     // 還可以傳兩個參數,第一個state就是vuex中state中的所有值,也可以接收也可以接受其他 getters 作爲第二個參數:
     doneTodosCount:((state,getters)=>{
        return getters.doneTodos.length
     }),
     //你也可以通過讓 getter 返回一個函數,來實現給 getter 傳參。在你對 store 裏的數組進行查詢時非常有用。
      getTodoById: (state) => (id) => {
       return state.todos.find(todo => todo.id === id)
  }
      }
})


export default store

brothr.vur中的neir

<template>
  <div>
    <p>getter的使用</p>
    <p v-for="(item,index) in doneTodos" :key="index" v-text="item.text"></p>
    <p>{{doneTodosCount}}</p>
    <p v-text="getTodoById(2).text"></p>
  </div>
</template>

<script>
import { mapGetters } from "vuex";
export default {
  data() {
    return {};
  },
  created() {},
  computed: {
    //基本獲取
    //    doneTodos(){
    //        return this.$store.getters.doneTodos
    //    },
    //    //接收vuex中的getter中的doneTodos
    //     doneTodosCount(){
    //        return this.$store.getters.doneTodosCount
    //    },
    //    //調用接收vuex中的getter返回的函數getTodoById
    //    getTodoById(){
    //         console.log(this.$store.getters.getTodoById(2))
    //      return this.$store.getters.getTodoById(2)

    //    },
    //利用計算屬性來獲取vuex中的getter 注意:先import導入
    ...mapGetters(["doneTodos", "doneTodosCount", "getTodoById"])
    //  如果你想將一個 getter 屬性另取一個名字,使用對象形式:
    // ...mapGetters({
    //   // 把 `this.doneCount` 映射爲 `this.$store.getters.doneTodosCount`
    //   done: 'doneTodos',
    //  doneTodos:doneTodosCount,
    //   getTodoBy:'getTodoById'
    // })
  }
};
</script>

<style scoped>
</style>

頁面展示效果

在這裏插入圖片描述

Mutation的使用(同樣依賴於state中的數據)

注意:Mutation 必須是同步函數

index.js中的內容

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
    state:{
       count:1
    },
    //Mutation 必須是同步函數
    mutations:{
        add1(state){
            state.count++;
        },
        //當然你也可以傳額外的參數  當然num也可以是一個對象
        add2(state,num){
            state.count+=num;
        }
        // add2(state,obj){
        //     state.count+=obj.num;
        // }
    }
})


export default store

father.vue中的內容

<template>
  <div>
   Mutation的使用
   vue中的state的count值:{{count}}
   <p><button @click="add">點擊調用vuex中的Mutation方法</button></p>
    <p><button @click="adds(5)">點擊調用vuex中的Mutation方法</button></p>
  </div>
</template>
 
<script>
import { mapState } from 'vuex'
import { mapMutations  } from 'vuex'
export default {
  data() {
    return {
     msg:1
    };
  },
 computed:{
  ...mapState(['count'])
 },

  methods:{
    //add(){
    //  this.$store.commit('add1')
     //this.$store.commit('add2',5) //傳字符串 或者 number類型的寫法 
    // this.$store.commit('add2',{num:5}) 這樣寫 傳對象  或者下邊這樣的寫法
    // this.$store.commit({
    //   type:'add2',
    //   num:5
    // })
    //利用輔助函數 一樣先import導入
    
    //},
    //  ...mapMutations(['add1','add2']),
    // 或者可以換個命名 用對象的形式
    ...mapMutations({
      add:'add1',
      adds:'add2'
    })
  }
};
</script>
<style  scoped>
</style>

頁面展示

在這裏插入圖片描述

Action的使用(可以進行異步的操作,同樣可以結合Promise使用,具體例子看官網https://vuex.vuejs.org/zh/guide/actions.html

index.js中的內容

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
const store = new Vuex.Store({
    state:{
       count:1
    },
    //Mutation 必須是同步函數
    mutations:{
        add1(state){
        state.count++;
        },
        //當然你也可以傳額外的參數  當然num也可以是一個對象
        add2(state,num){
            state.count+=num;
        }
        // add2(state,obj){
        //     state.count+=obj.num;
        // }
    },
    //可以進行異步操作  用法和Mutation基本類似 都可以傳參  只不過觸發方法不一樣。
    actions:{
        add1(context){ //或者通過 context.state 和 context.getters 來獲取 state 和 getters。
            context.commit('add1')
        },
        add2({commit}){
            //actions不受限制 可以執行異步操作
            setTimeout(() => {
                commit('add2',5)
            }, 1000);
        }
    }
})


export default store

father.vue中的內容

<template>
  <div>
   Mutation的使用
   vue中的state的count值:{{count}}
  <p><button @click="add">點擊調用vuex中的Mutation的add1方法</button></p>
  <p><button @click="adds(5)">點擊調用vuex中的Mutation的add2方法</button></p>
 <p><button @click="addAction1">點擊調用vuex中的Action的add1方法</button></p>
  <p><button @click="addAction2">點擊調用vuex中的Action的add2方法</button></p>
  </div>
</template>
 
<script>
import { mapState } from 'vuex'
import { mapMutations  } from 'vuex'
import { mapActions  } from 'vuex'
export default {
  data() {
    return {
     msg:1
    };
  },
 computed:{
  ...mapState(['count'])
 },
  created(){
  
  },
  methods:{
    //add(){
    //  this.$store.commit('add1')
     //this.$store.commit('add2',5) //傳字符串 或者 number類型的寫法 
    // this.$store.commit('add2',{num:5}) 或者像下邊這樣寫 傳對象
    // this.$store.commit({
    //   type:'add2',
    //   num:5
    // })
    //利用輔助函數 一樣先import導入
    
    //},
    //  ...mapMutations(['add1','add2']),
    // 或者可以換個命名 用對象的形式
    ...mapMutations({
      add:'add1',
      adds:'add2'
    }),
    addAction1(){
    this.$store.dispatch('add1')
    },
    addAction2(){
    this.$store.dispatch('add2')
    }
    //同樣利用輔助函數 一樣先import導入 和mapMutations用法一樣 這裏就不一一詳細介紹
  }
};
</script>
<style  scoped>
</style>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章