一、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的核心功能就介绍到这里,最后希望大家中秋快乐~~~~