• Vuex


    目录

    一、Vuex

    1、Vuex简介

    2、核心组件

    3、变量传值的演变形式

     4、图解Vuex各组件

    ​编辑

     二、Vuex的使用步骤

    1、加载依赖

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

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

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

    VuexPage1

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

    1、设置变量值

    2、获取变量值

    3、效果

    四、Vuex中的异步同步操作

    1、异步方法

    2、调用

    3、效果

    五、Vuex后台交互


    一、Vuex

    1、Vuex简介

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

    2、核心组件

       ①State:单一状态树

       ②Getters:状态获取

       ③Mutations:触发同步事件

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

       ⑤Module:将vuex进行分模块

    3、变量传值的演变形式

     4、图解Vuex各组件

     二、Vuex的使用步骤

    1、加载依赖

    在项目目录cmd执行  npm install vuex -S 指令(下载Vuex最新版本的依赖)

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

    state.js

    1. export default {
    2. }

    actions.js

    1. export default {
    2. }

    mutations.js

    1. export default {
    2. }

    getters.js

    1. export default {
    2. }

    index.js

    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

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

    main.js

    1. // The Vue build version to load with the `import` command
    2. // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    3. import Vue from 'vue'
    4. //process.env.MOCK 为 false,那么require('@/mock')不执行,process.env.MOCK在生产环境下为false
    5. // process.env.MOCK && require('@/mock')
    6. import ElementUI from 'element-ui' // 新添加 1
    7. import 'element-ui/lib/theme-chalk/index.css' // 新添加 2 ,避免后期打包样式不同,要放在import App from './App'; 之前
    8. import App from './App'
    9. import router from './router'
    10. import axios from '@/api/http'  //#vue项目对axios的全局配置      
    11. // import axios from 'axios'
    12. import VueAxios from 'vue-axios'
    13. import qs from 'qs'
    14. import store from './store'
    15. Vue.use(ElementUI)   // 新添加 3
    16. Vue.use(VueAxios,axios)
    17. Vue.config.productionTip = false
    18. /* eslint-disable no-new */
    19. new Vue({
    20. el: '#app',
    21. router,
    22. store,
    23. data(){
    24. return {
    25. //在vue跟实例中定义一个变量,这个变量接收vue实例,是总线
    26. Bus:new Vue({
    27. })
    28. }
    29. },
    30. components: { App },
    31. template: ''
    32. })

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

    定义变量

    state.js

    1. export default {
    2. resName:'小菲花店'
    3. }

    设置界面

    VuexPage1

    1. <template>
    2. <div>
    3. <h3>{{msg}}h3>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'VuexPage1',
    9. data() {
    10. return {}
    11. },
    12. computed: {
    13. msg() {
    14. // 不推荐 不安全
    15. return this.$store.state.resName;
    16. }
    17. }
    18. }
    19. script>

    配置路由

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from "@/components/HelloWorld";
    4. import AppMain from "@/components/AppMain";
    5. import LeftNav from "@/components/LeftNav";
    6. import TopNav from "@/components/TopNav";
    7. import Login from "@/views/Login";
    8. import Reg from "@/views/Reg";
    9. import Articles from "@/views/sys/Articles";
    10. import VuexPage1 from "@/views/sys/VuexPage1";
    11. Vue.use(Router)
    12. export default new Router({
    13. routes: [
    14. {
    15. path: '/',
    16. name: 'Login',
    17. component: Login
    18. },
    19. {
    20. path: '/Login',
    21. name: 'Login',
    22. component: Login
    23. },
    24. {
    25. path: '/Reg',
    26. name: 'Reg',
    27. component: Reg
    28. },
    29. {
    30. path: '/AppMain',
    31. name: 'AppMain',
    32. component: AppMain,
    33. children:[
    34. {
    35. path: '/LeftNav',
    36. name: 'LeftNav',
    37. component: LeftNav
    38. },
    39. {
    40. path: '/TopNav',
    41. name: 'TopNav',
    42. component: TopNav
    43. },
    44. {
    45. path: '/sys/Articles',
    46. name: 'Articles',
    47. component: Articles
    48. },
    49. {
    50. path: '/sys/VuexPage1',
    51. name: 'VuexPage1',
    52. component: VuexPage1
    53. }
    54. ]
    55. }
    56. ]
    57. })

    运行

    版本不兼容报错

    关闭项目更改版本执行 npm i -S vuex@3.6.2 指令 重启项目

    重新运行

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

    1、设置变量值

    mutations.js

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

    2、获取变量值

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

    VuexPage1.vue

    1. <template>
    2. <div>
    3. <h3>页面一 {{msg}}h3>
    4. <button @click="buy">买他button>
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. name: 'VuexPage1',
    10. data() {
    11. return {}
    12. },
    13. methods:{
    14. buy(){
    15. //通过commit方法会调用mutations.js中定义好的方法
    16. this.$store.commit("setResName",{
    17. resName:'小祺杂货铺'
    18. })
    19. }
    20. },
    21. computed: {
    22. msg() {
    23. // 不推荐 不安全
    24. // return this.$store.state.resName;
    25. //通过getters.js文件获取state.js中定义的变量值
    26. return this.$store.getters.getResName;
    27. }
    28. }
    29. }
    30. script>

    VuexPage2.vue

    1. <template>
    2. <div>
    3. <h3>页面二 {{msg}}h3>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. name: 'VuexPage2',
    9. data() {
    10. return {}
    11. },
    12. computed: {
    13. msg() {
    14. // 不推荐 不安全
    15. // return this.$store.state.resName;
    16. //通过getters.js文件获取state.js中定义的变量值
    17. return this.$store.getters.getResName;
    18. }
    19. }
    20. }
    21. script>

    router/index.js

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

    3、效果

     点击买他

     页面二

     页面一页面二共享

    四、Vuex中的异步同步操作

    1、异步方法

    actions.js

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

    2、调用

    VuexPage1.vue

    1. <template>
    2. <div>
    3. <h3>页面一 {{msg}}h3>
    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. methods: {
    15. buy() {
    16. //通过commit方法会调用mutations.js中定义好的方法
    17. this.$store.commit("setResName", {
    18. resName: '小祺杂货铺'
    19. })
    20. },
    21. buyAsync() {
    22. this.$store.dispatch("setResNameAsync", {
    23. resName: '颠颠'
    24. })
    25. }
    26. },
    27. computed: {
    28. msg() {
    29. // 不推荐 不安全
    30. // return this.$store.state.resName;
    31. //通过getters.js文件获取state.js中定义的变量值
    32. return this.$store.getters.getResName;
    33. }
    34. }
    35. }
    36. script>

    3、效果

     先点击最终的店长再点击他

     先出现

    6s后改变

     同时执行

    五、Vuex后台交互

    将this传递

     actions.js

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

    效果(拿到后台数据)

     

  • 相关阅读:
    vue3的getCurrentInstance获取组件实例踩坑记录
    Python源码剖析2-字符串对象PyStringObject
    从0开始学习JavaScript--深入理解JavaScript的async/await
    N9344C安捷伦Agilent N9344C频谱分析仪
    美团外卖9元每周星期一开工外卖红包优惠券怎么领取?
    【线性代数】第五章-线性方程组
    【文生图系列】如何在Stable Diffusion Webui中使用ControlNet
    去年十八,初识Java 2
    重庆开放大学学子们的好帮手
    halcon算子register_object_model_3d_pair详解
  • 原文地址:https://blog.csdn.net/yzq102873/article/details/126859286