目录
vuex的核心概念:store、state、getters、mutations、actions
1. 加载依赖 npm install vuex -s下载Vuex最新版本的依赖(注意)
2.导入Vuex的核心4个组件,然后通过index.js加载进来
3.将Vuex对应的index.js 挂载到main.js里的vue实例中
前言
为什么要去使用Vuex
Vuex 解决了前端传参的问题,针对当前项目所有的变量进行统一管理
可以理解为“前端数据库”(数据仓库)专门存储变量值让其在各个页面上实现数据的共享包括状态,并且可操作
vue传值
变量传值的演变形式:
组件传参
父组件-->子组件,通过子组件的自定义属性:props
子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2,...);
总线 vue根实例中定义变量,这个变量也是vue实例
一、Vuex的核心组成
Vuex官方图解
图解Vuex各组件
由4个组件组成
Vuex分成五个部分:
1.State:单一状态树(存储变量)
2.Getters:状态获取(改变变量值)
3.Mutations:触发同步事件(改变变量值--同步)
4.Actions:提交mutation,可以包含异步操作(改变变量值--异步)
5.Module:将vuex进行分模块
vuex的核心概念:store、state、getters、mutations、actions
每一个Vuex应用的核心就是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
const store = new Vuex.Store({
state, // 共同维护的一个状态,state里面可以是很多个全局状态
getters, // 获取数据并渲染
actions, // 数据的异步操作
mutations // 处理数据的唯一途径,state的改变或赋值只能在这里
})
二、vuex使用步骤
1. 加载依赖 npm install vuex -s下载Vuex最新版本的依赖(注意)
在项目根目录中运行dos命令,输入指令 npm install vuex -S
注意看这里Vuex的版本号,小编在此留下一个“小伏笔”
2.导入Vuex的核心4个组件,然后通过index.js加载进来
创建store模块,分别维护state/actions/mutations/getters
在store/index.js文件中新建vuex的store实例,并注册上面引入的各大模块
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import getters from './getters'
import actions from './actions'
import mutations from './mutations'
Vue.use(Vuex)
const store = new Vuex.Store({
state,
getters,
actions,
mutations
})
export default store
3.将Vuex对应的index.js 挂载到main.js里的vue实例中
4.测试Vuex的存储变量的功能
state.js
export default {
resName:'鸡崽餐厅'
}
设置路由
VuexPage1.vue
<template>
<div>
<p>欢迎来到{{msg}}</p>
</div>
</template>
<script>
export default {
name: 'VuexPage1',
data() {
return {}
},
computed: {
msg() {
//从vue 的state 文件中获取值
return this.$store.state.resName;
}
}
}
</script>
<style>
</style>
运行
可以看见,报了state 的 undefined 的错是为什么呢?
还记得小编在上面说了一个“小标记”
更改Vuex版本号
因为版本原因,版本不同的话效果出不来,我们更改一下版本号,命令: npm i -S vuex@3.6.2
@+对应版本号
可以看到,Vuex的版本号以及更改了。
修改版本后的运行
三、 Vuex中存值、取值以及获取变量值
更改VuePage1.Vue:
<template>
<div>
<p>页面1:欢迎来到{{msg}}</p>
<button @click="buy">盘他</button>
</div>
</template>
<script>
export default {
name: 'VuexPage1',
data() {
return {}
},
methods: {
buy() {
//通过commit方法 会调用 mutations.js中定义好的方法
this.$store.commit("setResName",{
resName:'大鸡崽'
})
}
},
computed: {
msg() {
//从vue 的state 文件中获取值
// return this.$store.state.resName;//不推荐,不安全
//通过 getters.js文件 获取 state.js中定义的变量值
return this.$store.getters.getResName;
}
}
}
</script>
<style>
</style>
VuePage2.Vue:
<template>
<div>
<p>页面2:欢迎来到{{msg}}</p>
</div>
</template>
<script>
export default {
name: 'VuexPage2',
data() {
return {}
},
computed: {
msg() {
//从vue 的state 文件中获取值
// return this.$store.state.resName;//不推荐,不安全
//通过 getters.js文件 获取 state.js中定义的变量值
return this.$store.getters.getResName;
}
}
}
</script>
<style>
</style>
mutations.js(存值):
export default {
setResName:(state,payload)=>{
//state对象就对应了state.js中的变量对象
//payload载荷 对应的 传递的 JSON对象参数(name:oy,age:20)
state.resName=payload.resName;
}
}
getters.js(取值):
export default {
//state代表着state.js整个文件
getResName:(state)=>{
return state.resName;
}
}
router/index.js:
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import AppMain from '@/components/AppMain'
import LeftNav from '@/components/LeftNav'
import TopNav from '@/components/TopNav'
import Login from '@/views/Login'
import Reg from '@/views/Reg'
import Articles from '@/views/sys/Articles'
import VuexPage1 from '@/views/sys/VuexPage1'
import VuexPage2 from '@/views/sys/VuexPage2'
Vue.use(Router)
export default new Router({
routes: [{
path: '/',
name: 'Login',
component: Login
},
{
path: '/Login',
name: 'Login',
component: Login
},
{
path: '/Reg',
name: 'Reg',
component: Reg
},
{
path: '/AppMain',
name: 'AppMain',
component: AppMain,
children: [{
path: '/LeftNav',
name: 'LeftNav',
component: LeftNav
},
{
path: '/TopNav',
name: 'TopNav',
component: TopNav
},
{
path: '/sys/Articles',
name: 'Articles',
component: Articles
},
{
path: '/sys/VuexPage1',
name: 'VuexPage1',
component: VuexPage1
},
{
path: '/sys/VuexPage2',
name: 'VuexPage2',
component: VuexPage2
}
]
}
]
})
查看界面效果:
不点击"盘他"按钮
页面一:
页面二:
点击"盘他"按钮
页面一:
此时我们再查看页面二:同样发生了改变
四、异步同步操作
VuexPage1.vue:
<template>
<div>
<p>页面1:我是{{msg}}</p>
<button @click="buy">盘他</button>
<button @click="buyAsync">最终的鸡</button>
</div>
</template>
<script>
export default {
name: 'VuexPage1',
data() {
return {}
},
methods: {
buy() {
//通过commit方法 会调用 mutations.js中定义好的方法
this.$store.commit("setResName", {
resName: '大鸡崽'
})
},
buyAsync() {
this.$store.dispatch("setResNameAsync", {
resName: '颜忠鸡'
})
}
},
computed: {
msg() {
//从vue 的state 文件中获取值
// return this.$store.state.resName;//不推荐,不安全
//通过 getters.js文件 获取 state.js中定义的变量值
return this.$store.getters.getResName;
}
}
}
</script>
<style>
</style>
actions.js:
export default {
setResNameAsync: (context, payload) => {
//异步修改值 在异步方法中调用了同步方法
//context指的是Vuex的上下文,相当于this.$store
setTimeout(function() {//此代码6秒后执行
context.commit("setResName", payload);
}, 6000);
}
}
效果演示:
先点击最终的鸡,此时会没有反应
我们再点击 “盘它”,
可以看到的现象:在点击了最终的鸡六秒之后,会切换为“颜忠鸡”
此时我们的同步跟异步是同时在进行的
五、Vue后台交互
Vuex中是如何跟后台交互的?
VuexPage1.vue:
<template>
<div>
<p>页面1:我是{{msg}}</p>
<button @click="buy">盘他</button>
<button @click="buyAsync">最终的鸡</button>
</div>
</template>
<script>
export default {
name: 'VuexPage1',
data() {
return {}
},
methods: {
buy() {
//通过commit方法 会调用 mutations.js中定义好的方法
this.$store.commit("setResName", {
resName: '大鸡崽'
})
},
buyAsync() {
this.$store.dispatch("setResNameAsync", {
resName: '颜忠鸡',
_this:this//通过键传到actions.js里面,获取到
})
}
},
computed: {
msg() {
//从vue 的state 文件中获取值
// return this.$store.state.resName;//不推荐,不安全
//通过 getters.js文件 获取 state.js中定义的变量值
return this.$store.getters.getResName;
}
}
}
</script>
<style>
</style>
actions.js
export default {
setResNameAsync: (context, payload) => {
//异步修改值 在异步方法中调用了同步方法
//context指的是Vuex的上下文,相当于this.$store
setTimeout(function() { //此代码6秒后执行
context.commit("setResName", payload);
}, 6000);
//通过payload里 传参的方式获取到vue实例
let _this = payload._this;
let url = _this.axios.urls.SYSTEM_MENU_TREE;
_this.axios.post(url, {}).then(r => {
console.log(r);
}).catch(e => {
});
}
}