vue-vuex

一、vuex的基本搭建

如果我们在创建项目的时候并没有勾选vuex的功能,我们需要通过在文件夹当前集成终端中输入以下代码进行安装vuex

npm install vuex --save

创建完之后vuex会自动帮我们在store里边创建好index.js

二、vuex-state(存储项目使用的数据)

我们在vuex给我们创建的index.js中找到state对象,在里边写入我们需要的数据,以我下边写的代码为例子,我再去state中存储了用户的相关信息

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    user:{
      name:"xingxing",
      sex:"男",
      age:18
    }
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

当我们需要在对应组件取到这个数据的时候需要在vue的原型对象上找,我们可以通过this.$store.state来找到我们定义的state里边的内容,我们于是可以像下边这样取到我们在state中定义的数据 ,这样我们就取到了我们刚刚定义的user中dename属性,当然我们也可以通过计算属性手写返回我们state中的数据

<template>
    <div>
        <h2>
            欢迎来到我的网站,
            {{this.$store.state.user.name}}
         
            
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{

    }

</script>

三、vuex-mutations(改变state中的数据,只有这个里边能修改state中的数据)

1.我们用以下代码做一个计数器的案例,我们首先在state中定义一个count作为计数器的当前数值(初始为0),通过计算属性显示到页面上;第一个代码段是我们在store下的index.js中写的,第二个是我们在定义计数器的组件上写的

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
      count:0
    
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
<template>
    <div>
        <h2>
        当前计数器的值 {{count}}        
            
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count;
    }
   }
    }

</script>

这样我们就完成了第一步,初始计数器的数值

2.我们通过mutations进行修改state中的数据达到计数器的效果,mutations中的函数可以具有两个参数,第一个参数是state,第二个参数是额外参数,我们实现三个功能:+1,-1,+10

我们通过以下代码实现+1-1的操作,在store下index.js定义mutations里边的+1和-1对应的函数

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
      count:0
    
  },
  getters: {
  },
  mutations: {
    addOne(state){
     state.count++;
    },
    reduceOne(state){
      state.count--;
    }
  },
  actions: {
  },
  modules: {
  }
})

然后再计数器对应的组件定义我们的方法来调用mutations方法执行+1-1操作

<template>
    <div>
        <h2>
        当前计数器的值 {{count}}        
            <button @click="addOne()">+1</button>
            <button @click="reduceOne()">-1</button>
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count;
    }
   },
   methods:{
    addOne(){
  this.$store.commit('addOne');
   },
    reduceOne(){
        this.$store.commit('reduceOne');
   }
   }
    }

</script>

我们需要store下的commit方法进行引用刚刚在mutations下边定义的方法,就完成了+1-1操作

3.完成+10操作

我们仍然像刚才一样,在index.js下定义我们的函数,只是我们可以把第二个参数也定义上,如下边的代码

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
      count:0
    
  },
  getters: {
  },
  mutations: {
    addOne(state){
     state.count++;
    },
    reduceOne(state){
      state.count--;
    },
    addTen(state,paylod){
     state.count+=paylod;
    }
  },
  actions: {
  },
  modules: {
  }
})

 然后我们在组件上进行调用,这里边的commit第二个参数就是我们刚刚定义的第二个参数,见下边代码

<template>
    <div>
        <h2>
        当前计数器的值 {{count}}        
            <button @click="addOne()">+1</button>
            <button @click="reduceOne()">-1</button>
            <button @click="addTen()">+10</button>
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count;
    }
   },
   methods:{
    addOne(){
  this.$store.commit('addOne');
   },
    reduceOne(){
        this.$store.commit('reduceOne');
   },
   addTen(){
    this.$store.commit('addTen',10);
    
   }
   }
    }

</script>

这样我们+10的操作也完成了!

四、vue-getters(类似于计算属性,在原有数据上进行处理得到新数据)

我们利用这个功能对计数器进行功能补充,实现翻倍的功能

我们在getters下定义,本质上和计算属性用法相同

 getters: {
    doubleCount(state){
      return state.count*2;
    }
  },

然后我们在组件引用这个属性doubleCount

 

<template>
    <div>
        <h2>
        当前计数器的值 {{count}}    
        当前计数器的值的两倍{{double}}        
            <button @click="addOne()">+1</button>
            <button @click="reduceOne()">-1</button>
            <button @click="addTen()">+10</button>
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count;
    },
    double(){
        return this.$store.getters.doubleCount;
    }
   },
   methods:{
    addOne(){
  this.$store.commit('addOne');
   },
    reduceOne(){
        this.$store.commit('reduceOne');
   },
   addTen(){
    this.$store.commit('addTen',10);
    
   }
   }
    }

</script>

五、vuex-actions(由于mutations函数中不能书写异步代码,可以在这个里边编写异步代码再提交mutations修改状态)

我们在state中定义一个空的列表list,实现3s后让他的值为[1,2,3,4]

1.首先我们修改状态,只能通过mutations函数进行修改,所以我们首先在mutations中定义一个修改状态的函数如以下代码中的函数addList函数

  mutations: {
    addOne(state){
     state.count++;
    },
    reduceOne(state){
      state.count--;
    },
    addTen(state,paylod){
     state.count+=paylod;
    },
    addList(state,namelist){
     state.list=namelist;
    }
  },

2.因为mutations函数不支持异步代码,所以我们要在actions中定义函数去实现3s后进行修改,他的参数是一个context(是store实例的一个拷贝调用,调用commit方法调用mutations中的addList函数进行修改state中的值

  actions: {
    addListAct(context){
      setInterval(() => {
        context.commit('addList',[1,2,3,4]);
      }, 3000);

    }

3.我们在实现该功能的组件,调用dispatch方法调用action方法(在页面渲染之前用生命周期钩子进行调用)。并将列表渲染到页面

<template>
    <div>
    <aside>
    <ul class="font">
     <li v-for="item in list" :key="item">{{item}}</li>
    </ul></aside>
    <main><router-view></router-view></main>
    
    </div>
</template>

<script>
    export default {
        computed:{
            list(){
                return this.$store.state.list;
            },
        },
        mounted(){
            this.$store.dispatch('addListAct');
        }
    }
    
</script>

<style scoped>
   

</style>

4.另外,我们同样可以在action函数定义第二个参数,然后在dispatch方法中传入数值,和mutations和commit相似,在这里就不演示了 

六、vuex-modules(模块:相当于一个小型的store仓库)

1.首先,我们在src目录下新定义一个moudules文件夹,我们在文件夹下新建一个js文件就是我们新的小仓库,我们把store仓库里的东西都搬到这个小仓库里边进行了解moudule的使用,即新建的小仓库的内容为如下代码

export default{
state:{
    count:0,
    list:[]
},
getters: {
    doubleCount(state){
      return state.count*2;
    }
  },
  mutations: {
    addOne(state){
     state.count++;
    },
    reduceOne(state){
      state.count--;
    },
    addTen(state,paylod){
     state.count+=paylod;
    },
    addList(state,namelist){
     state.list=namelist;
    }
  },
  actions: {
    addListAct(context,paylod){
      setInterval(() => {
        context.commit('addList',paylod);
      }, 3000);

    }
  },




}

2.然后我们在大仓库(即store文件夹下的index.js中导入我们的小仓库文件,并在moudules中调用),现在这个modules中的count相当于count:count的简写也可以换成c:count

import Vue from 'vue'
import Vuex from 'vuex';
import count from '../modules/counters'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
      
    
  },

  modules: {
    count
  }
})

3.修改我们在组件的代码,注意除了state以外,小仓库和大仓库的(mutations,getters,actions会进行合并),所以我们只需要修改带state的,在前边加上我们导入的模块count,即把this.$store.state.count更改为this.$store.state.count.count;

<template>
    <div>
        <h2>
        当前计数器的值 {{count}}    
         当前计数器的值的两倍{{double}}   
            <button @click="addOne()">+1</button>
            <button @click="reduceOne()">-1</button>
            <button @click="addTen()">+10</button> 
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count.count;
    },
    double(){
        return this.$store.getters.doubleCount;
 
   }},
   methods:{
    addOne(){
  this.$store.commit('addOne');
   },
    reduceOne(){
        this.$store.commit('reduceOne');
   },
   addTen(){
    this.$store.commit('addTen',10);
    
   }
   }
    }

</script>

4.当模块的getters,mutations与大仓库的函数名字冲突了怎么办

我们可以通过命名空间的方式进行调节,输入代码namespaced:true开启命名空间,即如下代码

export default{
    namespaced:true,
state:{
    count:0,
    list:[]
},
getters: {
    doubleCount(state){
      return state.count*2;
    }
  },
  mutations: {
    addOne(state){
     state.count++;
    },
    reduceOne(state){
      state.count--;
    },
    addTen(state,paylod){
     state.count+=paylod;
    },
    addList(state,namelist){
     state.list=namelist;
    }
  },
  actions: {
    addListAct(context,paylod){
      setInterval(() => {
        context.commit('addList',paylod);
      }, 3000);

    }
  },




}

但是开启命名空间后,我们的getters等在调用时都需要在前边加上  模块名/ ,拿我们这个例子进行举例,如下代码就是开了命名空间以后,组件上的代码,注意getters访问需要带特殊字符,所以需要使用['count/doubleCount']的方式

<template>
    <div>
        <h2>
        当前计数器的值 {{count}}    
         当前计数器的值的两倍{{double}}   
            <button @click="addOne()">+1</button>
            <button @click="reduceOne()">-1</button>
            <button @click="addTen()">+10</button> 
        </h2>
    </div>
</template>
<style scoped>  

</style>
<script>
    export default{
   computed:{
    count(){
        return this.$store.state.count.count;
    },
    double(){
        return this.$store.getters["count/doubleCount"];
 
   }},
   methods:{
    addOne(){
  this.$store.commit('count/addOne');
   },
    reduceOne(){
        this.$store.commit('count/reduceOne');
   },
   addTen(){
    this.$store.commit('count/addTen',10);
    
   }
   }
    }

</script>

六、Vuex的核心功能就介绍到这里,最后希望大家中秋快乐~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值