全局管理之Vuex

简介: 全局管理之Vuex

全局管理之Vuex


每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。

我们之前在store/index2.ts里自己定义的store对象,就是管理了所有组件共用的数据和操作数据的API。

这个Vuex就是一个这样的store。

我们在创建项目时,自动引入了Vuex。可以看到在store/index.ts里自动有了这些

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

而且在入口文件main.ts里,自动在Vue实例里创建好了

import store from './store';
new Vue({
    router: router,
    store,
    render: h => h(App)
}).$mount('#app');

(如果要单独使用时,一定要import,并且在选项里引入store)

一. Vuex的简单使用

我们先在项目提供好的store/index.ts里修改

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store= new Vuex.Store({
  state: {
    count:0
  },
  mutations: {
    increment(state,n){
      state.count+=n
    }
  },
})
console.log(store.state.count);
store.commit('increment',10)
console.log(store.state.count);
export default store;
  1. 声明一个store实例,它有一些构造选项,像new Vue一样。然后导出这个store。
  2. 数据写在state对象里(类似Vue里的data)。使用:store.state.count
  3. 操作数据的方法,写在mutations对象里(类似Vue里的methods)。如果这个函数要访问state里的数据,Vuex自动给他传了一个参数state
  4. 调用store里的方法:store.commit('increment')Vuex里不提供this

其实就是state,mutations,commit的概念,只不过换了另一种形式

二. 在Vue组件中使用store

//Money.vue
<template>
        {{count}}
        <button @click="add">+1</button>
</template>
<script lang="ts">
    import store from '@/store/index.ts';
    @Component({
        computed:{
            count(){
                return store.state.count
            }
        }
    })
    export default class Money extends Vue{
        add(){
            store.commit('increment')
        }
    }
</script>

首先导入文件里的store。数据要定义成计算属性,不能是data。因为data只会在第一次获取,而computed会依赖store里的数据的变化,重新计算。

因为在template里访问不到引入的store,所以方法一是在自己的方法里,调用store的方法。

方法2:this.$store

//Money.vue
<template>
        {{count}}
        <button @click="$store.commit('increment')">+1</button>
</template>
<script lang="ts">
    import store from '@/store/index.ts';
    @Component({
        computed:{
            count(){
                return store.state.count
            }
        }
    })
    export default class Money extends Vue{
    }
</script>

可以在template里,直接访问到$store,进而就可以调用它的方法。

原理:

这个$store其实是this.$store,因为在template里可以不写this。

那么this.$store又是从哪来的呢?

在index.ts里有一句:Vue.use(Vuex),它会把store绑到Vue的原型上。所以Vue实例/组件就可以访问store。而Vue实例/组件也就是this。使用:this.$store

同时,因为在入口文件main.ts里已经自动引入了store,所以在组件里使用时不需要引入了。直接使用this.$store即可

注意

1.

mutations里定义的方法是没有返回值的,不能写return,写了外边调用的时候也拿不到返回值。 只能单纯的操作,不能return

如果有需要调用mutations里的API,并且要它的返回值,把返回值赋给自己组件上的data时,目的是把返回值赋给自己的一个数据。

那么可以在state里声明一个数据,这个API里把return 一个返回值改成进行某种操作后,把得到的值赋给state里的这个数据。

然后在组件里,让自己的数据成为计算属性,return state里的数据。

2. 在ts里使用计算属性要用getter语法

<script lang="ts">
    import Vue from 'vue';
    import {Component} from 'vue-property-decorator';
    @Component({
        computed:{
            tag(){
                return this.$store.state.currentTag
            }
        }
    })
    export default class EditLabel extends Vue {
        created(){
            const id=this.$route.params.id
            this.$store.commit('findTag',id)
            if(!this.tag){
                this.$router.replace('/404')
            }
        }

如果这样写,在ts里使用计算属性this.tag 时会报错,说TS2339: Property 'tag' does not exist on type 'EditLabel'. 可是我们明明声明了,怎么会不存在呢。

之前我们使用计算属性从store里拿到tagList和recordList,没有在ts里用,而是在template里用作展示或循环之类的,所以没有报错。

这可能是因为ts和Vue不配合引起的。

解决方法:使用getter语法

export default class EditLabel extends Vue {
        get tag(){
            return this.$store.state.currentTag
        }

去掉computed对象,改使用get函数。这样在ts里用this.tag就不报错了。 vue class component 写的计算属性的方法

3. mutations里的函数的参数最多两个

在mutations里定义的函数,通常Vuex会自动给传一个state参数。(但是要自己写出来,在参数列表里)如果还需要别的参数,加上state最多只能有两个。如果超过了会报错。

当多个组件的选项有重复时,可以使用mixins选项,把重复的放到混入对象里。

那么TS写法的mixins的语法是什么样的呢?

混入对象的声明

作为对比,在JS里可以直接在创建的文件里导出一个对象,对象里就是组件们都要用到的选项。

在TS里,比如我们在/mixins/tagHelper.ts文件里声明:

import Vue from 'vue'
import Component from 'vue-class-component'
// You can declare mixins as the same style as components.
@Component
export class tagHelper extends Vue {
    createTag(){
        const name=window.prompt("请输入标签名")
        if(!name){
            window.alert('标签名不能为空')
        }else{
            this.$store.commit('createTag',name)
        }
    }
}

在Vue组件里使用

<script lang="ts">
    import {Component} from 'vue-property-decorator';
    import {tagHelper} from '@/mixins/tagHelper';
    import {mixins} from 'vue-class-component';
    @Component({
        components: {Button},
        computed:{
            tags(){
                return this.$store.state.tagList
            }
        }
    })
    export default class Labels extends mixins(tagHelper) {
    }
</script>
  1. 原来extends Vue。 使用mixins就需要extends mixins(tagHelper),括号里边的是定义的文件名。
  2. 导入mixins,导入声明了混入对象的文件

然后在组件里就可以使用createTag方法了。这是js里的methods里的方法。ts里可以不用写methods。

ts里,计算属性是写到@Compontent

相关文章
|
监控 Java
如何使用VisualVM分析内存泄漏?具体流程看这里
如何使用VisualVM分析内存泄漏?具体流程看这里
1836 1
|
2月前
|
人工智能 运维 监控
【2025云栖大会】AI 搜索引擎如何驱动亿级物流:货拉拉 x 阿里云 Elasticsearch
2025云栖大会 AI搜索与向量化模型专场上,拉拉 Elasticsearch技术负责人——陈敏华先生分享了 Elasticsearch 在全球化高并发业务场景下的深度实践,以及在迁移至阿里云 Elasticsearch Serverless 后的显著收益。货拉拉的案例为业界提供了可复制、可落地的技术范本。
342 4
|
2月前
|
机器学习/深度学习 人工智能 算法
AI 肌肤分析技术的演进与落地:从图像理解到智能护肤的工程路径
AI正通过图像识别技术革新护肤行业,实现皮肤状态的智能分析。本文从技术原理、算法演进、评估指标与商业落地四方面,解析AI如何“看懂”肌肤问题,并推动个性化、预测性护肤的未来发展。
259 4
AI 肌肤分析技术的演进与落地:从图像理解到智能护肤的工程路径
|
2月前
|
数据可视化 API 开发工具
Unity3D 2023 游戏开发软件完整部署指南:安装步骤、激活方法及安装包
Unity 2023是一款多功能游戏开发引擎,支持3D游戏、建筑可视化与实时动画创作。新增对Apple Vision Pro的visionOS支持,强化XR设备兼容性,优化多平台图形性能,提升开发效率。
413 1
|
前端开发 Java C++
JUC系列之《CompletableFuture:Java异步编程的终极武器》
本文深入解析Java 8引入的CompletableFuture,对比传统Future的局限,详解其非阻塞回调、链式编排、多任务组合及异常处理等核心功能,结合实战示例展示异步编程的最佳实践,助你构建高效、响应式的Java应用。
|
机器学习/深度学习 人工智能 监控
单车、共享单车已标注数据集(图片已划分、已标注)|适用于深度学习检测任务【数据集分享】
数据是人工智能的“燃料”。一个高质量、标注精准的单车与共享单车数据集,不仅能够推动学术研究的进步,还能为智慧交通、智慧城市的建设提供有力支撑。 在计算机视觉领域,研究者们常常会遇到“数据鸿沟”问题:公开数据集与真实业务需求之间存在不匹配。本次分享的数据集正是为了弥补这一不足,使得研究人员与工程师能够快速切入单车检测领域,加速模型从实验室走向真实应用场景。
|
消息中间件 存储 Java
深入源码理解MQ长轮询优化机制
【11月更文挑战第22天】在分布式系统中,消息队列(MQ)作为一种重要的中间件,广泛应用于解耦、异步处理、流量削峰等场景。其中,延时消息和定时消息作为MQ的高级功能,能够进一步满足复杂的业务需求。为了实现这些功能,MQ系统需要进行一系列优化,长轮询机制便是其中的关键一环。本文将深入探讨MQ如何设计延时消息和定时消息的优化机制,特别是长轮询机制的实现原理及其在Java中的模拟实现。
266 2
|
安全 数据安全/隐私保护 Windows
数据安全的守护者:备份工具和恢复方法详解
数据安全的守护者:备份工具和恢复方法详解
552 7
|
DataWorks 监控 安全
DataWorks产品使用合集之怎么设置实时同步任务的速率和并发
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
11月前
|
存储 人工智能 缓存
怎么根据自己的业务选择阿里云服务器配置大小?
本文指导如何根据业务需求精准选择阿里云服务器配置,涵盖个人轻量级至企业级、计算密集型等场景,推荐不同实例类型、存储与带宽方案,并提供成本优化策略,如包年包月节省成本、按需升级配置及选用性价比高的自研ARM架构实例。帮助用户在数字化转型中实现性能与成本的平衡。 注:以上配置与价格基于阿里云2025年官方数据,实际信息可能有所调整,请以官网实时页面为准。