• 一步教你怎么使用Vuex


    目录

    一、了解Vuex

    为什么学Vuex : 是解决了前端组件传参的问题,针对当前项目所有的变量进行统一管理,可以理解为前端的数据库 

    相比于总线的优点在于,能够将整个项目的变量进行统一管理

    二、组件传参 

    1.子传父  $emit 、父传子  props

    2.总线

            vue根实例中定义变量,这个变量也是vue实例 

    3.核心组件Vuex

            state.js               存储变量

            Getters.js           获取变量值

            mutations.js       改变变量值(同步)

            action.js             改变变量值(异步)

    三、Vuex版本问题及store.js的使用 

    1.使用Vuex的步骤 

     ①.安装加载依赖 npm install vuex -s        下载Vuex最新版本的依赖(注意)所以我们要安装依赖版本的问题要加载依赖--->        npm i -S vuex@3.6.2

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

            创建store模块,分别维护state/actions/mutations/getters

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

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

     四、Vuex中的设置及获取变量值

     五、Vuex中的异步同步操作

    六、Vuex后台交互 

    1.vuex中默认情况下是不允许使用vue实例,想要请求后台接口,必须将vue实例当成参数从组件那一方传递过来 


    一、了解Vuex

    为什么学Vuex : 是解决了前端组件传参的问题,针对当前项目所有的变量进行统一管理,可以理解为前端的数据库 

    相比于总线的优点在于,能够将整个项目的变量进行统一管理

    二、组件传参 

    1.子传父  $emit 、父传子  props

    2.总线

            vue根实例中定义变量,这个变量也是vue实例 

    3.核心组件Vuex

    官网的图解  Vuex: 

     了解后图解Vuex各组件 :

            state.js               存储变量

                            获取值  this.$store.state.变量值

            Getters.js           获取变量值

                            获取值 this.$store.gettres.变量的get方法

            mutations.js       改变变量值(同步)

                            改变值  this.$store.commit("同步的方法",{...})

            action.js             改变变量值(异步)

                            改变值  this.$store.dispath("异步的方法",{...})

    三、Vuex版本问题及store.js的使用 

    1.使用Vuex的步骤 

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

    所以我们要安装依赖版本的问题要加载依赖--->        npm i -S vuex@3.6.2

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

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

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

     ①.安装加载依赖 npm install vuex -s        下载Vuex最新版本的依赖(注意)所以我们要安装依赖版本的问题要加载依赖--->        npm i -S vuex@3.6.2

     接着我们前端框架就会产生一个vuex的版本

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

     官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。可以想象为一个前端数据库(数据仓库),让其在各个页面上实现数据的共享包括状态,并且可操作

    Vuex分成五个部分:

       1.State:单一状态树

       2.Getters:状态获取

       3.Mutations:触发同步事件

       4.Actions:提交mutation,可以包含异步操作

       5.Module:将vuex进行分模块

    创建store模块,分别维护state/actions/mutations/getters

          store

            index.js

            state.js

            actions.js

            mutations.js

            getters.js 

     

     store/index.js文件中新建vuexstore实例,并注册上面引入的各大模块

    1. import Vue from 'vue'
    2. import Vuex from 'vuex'
    3. import state from './state'
    4. import getters from './getters'
    5. import actions from './actions'
    6. import mutations from './mutations'
    7. Vue.use(Vuex)
    8. const store = new Vuex.Store({
    9. state,
    10. getters,
    11. actions,
    12. mutations
    13. })
    14. export default store

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

     

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

     

    VuexPage1.vue

    1. <template>
    2. <div>
    3. <p>欢迎来到{{msg}}p>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name:'VuexPage1',
    9. data() {
    10. return {
    11. };
    12. },
    13. computed:{
    14. msg(){
    15. console.log(this.$store);
    16. //从vuex 的 state 文件中获取值
    17. return this.$store.state.resName;
    18. // return 'xxx';
    19. // this.$router.push().. 设置值
    20. // this.$root.Bus.$on() 获取值
    21. }
    22. }
    23. }
    24. script>
    25. <style>
    26. style>

     把VuexPage1.vue去定义路由与组件的关系

    我们就要去下载安装依赖  npm i -S vuex@3.6.2    我们把项目关闭掉,然后下载依赖,重新启动。

     

     我们运行看看效果就出来了如图所示: 

     四、Vuex中的设置及获取变量值

    mutations.js

    1. export default{
    2. //设置值
    3. setResName:(state,payload) => {
    4. // state对象就对应了state.js中的对象
    5. // payload载荷 对应的 传递的 json对象参数{name:zs,age:14}
    6. state.resName = payload.resName;
    7. }
    8. }

     在getters.js获取值

    1. export default{
    2. //拿值
    3. getResName:(state) => {
    4. return state.resName;
    5. }
    6. }

    VuexPage1.vue

    1. <template>
    2. <div>
    3. <p>页面1:欢迎来到{{msg}}p>
    4. <button @click="buy">盘下店面button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. name:'VuexPage1',
    10. data() {
    11. return {
    12. };
    13. },
    14. methods:{
    15. buy() {
    16. // 通过commit方法 会 调用mutations.js文件中定义好的方法
    17. this.$store.commit("setResName",{
    18. resName:'KFC'
    19. });
    20. }
    21. },
    22. computed:{
    23. msg(){
    24. console.log(this.$store);
    25. //从vuex 的 state 文件中获取值
    26. // return this.$store.state.resName; //不推荐,不安全
    27. // 通过 getters.js 文件获取 state.js 中定义的变量值
    28. return this.$store.getters.getResName;
    29. // return 'xxx';
    30. // this.$router.push().. 设置值
    31. // this.$root.Bus.$on() 获取值
    32. }
    33. }
    34. }
    35. script>
    36. <style>
    37. style>

     运行结果不是很明显感受到页面的传参问题,如图所示:

    我们在创建一个VuexPage2.vue

    1. <template>
    2. <div>
    3. <p>页面2:欢迎来到{{msg}}p>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name:'VuexPage2',
    9. data() {
    10. return {
    11. };
    12. },
    13. computed:{
    14. msg(){
    15. console.log(this.$store);
    16. //从vuex 的 state 文件中获取值
    17. // return this.$store.state.resName; //不推荐,不安全
    18. // 通过 getters.js 文件获取 state.js 中定义的变量值
    19. return this.$store.getters.getResName;
    20. // return 'xxx';
    21. // this.$router.push().. 设置值
    22. // this.$root.Bus.$on() 获取值
    23. }
    24. }
    25. }
    26. script>
    27. <style>
    28. style>

    router/index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. // 3.定义路由与组件的对应关系
    4. import HelloWorld from '@/components/HelloWorld'
    5. import AppMain from '@/components/AppMain'
    6. import LeftNav from '@/components/LeftNav'
    7. import TopNav from '@/components/TopNav'
    8. import Login from '@/views/Login'
    9. import Reg from '@/views/Reg'
    10. import Articles from '@/views/sys/Articles'
    11. import VuexPage1 from '@/views/sys/VuexPage1'
    12. import VuexPage2 from '@/views/sys/VuexPage2'
    13. Vue.use(Router)
    14. // 4.生成路由对象
    15. export default new Router({
    16. routes: [{
    17. path: '/',
    18. // 这个可要可不用
    19. name: 'Login',
    20. component: Login
    21. },
    22. {
    23. path: '/Login',
    24. name: 'Login',
    25. component: Login
    26. },
    27. {
    28. path: '/Reg',
    29. name: 'Reg',
    30. component: Reg
    31. },
    32. {
    33. path: '/AppMain',
    34. name: 'AppMain',
    35. component: AppMain,
    36. children: [{
    37. path: '/LeftNav',
    38. name: 'LeftNav',
    39. component: LeftNav
    40. },
    41. {
    42. path: '/TopNav',
    43. name: 'TopNav',
    44. component: TopNav
    45. },
    46. {
    47. path: '/sys/Articles',
    48. name: 'Articles',
    49. component: Articles
    50. },
    51. {
    52. path: '/sys/VuexPage1',
    53. name: 'VuexPage1',
    54. component: VuexPage1
    55. },
    56. {
    57. path: '/sys/VuexPage2',
    58. name: 'VuexPage2',
    59. component: VuexPage2
    60. }
    61. ]
    62. }
    63. ]
    64. })

     测试效果如图所示:

     五、Vuex中的异步同步操作

    store/ actions.js

    1. export default{
    2. setResNameAsync:(context,payload) => {
    3. // 异步修改值 在异步方法中调用了同步方法
    4. // context指的是Vuex的上下文,相当于 this.$store
    5. // 此代码6s后执行
    6. setTimeout(function(){
    7. context.commit("setResName",payload);
    8. },6000);
    9. }
    10. }

    views/sys/VuexPage1.vue

    1. <template>
    2. <div>
    3. <p>页面1:欢迎来到{{msg}}p>
    4. <button @click="buy">盘下店面button>
    5. <button @click="buyAsync">最终的店长(异步)button>
    6. div>
    7. template>
    8. <script>
    9. export default {
    10. name:'VuexPage1',
    11. data() {
    12. return {
    13. };
    14. },
    15. methods:{
    16. buy() {
    17. // 通过commit方法 会 调用mutations.js文件中定义好的方法
    18. this.$store.commit("setResName",{
    19. resName:'KFC'
    20. });
    21. },
    22. buyAsync(){
    23. this.$store.dispatch("setResNameAsync",{
    24. resName:'麦当劳'
    25. });
    26. }
    27. },
    28. computed:{
    29. msg(){
    30. console.log(this.$store);
    31. //从vuex 的 state 文件中获取值
    32. // return this.$store.state.resName; //不推荐,不安全
    33. // 通过 getters.js 文件获取 state.js 中定义的变量值
    34. return this.$store.getters.getResName;
    35. // return 'xxx';
    36. // this.$router.push().. 设置值
    37. // this.$root.Bus.$on() 获取值
    38. }
    39. }
    40. }
    41. script>
    42. <style>
    43. style>

    运行结果如图所示:

    六、Vuex后台交互 

    1.vuex中默认情况下是不允许使用vue实例,想要请求后台接口,必须将vue实例当成参数从组件那一方传递过来 

     actions.js

    1. export default{
    2. setResNameAsync:(context,payload) => {
    3. // 异步修改值 在异步方法中调用了同步方法
    4. // context指的是Vuex的上下文,相当于 this.$store
    5. // 此代码6s后执行
    6. setTimeout(function(){
    7. context.commit("setResName",payload);
    8. },6000);
    9. // console.log(this); this指的是actions.js
    10. let _this = payload._this;
    11. let url = _this.axios.urls.SYSTEM_MENU_TREE;
    12. _this.axios.post(url,{}).then(r => {
    13. console.log(r);
    14. }).catch(e => {
    15. })
    16. }
    17. }

    VuexPage1.vue

     运行效果如图所示:

  • 相关阅读:
    ESP8266--SDK开发(驱动WS2812B)
    消息队列 RabbitMQ 遇上可观测--业务链路可视化
    你的下一个压测工具可以是nGrinder
    智慧公厕有什么?
    推荐这款全新一代性能强到爆的RPC框架
    C++Qt开发——文件操作
    游戏开发者如何能达到5万月薪?这太难了......
    基于java网上服装店设计与实现(mvc+jsp+servlet+jdbc+MySQL)
    SpringBoot讲义
    从白日梦到现实:推出 Elastic 的管道查询语言 ES|QL
  • 原文地址:https://blog.csdn.net/weixin_67465673/article/details/126877985