vuex使用

104 阅读2分钟

vuex:

概念:vuex是一个组件之间的公共数据库,一般用于组件的数据调用、账号权限、登录退出

1、npm i vuex 安装vuex
2、使用vuex,在src目录下声明一个store.js的文件,在文件中声明vuex

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

3、实例化对象
对外暴漏一个const store实例一个对象

const store = new Vuex.Store({
    state: {
    //存储数据(对象形式)
    },
    getters: {
    //计算属性
    },     
    mutations: {
    // 用来修改state和getters里面的数据(动作)
    },
    actions: {
    //vuex中的异步请求
    }
})

export default store;

举例:

const store = new Vuex.Store({
    state: {
    num:1
    },
    getters: {
    //计算属性
    },     
    mutations: {
       addnum(state,usernum){
         state.num=usernum
       }
      
    },
    actions: {
    //vuex中的异步请求
    }
})

export default store;

4、使用
在main.js里面引用vuex。 在该页面调用 this.$store.state.num

举例(根据上面vuex为基础):

//可以使用vuex中的mutations属性,来进行对vuex内数据修改
heml部分:
<button @click='addnum'>修改数据++<button>
js部分:
methods:{
 addnum(){
 this.$store.commit("addnum",++this.$store.state.num)
 }
}
vuex中的数据进行修改

进阶

actions存储用户登录后的信息:
用户信息一般未obj格式,所以需要在登录完成后,调用vuex内方法,进行存储
例:

const store = new Vuex.Store({
    state: {
    userinfo:{},
    },
    getters: {
    //计算属性
    },     
    mutations: {
       
       //存在异步问题
       setinfo(state,login){
       //login为保存的信息,当login为对象形式时,可直接“=”
          state.userinfo=login
       }
      
    },
    // actions 里面不能直接修改数据  解决异步
    //context是一个对象,具有 store 相同的方法/属性
    actions: {
       getinfo(context,login){
        //模拟异步请求
        setTimeout(()=>{
        context.commit("setinfo",login)
        },1000)
        
       }
    }
})

export default store;



//组件中的操作
   methods:{
    log(){
    this.$store.dispatch('getinfo',{
         phone:1,
         key:123456
      })
     }
    }

gettersstore的计算属性,getter的返回值根据他的依赖存起来,只有当他依赖发生变化才会被重新计算。
接受state作为第一个参数,store.getters对象,可以通过属性访问值


const store = new Vuex.Store({
    state: {
    name:'张三'
    },
    getters: {
     gettername(state){
       console.log("getters里面方法执行")
       return state.name+'·尼古拉'
       }
    },     
    mutations: {
    // 用来修改state和getters里面的数据(动作)
    },
    actions: {
    //vuex中的异步请求
    }
})

export default store;

//组件中使用
{{this.$store.getters.gettername}}

辅助函数 mapGetters

//组件中
import { mapGetters } from 'vuex'
computed:{
   ...mapGetters{['gettername']}    //将gerrers数据映射过来
   
}

//使用:{{gettername}}

辅助函数 mapState

//组件中
import { mapState } from 'vuex'
computed:{
   ...mapState{['name']}    //将State数据映射过来
   
}

//使用:{{name}}

辅助函数 mapMutations

const store = new Vuex.Store({
    state: {
    num:10
    },
    getters: {
     gettername(state){
       console.log("getters里面方法执行")
       return state.name+'·尼古拉'
       }
    },     
    mutations: {
       numdd(state,payload){
         state.num=state.num + payload.num
       }
    },
    actions: {
    //vuex中的异步请求
    }
})

export default store;
//------------------------------------------


import { mapMutations } from 'vuex'
//方法里面
methods:{
  ...mapMutations(['numdd'])
}

//htem
<button @click="numdd(num:3)">
加3  通过mapMutations
</button>

辅助函数 mapActions

const store = new Vuex.Store({
    state: {
    userinfo:{},
    },
    getters: {
    //计算属性
    },     
    mutations: {
       //存在异步问题
       setinfo(state,login){
       //login为保存的信息,当login为对象形式时,可直接“=”
          state.userinfo=login
       }
      
    },
    actions: {
       getinfo(context,login){
        //模拟异步请求
        setTimeout(()=>{
        context.commit("setinfo",login)
        },1000)
        
       }
    }
})

export default store;
//-------------------------------
import { mapActions } from 'vuex'
//方法里面
methods:{
  ...mapMutations(['getinfo'])
}
//html

<button @click="getinfo({phone:phone})">
</button>