目录
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 解决了前端传参的问题,针对当前项目所有的变量进行统一管理
可以理解为“前端数据库”(数据仓库)专门存储变量值让其在各个页面上实现数据的共享包括状态,并且可操作
变量传值的演变形式:
组件传参
父组件-->子组件,通过子组件的自定义属性:props
子组件-->父组件,通过自定义事件:this.$emit('事件名',参数1,参数2,...);
总线 vue根实例中定义变量,这个变量也是vue实例


1.State:单一状态树(存储变量)
2.Getters:状态获取(改变变量值)
3.Mutations:触发同步事件(改变变量值--同步)
4.Actions:提交mutation,可以包含异步操作(改变变量值--异步)
5.Module:将vuex进行分模块
每一个Vuex应用的核心就是store(仓库),store基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
const store = new Vuex.Store({
state, // 共同维护的一个状态,state里面可以是很多个全局状态
getters, // 获取数据并渲染
actions, // 数据的异步操作
mutations // 处理数据的唯一途径,state的改变或赋值只能在这里
})
在项目根目录中运行dos命令,输入指令 npm install vuex -S

注意看这里Vuex的版本号,小编在此留下一个“小伏笔”

创建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

state.js
- export default {
- resName:'鸡崽餐厅'
- }
设置路由


VuexPage1.vue
- <div>
- <p>欢迎来到{{msg}}p>
- div>
-
- <script>
- export default {
- name: 'VuexPage1',
- data() {
- return {}
- },
- computed: {
- msg() {
- //从vue 的state 文件中获取值
- return this.$store.state.resName;
- }
- }
- }
- script>
- <style>
- style>

可以看见,报了state 的 undefined 的错是为什么呢?
还记得小编在上面说了一个“小标记”
因为版本原因,版本不同的话效果出不来,我们更改一下版本号,命令: npm i -S vuex@3.6.2
@+对应版本号

可以看到,Vuex的版本号以及更改了。

更改VuePage1.Vue:
- <div>
- <p>页面1:欢迎来到{{msg}}p>
- <button @click="buy">盘他button>
- div>
-
- <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:
- <div>
- <p>页面2:欢迎来到{{msg}}p>
- div>
-
- <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:
- <div>
- <p>页面1:我是{{msg}}p>
- <button @click="buy">盘他button>
- <button @click="buyAsync">最终的鸡button>
- div>
-
- <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);
-
- }
- }
先点击最终的鸡,此时会没有反应

我们再点击 “盘它”,

可以看到的现象:在点击了最终的鸡六秒之后,会切换为“颜忠鸡”

此时我们的同步跟异步是同时在进行的
VuexPage1.vue:
- <div>
- <p>页面1:我是{{msg}}p>
- <button @click="buy">盘他button>
- <button @click="buyAsync">最终的鸡button>
- div>
-
- <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 => {
-
- });
- }
- }
