• 关于Vuex的基础使用存值及异步


    目录

    一.概述

    二.取值

    2.1.安装

     2.2.菜单栏

    2.3.模块

    2.4.引用

    三.改值

    四.异步&后台请求

             好啦今天就到这里了希望能帮到你哦!!!


    一.概述

    Vuex 是一个用于 Vue.js 应用程序的状态管理库。它主要用于集中管理应用程序中的共享状态,使得状态的变化可追踪、可调试,并且在不同组件之间共享状态变得更加简单。

    在 Vue.js 中,每个组件都有自己的状态,当应用程序的规模逐渐扩大时,状态管理变得困难。Vuex 的出现就是为了解决这个问题。它采用了集中式存储管理应用的所有组件的状态,并提供了一套规则保证状态的一致性。

    Vuex 的核心概念包括 state(状态)mutations(突变)actions(动作)和getters(获取器)。state 是存储应用程序状态的地方,mutations 是用于修改状态的方法,actions 是用于处理异步操作的方法,getters 是对状态进行包装的方法。

    通过使用 Vuex,我们可以方便地在应用程序的任何地方访问和修改状态,而不必将状态逐层传递给需要的组件。这样可以提高代码的可维护性和可重用性,并且使得应用程序的状态管理更加清晰和可预测。

    二.取值

    思维图

    .

    2.1.安装

    使用CMD命令窗口,并跳转到指定工作目录下创建项目

    输入以下命令来安装Vuex:

      npm install vuex -S   (node的环境配置为10的执行这个命令)

     npm i -S vuex@3.6.2  (node的环境配置为18的执行这个命令)

    如图 : 

    在项目中的 package.json 文件中看到如图,说明安装成功

     2.2.菜单栏

    在src中创建一个vuex的目录,在改目录下创建两个组件page1,page2

    page1:

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page1h1>
    4. <p>state中eduName的值为: p>
    5. {{mag}}
    6. div>
    7. template>
    8. <script>
    9. export default {
    10. data() {
    11. return {
    12. mag: '自然躺平'
    13. }
    14. }
    15. }
    16. script>
    17. <style>
    18. style>

     page2:

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page2h1>
    4. {{mag}}
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. data() {
    10. return {
    11. mag: '自然躺平'
    12. }
    13. }
    14. }
    15. script>
    16. <style>
    17. style>

     到项目中src的router的index.js文件中配置路径

    1. import page1 from '@/views/vuex/page1'
    2. import page2 from '@/views/vuex/page2'
    1. {
    2. path: '/vuex/page1',
    3. name: 'page1',
    4. component: page1
    5. },
    6. {
    7. path: '/vuex/page2',
    8. name: 'page2',
    9. component: page2
    10. }

     在src中的components的LeftNav.vue组件中编辑(增加)代码

    1. <el-submenu index="idx" key="key">
    2. <template slot="title">
    3. <i class="el-icon-loading">i>
    4. <span>VUEX使用span>
    5. template>
    6. <el-menu-item index="/vuex/Vuex01" key="key01">
    7. <i class="el-icon-orange">i>
    8. <span>VUEX01span>
    9. el-menu-item>
    10. <el-menu-item index="/vuex/Vuex02" key="key02">
    11. <i class="el-icon-potato-strips">i>
    12. <span>VUEX02span>
    13. el-menu-item>
    14. el-submenu>

    2.3.模块

    在项目中创建store目录分别维护state/actions/mutations/getters/store

     state.js

    1. export default {
    2. eduName: '默认值~~'
    3. }

     getters.js

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

     mutations.js

    1. export default {
    2. // type(事件类型): 其值为setEduName
    3. // payload:官方给它还取了一个高大上的名字:载荷,其实就是一个保存要传递参数的容器
    4. setEduName: (state, payload) => {
    5. state.eduName = payload.eduName;
    6. }
    7. }

     actions.js 暂时不写代码,但要建立

    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

    2.4.引用

    在src中的main.js进行引用

    1. //导入并使用store实例
    2. import store from './store'
    3. /* eslint-disable no-new */
    4. new Vue({
    5. el: '#app',
    6. router,
    7. store,
    8. data(){
    9. return{
    10. bus :new Vue()
    11. }
    12. },
    13. components: { App },
    14. template: '<App/>'
    15. })

     在Vuex01.vue组件中编写代码

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page1h1>
    4. <p>state中eduName的值为: p>
    5. <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;">el-input>
    6. <el-row style="margin-top: 20px;">
    7. <el-button type="primary" plain @click="hq">获取stateel-button>
    8. el-row>
    9. div>
    10. template>
    11. <script>
    12. export default {
    13. data() {
    14. return {
    15. mag: '自然躺平'
    16. }
    17. },
    18. methods: {
    19. hq() {
    20. let eduName = this.$store.state.eduName;
    21. alert(eduName);
    22. }
    23. }
    24. }
    25. script>
    26. <style>
    27. style>

    效果图:

     

    三.改值

    在page1.vue组件中编写代码

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page1h1>
    4. <p>state中eduName的值为: p>
    5. <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;">el-input>
    6. <el-row style="margin-top: 20px;">
    7. <el-button type="primary" plain @click="hq">获取stateel-button>
    8. <el-button type="primary" plain @click="xg">修改stateel-button>
    9. el-row>
    10. div>
    11. template>
    12. <script>
    13. export default {
    14. data() {
    15. return {
    16. mag: '自然躺平'
    17. }
    18. },
    19. methods: {
    20. hq() {
    21. let eduName = this.$store.state.eduName;
    22. alert(eduName);
    23. },
    24. xg() {
    25. //type(事件类型): 这里的值为setEduName,是指mutations.js中的setEduName事件
    26. this.$store.commit('setEduName', {
    27. eduName: this.mag
    28. });
    29. //修改完成给与提示
    30. this.$message({
    31. showClose: true,
    32. message: '成功修改eduName的值为 : ' + this.mag,
    33. type: 'success'
    34. });
    35. },
    36. }
    37. }
    38. script>
    39. <style>
    40. style>

    效果图:

    四.异步&后台请求

    在page1.vue组件中编写所有代码

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page1h1>
    4. <p>state中eduName的值为: p>
    5. <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;">el-input>
    6. <el-row style="margin-top: 20px;">
    7. <el-button type="primary" plain @click="hq">获取stateel-button>
    8. <el-button type="primary" plain @click="xg">修改stateel-button>
    9. <el-button type="primary" plain @click="xgAsync">异步修改stateel-button>
    10. <el-button type="primary" plain @click="xgAjax">后台请求el-button>
    11. el-row>
    12. div>
    13. template>
    14. <script>
    15. export default {
    16. data() {
    17. return {
    18. mag: '自然躺平'
    19. }
    20. },
    21. methods: {
    22. hq() {
    23. let eduName = this.$store.state.eduName;
    24. alert(eduName);
    25. },
    26. xg() {
    27. //type(事件类型): 这里的值为setEduName,是指mutations.js中的setEduName事件
    28. this.$store.commit('setEduName', {
    29. eduName: this.mag
    30. });
    31. //修改完成给与提示
    32. this.$message({
    33. showClose: true,
    34. message: '成功修改eduName的值为 : ' + this.mag,
    35. type: 'success'
    36. });
    37. },
    38. xgAsync() {
    39. //type(事件类型): 这里的值为setEduNameByAsync,是指actions.js中的setEduNameByAsync事件
    40. this.$store.dispatch('setEduNameByAsync', {
    41. eduName: this.mag
    42. });
    43. //修改完成给与提示
    44. this.$message({
    45. showClose: true,
    46. message: '7秒后将为把eduName值改为 : ' + this.mag,
    47. type: 'success'
    48. });
    49. },
    50. xgAjax() {
    51. //type(事件类型): 这里的值为setEduNameByAjax,是指actions.js中的setEduNameByAjax事件
    52. this.$store.dispatch('setEduNameByAjax', {
    53. eduName: this.mag,
    54. _this:this
    55. });
    56. //修改完成给与提示
    57. this.$message({
    58. showClose: true,
    59. message: '7秒后将为把eduName值改为 : ' + this.mag,
    60. type: 'success'
    61. });
    62. }
    63. }
    64. }
    65. script>
    66. <style>
    67. style>

    在page2.vue组件中编写所有代码

    1. <template>
    2. <div style="padding: 50px;padding-top: 20px;">
    3. <h1>page2h1>
    4. {{eduName}}
    5. div>
    6. template>
    7. <script>
    8. export default {
    9. data() {
    10. return {
    11. mag: '自然躺平'
    12. }
    13. },
    14. computed: {
    15. eduName() {
    16. return this.$store.state.eduName;
    17. }
    18. }
    19. }
    20. script>
    21. <style>
    22. style>

    在src的action.js中配置后台请求的地址

     'SYSTEM_VuexAjax': '/vuex/queryVuex', //Vuex的异步请求

    在src的store模块中编写actions.js

    1. export default {
    2. setEduNameByAsync: function(context, payload) {
    3. setTimeout(() => {
    4. //这里的setEduName(事件类型)是指mutations.js中的setEduName事件
    5. context.commit('setEduName', payload);
    6. }, 7000);
    7. //7000是指7秒之后执行这个事件
    8. },
    9. setEduNameByAjax: function(context, payload) {
    10. let _this=payload._this;
    11. //定义后端都请求地址
    12. let url = _this.axios.urls.SYSTEM_VuexAjax;
    13. let params = {
    14. resturantName: payload.eduName
    15. }
    16. _this.axios.post(url, params).then(r => {
    17. console.log(r);
    18. }).catch(e => {
    19. console.log(e);
    20. });
    21. }
    22. }

    异步效果图:

     后台效果图:

             好啦今天就到这里了希望能帮到你哦!!!

  • 相关阅读:
    『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)
    盛最多水的容器,三数之和 ,有效的括号
    湘潭大学商学院开通CnOpenData试用
    LVGL---windows PC模拟器(codeblocks)运行LVGL
    【阿里云-如何实现实名认证】
    SQL教程之SQL 中数据透视表的不同方法
    数字化转型有哪些关键步骤?
    操作系统之内存的分配与回收——连续分配内存
    Kubernetes 笔记 / 入门 / 生产环境 / 容器运行时
    七、运算符
  • 原文地址:https://blog.csdn.net/m0_74915426/article/details/133779393