11.Vuex

简介: 11.Vuex

1.介绍

1.1.Vuex是什么?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window),提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

1.2. 什么是“状态管理模式”?

这个状态自管理应用包含以下几个部分:

  • state,驱动应用的数据源;
  • view,以声明方式将 state 映射到视图;
  • actions,响应在 view 上的用户输入导致的状态变化。

2.使用

2.1.安装

npm i -S vuex@3.6.2

2.2.创建store文件夹,创建文件

创建好如下图所示

2.3.在src/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

2.4.在src/main.js中导入并使用store实例

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import axios from '@/api/http'
import VueAxios from 'vue-axios'
import router from './router'
import store from './store'
//开发环境下才会引入mockjs
process.env.MOCK && require('@/mock')
Vue.use(ElementUI);
Vue.use(VueAxios,axios)
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
  el: '#app',
  data(){
    return{
      Bus: new Vue({})
    }
  },
  router,
  store,
  components: { App },
  template: '<App/>'
})

2.5.在views新建vuex目录,添加Page1.vue和Page2.vue文件

Page1.vue

<template>
  <div>
    <h1>这是页面1</h1>
  </div>
</template>
<script>
export default {
  name: "Page1"
}
</script>
<style scoped>
</style>

Page2.vue

<template>
  <div>
    <h1>这是页面2</h1>
  </div>
</template>
<script>
export default {
  name: "Page1"
}
</script>
<style scoped>
</style>

2.6.配置路由

修改src/router/index.js

import Page1 from '@/views/vuex/Page1'
import Page2 from '@/views/vuex/Page2'
#添加到与TopNav同级的地方
{
    path: '/vuex/Page1',
  name: 'Page1',
  component: Page1
},{
    path: '/vuex/Page2',
  name: 'Page2',
  component: Page2
}

2.7.修改components/LeftNav.vue

=====仅展示部分内容
<el-menu
    router :default-active="$route.path"
    default-active="2" class="el-menu-vertical-demo" background-color="#334157"
           text-color="#fff" active-text-color="#ffd04b" :collapse="collapsed">
    <!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
    <div class="logobox">
      <img class="logoimg" src="../assets/img/logo.png" alt="">
    </div>
    
    ///======添加的内容
    <el-menu-item
      index="/vuex/Page1"
      key="'key_999">
      <span>Vuex页面1</span>
    </el-menu-item>
    <el-menu-item
      index="/vuex/Page2"
      key="'key_1000">
      <span>Vuex页面2</span>
    </el-menu-item>

此时应该出现的效果

3.实例

3.1.修改src/store/state.js

export default {
  name: 'Vuex学习'
}

3.2.取值

3.2.1.state直接取值

修改src/views/vuex/Page1.vue的内容

<template>
  <div>
    <h1>这是页面1========{{msg}}</h1>
    <p>state直接取值</p>
    <button @click="func1">state直接取值</button>
  </div>
</template>
<script>
export default {
  name: "Page1",
  data(){
    return{
      msg: null
    }
  },
  methods:{
    func1(){
      this.msg = this.$store.state.name;
    }
  }
}
</script>
<style scoped>
</style>

效果

3.2.2.getters取值

1.修改src/store/getters.js中的值

export default {
  getName(state){
    return state.name;
  }
}

2.修改Page1.vue的内容

#div中添加
<p>getters取值</p>
<button @click="func2">getters取值</button>
#methods中添加
func2(){
  this.msg = this.$store.getters.getName;
}

3.效果

3.3.存值

3.3.1.mutations存值

1.修改mutations.js的内容

export default {
  setName(state, payload) {
    state.name = payload.name;
  }
}

2.修改Page1.vue

#div中添加
<p>mutations存值</p>
<button @click="func3">mutations存值</button>
#methdos中添加
func3(){
  this.$store.commit('setName',{
    name: '这是修改后的Vuex学习'
  });
}

3.修改Page2.vue

<template>
  <div>
    <h1>这是页面2===={{msg}}</h1>
  </div>
</template>
<script>
export default {
  name: "Page2",
  data(){
    return{
      msg: null
    }
  },created() {
    this.msg = this.$store.state.name;
  }
}
</script>
<style scoped>
</style>

3.效果

3.3.2.actions存值

1.修改Page1.vue的内容,删除data中的msg,改为computed属性

computed:{
    msg(){
        return this.$store.state.name;
    }
}

2.修改store/actions.js

export default {
  setNameAsync(context, payload) {
    //context指的是vuex的实例
    //等价于this.$store
    setTimeout(function () {
      context.commit('setName',payload);
    },6000)
  }
}

3.修改Page1.vue

#div中添加
<p>actions存值</p>
<button @click="func4">actions存值</button>
#methods中添加
func4(){
  this.$store.dispatch('setNameAsync',{
    name: '这是修改后的Vuex学习--action'
  });
}

效果

异步修改值

3.4.发送ajax请求获取后台数据

1.修改api/action.js

'VUEX_INFO': '/vuex/queryVuex',//vuex异步获取数据

2.修改Page1.vue

#div中添加
<p>后台ajax改变值</p>
<button @click="func5">后台ajax改变值</button>
#methods中添加
func5(){
      this.$store.dispatch('setNameAjax',{
        _this: this
      });
    }

3.修改actions.js

export default {
  setNameAsync(context, payload) {
    //context指的是vuex的实例
    //等价于this.$store
    setTimeout(function () {
      context.commit('setName', payload);
    }, 3000)
  },
  setNameAjax(context, payload) {
    let _this = payload._this;
    let url = _this.axios.urls.VUEX_INFO;
    let params = {
      resturantName: '这是ajax的修改'
    }
    _this.axios.get(url, {params}).then(resp=>{
      if(resp.data.success){
        context.commit('setName',{
          name: resp.data.msg
        })
      }
    }).catch(err=>{
    })
  }
}

4.效果

目录
相关文章
|
Linux
认识Linux指令之 “tar” 指令
认识Linux指令之 “tar” 指令
452 0
认识Linux指令之 “tar” 指令
|
5月前
|
数据采集 人工智能 算法
罗兰艺境GEO内容工程实战复盘:CSDN 92分技术文章是怎样炼成的?
本文深度复盘罗兰艺境GEO内容团队如何在2天内连续产出3篇CSDN 92+高分技术文章。拆解其选题策略、写作框架与技术深度打磨,揭示平台算法与AI大模型双重认可背后的内容工程方法论,为技术创作者提供可复现的实战参考。
426 3
罗兰艺境GEO内容工程实战复盘:CSDN 92分技术文章是怎样炼成的?
|
10月前
|
机器学习/深度学习 人工智能 分布式计算
阿里云领跑中国面向生成式AI的数据基础设施市场
IDC发布《IDC MarketScape: 中国面向生成式AI的数据基础设施2025年厂商评估》报告中,从产品能力、战略指标和收入规模三大核心维度评估了24家互联网厂商、云服务厂商、大数据厂商。结果显示,阿里云位居领导者类别,并在产品能力上领先其它厂商。
|
7月前
|
自然语言处理 监控 机器人
深入RAG架构:分块策略、混合检索与重排序的工程实现
本文详解RAG系统从Demo迈向生产需攻克的5个关键层级:基础向量检索(Level 1)、智能分块与元数据增强(Level 2)、混合搜索(语义+关键词,Level 3)、交叉编码器重排序(Level 4),以及生产级护栏、评估与兜底机制(Level 5)。强调“不编造、可验证、易诊断”,聚焦真实故障场景与可落地优化。
636 2
深入RAG架构:分块策略、混合检索与重排序的工程实现
|
6月前
|
存储 人工智能 监控
openclaw造神记录-02:通俗解释xyvaclaw的核心功能
本文档用生活化比喻详解V5六大核心能力:模式库(经验笔记本)、意图分类(听懂人话)、推理链(深度思考)、DAG分解(做菜步骤图)、记忆检索(大脑搜索)、情绪检测(察言观色),展现AI如何从“工具”进化为有思考、有记忆、懂情感的智能伙伴。(239字)
|
6月前
|
人工智能 供应链 监控
开发wms系统该具备那些专业能力 低代码实现专业wms系统优势
2026年,WMS已跃升为串联供应链全环节的核心基础设施。本文从定义、技术、功能、行业适配、案例及趋势六大维度,系统解析专业WMS如何通过AI、IoT、低代码等技术实现库存精准管控、作业提效、成本优化与全链协同,助力企业深度数字化转型。
|
8月前
|
机器学习/深度学习 测试技术 API
阿里云分布对齐的序列蒸馏实现卓越的Long CoT推理能力,登顶Hugging Face趋势榜!
阿里云飞天实验室发布DASD推理蒸馏技术,开源DASD-4B/30B-Thinking模型及高质量训练数据。创新提出温度调节学习、差异感知采样与混合策略蒸馏三大技术,仅用44.8万样本即在AIME25(83.3)、LCB v5(69.3)、GPQA-D(68.4)等基准上超越同尺寸甚至更大模型,数据集登顶Hugging Face趋势榜Top5。
893 3
|
9月前
|
移动开发 小程序 前端开发
告别高额开发费!优质婚恋交友系统/高颜值婚恋交友小程序源码快速入局
高颜值、全功能婚恋交友系统源码,支持微信小程序/H5/App三端。基于PHP+UniApp,含完整部署文档与二次开发指南,模块解耦易扩展,助力创业者快速落地校园恋爱、银发婚恋等多元场景,附赠技术群支持与定制服务。
398 0
|
8月前
|
缓存 监控 Java
高并发场景下的闲鱼商品详情API性能优化
你想了解高并发场景下闲鱼商品详情 API 的性能优化策略,核心是解决大流量冲击下接口响应慢、服务稳定性差的问题,我会从架构设计、技术手段、流量管控三个维度,拆解闲鱼这类高并发场景下的核心优化思路和落地方案。
|
12月前
|
机器学习/深度学习 人工智能 边缘计算
AI 奶茶店吸管监测识别解决方案技术开发说明
本方案针对奶茶店打包环节中吸管与奶茶数量不匹配问题,采用AI视觉识别技术,实现自动化精准监测。
526 0