Vuex的核心组成、版本问题及store.js的使用、 Vuex中存值、取值以及获取变量值、异步同步操作和Vuex后台交互

目录

前言

为什么要去使用Vuex

 vue传值

变量传值的演变形式:  

一、Vuex的核心组成

 Vuex官方图解  

图解Vuex各组件

由4个组件组成

Vuex分成五个部分:

vuex的核心概念:store、state、getters、mutations、actions 

二、vuex使用步骤

1.    加载依赖 npm install vuex -s下载Vuex最新版本的依赖(注意)

 2.导入Vuex的核心4个组件,然后通过index.js加载进来

3.将Vuex对应的index.js 挂载到main.js里的vue实例中

4.测试Vuex的存储变量的功能

运行

更改Vuex版本号

 修改版本后的运行

三、 Vuex中存值、取值以及获取变量值

查看界面效果:

不点击"盘他"按钮

 点击"盘他"按钮

四、异步同步操作

效果演示:

五、Vue后台交互

Vuex中是如何跟后台交互的?

运行效果:


前言

为什么要去使用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 => {

    });
  }
}

运行效果:

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vuex中,`this.store.dispatch()` 是用于向应用的状态树(state tree)中执行一个异步或同步的action的方法。VuexVue.js官方推荐的状态管理模式,它帮助我们管理单个应用中的共享状态。 当你调用 `this.store.dispatch(actionName, [payload])` 时,做了以下几个事情: 1. **Action 名称(actionName)**:这是你要触发的action的名称,它是一个字符串。Action是一组可复用的操作,它们通常定义在`store/modules`中,每个模块都有自己的actions。 2. **Payload(可选)**:这是一个可选的数据对象,你可以传递给action的参数,action可以操作这些数据并返回一个值。 - **异步调用**:如果action中包含了`async`关键字,那么dispatch会返回一个Promise,你可以使用`.then()`、`.catch()`等方式处理action的结果。这使得你可以在action完成时更新状态,并在必要时通知到视图层。 - **同步调用**:如果action没有`async`,它将立即执行并返回结果,然后你可以直接操作返回的值。 - **分发过程**:`dispatch`会自动处理action的上下文(context),确保你在action内部可以访问`store`实例以及相关的辅助方法,如`commit()`(用于修改状态)和` getters`(用于读取状态)。 相关问题: 1. 在Vuex中,action通常如何组织和管理? 2. 如何在action中处理成功和失败的情况? 3. 在action执行时,为什么要使用`commit`而不是直接修改状态?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

歐陽。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值