关于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:

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page1</h1>
    <p>state中eduName的值为: </p>
      {{mag}} 
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    }
}
</script>
 
<style>
</style>

page2:

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page2</h1>
    {{mag}}
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    }
  }
</script>
 
<style>
</style>

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

html 复制代码
import page1 from '@/views/vuex/page1'
import page2 from '@/views/vuex/page2'
html 复制代码
 {
          path: '/vuex/page1',
          name: 'page1',
          component: page1
        },
        {
          path: '/vuex/page2',
          name: 'page2',
          component: page2
        }

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

html 复制代码
    <el-submenu  index="idx" key="key">
      <template slot="title">
        <i class="el-icon-loading"></i>
        <span>VUEX使用</span>
      </template>
      <el-menu-item  index="/vuex/Vuex01" key="key01">
        <i class="el-icon-orange"></i>
        <span>VUEX01</span>
      </el-menu-item>
      <el-menu-item  index="/vuex/Vuex02" key="key02">
        <i class="el-icon-potato-strips"></i>
        <span>VUEX02</span>
      </el-menu-item>
    </el-submenu>

2.3.模块

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

state.js

html 复制代码
export default {
  eduName: '默认值~~'
}

getters.js

html 复制代码
export default {
  getEduName: (state) => {
    return state.eduName;
  }
}

mutations.js

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

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

index.js

html 复制代码
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

2.4.引用

在src中的main.js进行引用

html 复制代码
//导入并使用store实例
import store from './store'
 
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,
  data(){
    return{
      bus :new Vue()
    }
  },
  components: { App },
  template: '<App/>'
})

在Vuex01.vue组件中编写代码

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page1</h1>
    <p>state中eduName的值为: </p>
    <!-- {{mag}} -->
    <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;"></el-input>
    <el-row style="margin-top: 20px;">
      <el-button type="primary" plain @click="hq">获取state</el-button>
    </el-row>
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    },
    methods: {
      hq() {
        let eduName = this.$store.state.eduName;
        alert(eduName);
      }
    }
 
  }
</script>
 
<style>
</style>

效果图:

三.改值

在page1.vue组件中编写代码

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page1</h1>
    <p>state中eduName的值为: </p>
    <!-- {{mag}} -->
    <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;"></el-input>
    <el-row style="margin-top: 20px;">
      <el-button type="primary" plain @click="hq">获取state</el-button>
      <el-button type="primary" plain @click="xg">修改state</el-button>
    </el-row>
    <!-- {{mag}} -->
  </div>
</template>
 
<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    },
    methods: {
      hq() {
        let eduName = this.$store.state.eduName;
        alert(eduName);
      },
      xg() {
        //type(事件类型): 这里的值为setEduName,是指mutations.js中的setEduName事件
        this.$store.commit('setEduName', {
          eduName: this.mag
        });
        //修改完成给与提示
        this.$message({
          showClose: true,
          message: '成功修改eduName的值为 : ' + this.mag,
          type: 'success'
        });
      },
     
    }
  }
</script>
 
<style>
</style>

效果图:

四.异步&后台请求

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

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page1</h1>
    <p>state中eduName的值为: </p>
    <!-- {{mag}} -->
    <el-input v-model="mag" placeholder="请输入要修改的内容" style="width: 180px;"></el-input>
    <el-row style="margin-top: 20px;">
      <el-button type="primary" plain @click="hq">获取state</el-button>
      <el-button type="primary" plain @click="xg">修改state</el-button>
      <el-button type="primary" plain @click="xgAsync">异步修改state</el-button>
      <el-button type="primary" plain @click="xgAjax">后台请求</el-button>
    </el-row>
    <!-- {{mag}} -->
  </div>
</template>

<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    },
    methods: {
      hq() {
        let eduName = this.$store.state.eduName;
        alert(eduName);
      },
      xg() {
        //type(事件类型): 这里的值为setEduName,是指mutations.js中的setEduName事件
        this.$store.commit('setEduName', {
          eduName: this.mag
        });
        //修改完成给与提示
        this.$message({
          showClose: true,
          message: '成功修改eduName的值为 : ' + this.mag,
          type: 'success'
        });
      },
        xgAsync() {
          //type(事件类型): 这里的值为setEduNameByAsync,是指actions.js中的setEduNameByAsync事件
          this.$store.dispatch('setEduNameByAsync', {
            eduName: this.mag
          });
          //修改完成给与提示
          this.$message({
            showClose: true,
            message: '7秒后将为把eduName值改为 : ' + this.mag,
            type: 'success'
          });
        },
        xgAjax() {
          //type(事件类型): 这里的值为setEduNameByAjax,是指actions.js中的setEduNameByAjax事件
          this.$store.dispatch('setEduNameByAjax', {
            eduName: this.mag,
            _this:this
          });
          //修改完成给与提示
          this.$message({
            showClose: true,
            message: '7秒后将为把eduName值改为 : ' + this.mag,
            type: 'success'
          });
        }
    }
  }
</script>

<style>
</style>

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

html 复制代码
<template>
  <div style="padding: 50px;padding-top: 20px;">
    <h1>page2</h1>
    {{eduName}}
  </div>
</template>

<script>
  export default {
    data() {
      return {
        mag: '自然躺平'
      }
    },
    computed: {
      eduName() {
        return this.$store.state.eduName;
      }
    }
  }
</script>

<style>
</style>

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

html 复制代码
 'SYSTEM_VuexAjax': '/vuex/queryVuex', //Vuex的异步请求

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

html 复制代码
 export default {
   setEduNameByAsync: function(context, payload) {
     setTimeout(() => {
       //这里的setEduName(事件类型)是指mutations.js中的setEduName事件
       context.commit('setEduName', payload);
     }, 7000);
     //7000是指7秒之后执行这个事件
   },
   setEduNameByAjax: function(context, payload) {
     
     let _this=payload._this;
     //定义后端都请求地址
     let url = _this.axios.urls.SYSTEM_VuexAjax;
     let params = {
       resturantName: payload.eduName
     }
     _this.axios.post(url, params).then(r => {
       console.log(r);
     }).catch(e => {
       console.log(e);
     });
   }
 }

异步效果图:

后台效果图:

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

相关推荐
web Rookie28 分钟前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
Au_ust36 分钟前
css:基础
前端·css
帅帅哥的兜兜36 分钟前
css基础:底部固定,导航栏浮动在顶部
前端·css·css3
工业甲酰苯胺39 分钟前
C# 单例模式的多种实现
javascript·单例模式·c#
yi碗汤园39 分钟前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
就是个名称40 分钟前
购物车-多元素组合动画css
前端·css
编程一生1 小时前
回调数据丢了?
运维·服务器·前端
丶21361 小时前
【鉴权】深入了解 Cookie:Web 开发中的客户端存储小数据
前端·安全·web
Missmiaomiao2 小时前
npm install慢
前端·npm·node.js
程序员爱技术4 小时前
Vue 2 + JavaScript + vue-count-to 集成案例
前端·javascript·vue.js