Vue 进阶系列丨Vuex+TS 代码提示

vuex4+typescript实现智能提示 vue3已经被作为默认版本发布快三个月了,但是目前还没有使用vue3+ts独立开发过项目,刚好自己在后台系统方面涉猎较少,于是决定使用vue3+ts开发一个后台管理系统,在数据管理时,对于跨了很多层级的组件间的共享数据就采用vuex进行储存和获取,为了充分发挥ts的功能,决定实现在使用vuex调用方法时智能提示方法名,也算是督促自己多学学ts既然作为学习笔记,当然要记录一下自己学到的一些ts语法(很基础的东西我就不再记录了) typeof vs keyof 泛型 && 泛型约束 && 泛型推断 阅读详情

184fa0e08391cb9cad186f5527c577c0.png

Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!


2013年7月28日,尤雨溪第一次在 GItHub 上为 Vue.js 提交代码;2015年10月26日,Vue.js 1.0.0版本发布;2016年10月1日,Vue.js 2.0发布。

最早的 Vue.js 只做视图层,没有路由, 没有状态管理,也没有官方的构建工具,只有一个库,放到网页里就可以直接用了。

后来,Vue.js 慢慢开始加入了一些官方的辅助工具,比如路由(Router)、状态管理方案(Vuex)和构建工具(Vue-cli)等。此时,Vue.js 的定位是:The Progressive Framework。翻译成中文,就是渐进式框架。

Vue.js2.0 引入了很多特性,比如虚拟 DOM,支持 JSX 和 TypeScript,支持流式服务端渲染,提供了跨平台的能力等。Vue.js 在国内的用户有阿里巴巴、百度、腾讯、新浪、网易、滴滴出行、360、美团等等。

Vue 已是一名前端工程师必备的技能,现在就让我们开始深入学习 Vue.js 内部的核心技术原理吧!


什么是vuex

vuex 是 vue 中用来做状态管理的一个仓库,一般较大型的项目才有必要使用它,因为如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。它主要包括state、mutations、actions、getters、modules 五个核心概念,有关具体的使用,我们这篇文章不做重点讲解,这里主要告诉大家如何在vuex中集成 typescript,做到代码提示功能。


最终效果预览

我们先看一下最终要达到的效果是什么样的:

1. 拿到 getters: 自动提示每个模块中定义的 getters,不用再回到定义的地方确认每一个 getters 的命名是否正确了

5e9a5bc289ef23b0c618aaadbccc2fc3.png

2. 调用 mutation:

d944cd752ea24fe2faf5036bf0dab4c4.png

3. 调用 actions

631f0315190c45e9dfd7a973c11dcf90.png

最终的效果就是,在我们输入引号的时候,编辑器会自动弹出提示,我们可以快速找到目标方法或者 getters 了,减少了代码出错的可能性。


实现步骤

1. 创建项目,选用 vue-ts 开发模版

npm init vite@latest

2. 引用 vuex

npm install vuex@next --save

3. 在 src 下新建 store 目录,然后 store 下新建 index.ts

// store.ts
import { InjectionKey } from 'vue'
import { createStore, useStore as baseUseStore, Store } from 'vuex'
// 引入tab模块
import tabs, { TabsState } from './modules/tabs'
// 引入menu模块
import menu, { MenuState } from './modules/menu'
// 引入vuex-ts自定义类型推断类,代码提示的核心
import { CommonStore } from './vuex_ts'


// 定义根级State类型
export type RootState = {
    tabs: TabsState,
    menu: MenuState
}


// 把多个模块聚合在一起
export const modules = {
    tabs: tabs,
    menu: menu
}


export const key: InjectionKey<Store<RootState>> = Symbol()
export const store = createStore<RootState>({
    modules
}) as CommonStore


// 定义自己的 `useStore` 组合式函数
export function useStore(): CommonStore {
    return baseUseStore(key);
}

4. 在 store 文件夹下,新建 modules 文件夹,并新建两个 ts 文件,这里每个ts文件相当于一个 vuex 模块,分别是:tabs.ts、menu.ts

// menu.ts


import {RootState} from '@/store'
import { ActionContext } from 'vuex';


// 定义menu模块下的,state的类型
export type MenuState = {
    count:number;
}


// 定义menu模块下的state
export const state: MenuState = {
    count:0
}
// 定义menu模块下的mutations
export const mutations = {
    setCount(state:MenuState, count:number):void{
        state.count = count
    }
}
// 定义menu模块下的actions
export const actions = {
    setAsyncCount({commit}:ActionContext<MenuState,RootState>){
        setTimeout(() => {
            state.count++
        }, 1000);
    }
}
// 定义menu模块下的getters
export const getters = {
    getCount(state:MenuState){
        return state.count
    }
}


export default {
    namespaced:true, // 声明命名空间
    state,
    mutations,
    actions,
    getters
}
// tabs.ts


import { ActionContext } from "vuex"
import { RootState } from "@/store"


// 定义单个tab的类型
interface ITab{
    title:string,
    path:string
}
// 定义tabs模块下的,state的类型
export type TabsState = {
    tabLists: Array<ITab>
}
// 定义tabs模块下的state
export const state: TabsState = {
    tabLists:[],
}
// 定义tabs模块下的mutations
export const mutations = {
    addTab(state:TabsState, tab: ITab):void{
        if(state.tabLists.some(item => item.path === tab.path)){return}
        state.tabLists.push(tab);
    }
}
// 定义tabs模块下的actions
export const actions = {
    addAsyncTabs({commit}:ActionContext<TabsState,RootState>,tab:ITab){
        if(state.tabLists.some(item => item.path === tab.path)){return}
        state.tabLists.push(tab);
    }
}
// 定义tabs模块下的getters
export const getters = {
    getTabs(state:TabsState){
        return state.tabLists
    }
}


export default {
    namespaced:true, // 声明命名空间
    state,
    mutations,
    actions,
    getters
}

5. 在store文件夹下,新建vuex_ts.ts文件

// vuex_ts.ts


import {modules,RootState} from './index'
import { CommitOptions, DispatchOptions, Store as VuexStore } from 'vuex'
// 获取modules的类型
type Modules = typeof modules
// 获取所有模块下的mutations
type GetMutation<T> = T extends {mutations:infer G} ? G : never;
type GetMutations<T> = {
    [K in keyof T]:GetMutation<T[K]>
}
type mutationsObj = GetMutations<Modules>


// 获取所有模块下的actions
type GetAction<T> = T extends {actions:infer G} ? G : never;
type GetActions<T> = {
    [K in keyof T]:GetAction<T[K]>
}
type actionsObj = GetActions<Modules>


// 获取所有模块下的getters
type GetGetter<T> = T extends {getters:infer G} ? G : never;
type GetGetters<T> = {
    [K in keyof T]:GetGetter<T[K]>
}
type getterObj = GetGetters<Modules>


// tabs/addTabs  menu/setCount
type AddPrefix<prefix,keys> = `${prefix & string}/${keys & string}` 
type GetKey<T,K> = AddPrefix<K,keyof T>;
type Getkeys<T> = {
    [K in keyof T]:GetKey<T[K],K>
}[keyof T];
type ss = Getkeys<mutationsObj>


// 获取当前模块下每个函数的返回值
type GetFunc<T,A,B> = T[A & keyof T][B & keyof T[A & keyof T]]
type GetMethod<T> = {
    [K in Getkeys<T>]:K extends `${infer A}/${infer B}` ? GetFunc<T,A,B> : unknown
}


type GetMutationsFunc = GetMethod<mutationsObj>
type GetActionsFunc = GetMethod<actionsObj>
type GetGettersFunc = GetMethod<getterObj>


// 去掉之前的,使用自己定义的
export type CommonStore = Omit<VuexStore<RootState>, 'commit' | 'getters' | 'dispatch'> & {
    commit<K extends keyof GetMutationsFunc, P extends Parameters<GetMutationsFunc[K]>[1]>(
        key: K,
        payload?: P,
        options?: CommitOptions
    ): ReturnType<GetMutationsFunc[K]>
} & {
    getters: {
        [K in keyof GetGettersFunc]: ReturnType<GetGettersFunc[K]>
    }
} & {
    dispatch<K extends keyof GetActionsFunc>(
        key: K,
        payload?: Parameters<GetActionsFunc[K]>[1],
        options?: DispatchOptions
    ): ReturnType<GetActionsFunc[K]>
}

6. 代码目录:

这里给大家展示一下store文件夹下的代码目录,以便大家理解

d5e8cc1cdc97e245d68c2f3af4b72424.png


效果查看

到这里,我们的vuex集成ts,生成代码提示就已经实现了,我们这里看下效果:

<template>
</template>


<script setup lang='ts'>
// 这里要注意,引入的是我们自定义的useStore,不是vuex里面的useStore
import { useStore } from './store';
const store = useStore()
store.getters['menu/getCount']
store.dispatch('menu/setAsyncCount')
store.commit('menu/setCount')
</script>

cd1feec732f070e3e5a41741c0c80ba2.png


Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!

b1bc3690d71529d9fb4ab5f8744cea45.png

叶阳辉

HFun 前端攻城狮

往期精彩:

TS Vue项目中使用TypeScript 有时候我们也想扩展像lib.d.ts这样的声明类型,可以在全局下进行使用,所以TS给我们提供了global.d.ts文件使用方式,这个文件中定义的类型都是可以直接在全局下进行使用的,不需要模块导入。当然并不是所有的JS模块都需要下载第三方的@types,因为有些模块默认就会代码d.ts的声明文件,例如moment这个模块,安装好后,就会自带moment.d.ts文件。导入方式是必须在顶部进行添加的,不能在其他语句中引入,这样就不能在后续的某个时机去导入,所以TS提供了动态引入模块的写法。 阅读详情

相关推荐

【已解决】TS中引入vuex4会提示 ‘无法找到模块“vuex”的声明文件。

无法找到模块“vuex”的声明文件。“d:/study/shop-admin-with-vue3-vite-ts/node_modules/vuex/dist/vuex.mjs”隐式拥有 “any” 类型。使用 “paths” 映射,在找不到模块的默认路径时,将其映射到类型定义文件。

无言非影的博客 7102

Vuex集成TS

Vuex集成 Vuex结合Composition API 组合式api中没有this.$store,可以使用useStore来替代 import { useStore } from 'vuex' export default { setup () { const store = useStore() } } 获取state和getters // 定义store中的state和getters const store = new createStore({ state: {

Raccon_的博客 1010

Vue2.0用TypeScript+vuex重构项目

Vue2.0用TypeScript+vuex重构项目 不得不说现在前端的技术更新越来越快了,一不学习就要给这个大环境淘汰了。 Typescript是javascript的超集。本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。其中我认为最重要的就是静态类型检查了。 写程序时项目若没有良好的设计思想,用js写的话就会“重构火葬场”。 话不多说,直接干货: 写在前面 Vue我已经学习了一个学...

阿洪的博客 4450

vue3+Ts使用vuex模块化和非模块化管理的2种方式(非pinia)

vue3+Ts使用vuex模块化和非模块化管理的2种方式(非pinia)

weixin_45441173的博客 4334

CPU也能跑大模型?手把手教你用vLLM离线部署Qwen2.5-7B-Instruct(附性能优化技巧)

本文详细介绍了如何在CPU服务器上高效部署Qwen2.5-7B-Instruct模型,通过vLLM框架和一系列优化技巧实现离线推理。内容包括环境配置、模型加载优化、性能调优及生产环境部署方案,帮助开发者在资源有限的情况下也能运行大语言模型。

weixin_28691741的博客 494

【PT+Arduino+OneNET基础教程1】PacketTracer中MCU芯片编程教程(零基础入门)

PacketTracer软件内MCU芯片编程入门 零基础

ChloeMax_的博客 9456

vue2.6 + ts 使用vuex

vue2.6 + ts 使用vuex

weixin_47409897的博客 1543

PCB线路板的制作工艺流程分享!2021-08-21

Pcb板制作工艺流程:开料-钻孔-沉铜-压膜-曝光-显影-电铜-电锡-退膜-蚀刻-退锡-光学检测-印阻焊油-阻焊曝光、显影-字符-表面处理-成型-电测-终检-抽测-包装。具体如下:1、开料(CUT) 将原始的覆铜板切割成可以用在生产线上制作的板子过程2、钻孔 使PCB板层间产生通孔,以达到连通层间的目的。 3、沉铜 经过钻孔后的线路板在沉铜缸内会发生氧化还原反应,形成铜层对孔进行孔金属化,使原来绝缘的基材表面沉积上铜,达到层间电性相通。 4、压膜 压膜后的PCB板上面压了一层蓝色的干膜, 干膜是一个载体

jdbpcb88的博客 3249

vue3+ts使用使用vuex

1、 安装 vuex npm install vuex -S 2、在目录下创建store文件 import { createStore } from 'vuex' export default createStore({ // 1、 存储所有全局数据 state: { num: '1' }, // 2、 需要通过计算获取state里的内容获取的数据 // 只能读取不可修改 getters: { }, // 3、定义对s

this__valve的博客 1421

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

本文详细介绍了如何通过部署开源元搜索引擎SearXNG,为本地运行的OpenWebUI大语言模型(如Qwen、Llama)配置联网搜索功能,解决其知识库过时的问题。文章重点讲解了SearXNG的Docker部署、集成国内搜索引擎(如百度、360)的配置方法,以及如何与OpenWebUI无缝对接,从而实现本地大模型获取实时、准确的中文信息,提升其实用性。

weixin_28835583的博客 1879

Open3D 教程学习指南 (持续整理)

Open3D 是一个开源库,旨在为 3D 数据处理提供高效且易用的工具。它由 Intel 开发和维护,支持多种 3D 数据处理任务,如点云处理、3D 重建、几何处理和可视化等。

Chase Blog 5932

Vue 进阶系列丨Pinia 的基本使用

Vue 进阶系列教程将在本号持续发布,一起查漏补缺学个痛快!若您有遇到其它相关问题,非常欢迎在评论中留言讨论,达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧!2013年7月28日,尤雨溪第一次在 GItHub 上为 Vue.js 提交代码;2015年10月26日,Vue.js 1.0.0版本发布;2016年10月1日,Vue.js 2.0发布。最早的 Vue.js ...

HFunTeam的博客 8771

gsplat在windows本地部署

3DGS的cuda提效和优化内存的版本gsplat,使得在有一定GPU计算能力的电脑上也能够尝尝3DGS的效果。我在2025年的开年之初尝试配置过gsplat,由于过程中遇到很多问题,最终还是有一些windows上字符编码的问题,没有跑通,最近看gsplat的github更新了3DGUT,优化了反射和二次折射,以及适用于非线性相机模型,如鱼眼相机等。在data目录下下载好了360_v2的数据,进入之后images文件夹是原始分辨率的图像,images_2是下采样系数为2的数据,以此类推。

yuleaf_csdn的博客 2371

vue3.0 + ts 之 vuex的使用

目录vue3.0 + ts 之 vuex的使用todo/ToDoList.vuetodo/ToDoInput.vuesrc / hooks /index.tssrc / typeing / index.tsstore / state.tsstore / actionsType.tsstore / actions.tsstore / mutations.ts vue3.0 + ts 之 vuex的使用 vuex执行流程图 执行流程: 第一大步: 1:先在组件之中触发 dispatch 分发到 ac

weixin_47409897的博客 4995

三菱PLC FX3U温度控制系统案例

U0\G100是平均次数的设置,设置为100个数据取平均,这样数据显示更加稳定,通道1的数据显示再U0\G10里面,温度模块的数据对应是0~150°输出0~10V,对应到0~10000的数据10000是150°的66.667倍,因此把数据传送到D0后转换成浮点数,再去除以66.667,就得到实际的温度了,数据存放到D2。触摸屏软件使用EBpro软件,设计界面如下,右边的是温度的实时曲线图,左边的是温度报警表,当当前温度超过了报警温度这种时,就会在这个表格上显示对应对应的报警。(1)实时显示温度值;

u010670857的博客 4060

手把手教你用ESP32-C3打造智能聊天机器人-立创实战派

本文将详细介绍如何利用立创ESP32-C3开发板,烧录小智AI程序,快速实现一个功能强大的聊天机器人。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5539

Vue -Ts入门 Vuex (二)

接着上文 Vue -Ts入门 (二) 本人也是第一次写,所以若有所出处,欢迎指正。 准备工作 按照个人项目实际情况 npm i vuex -S npm i vuex-class -S 文件夹目录 main.ts import Vue from "vue"; import Test1 from "./views/Test1.vue"; + import store from "./sto...

没有翅膀的我们,只是随便认为不能飞而已 3731

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ts增强编译vuex之getters

1.准备条件,vue3项目,并且安装了vuex与ts,这里不再演示 2.在src下新建store文件夹,并在store文件夹下新建index.ts文件与modules文件夹,如下图 3.在main.ts中注册vuex(此时main.ts会提示报错,因为第二步创建的文件信息都还是为空) import { createApp } from 'vue' import App from './App.vue' import store from '@vuex/index'; const app = c

温壁 2617

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

vue + ts Vuex篇

Vuex对Typescript的支持,仍十分薄弱,官方库只是添加了一些.d.ts声明文件,并没有像vue 2.5这样内置支持。 第三方衍生库vuex-typescript,vuex-ts-decorators,vuex-typex,vuex-class等等,我个人的总结,除了vuex-class外,基本都存在侵入性太强的问题,引用不算友好。而vuex-class提供的功能其实也...

weixin_30758821的博客 3871

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vue-cli3构建TS项目(基础篇)

概述: Vue三个TS官方库 vue-class-component vue-property-decorator vuex-class 1.通过vue-cli3生产项目 vue create xxx vue-cli3脚手架生成项目目录说明 │ .browserslistrc │ .gitignore │ .postcssrc.js // postcss 配置 │ babel.co...

非为000的博客 3万+

vue3 + vant + ts + vuex + vite

vue3 + vant + ts + vuex + vite 从零搭建起一个项目

jzk_2016ks的博客 3186

Vue3+Vuex +TypeScript在setup语法糖中的使用方式,vuex类型提示功能

vuex 是 vue 中用来做状态管理的一个仓库,一般较大型的项目才有必要使用它,因为如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。它主要包括state、mutations、actions、getters、modules 五个核心概念,有关具体的使用,我们这篇文章不做重点讲解,这里主要告诉大家如何在vuex中集成 typescript,做到代码提示功能。 一、vuex简单的引入方式,不会进行类型提示 1. install vuex npm install vuex@nevt --s

qq_36711388的博客 2213

vuex4.0中使用typescript, vuex4.0中modules的ts使用,vue3 + vuex4.0 + typescript 使用详情

最新的vue3.x版本已经发布一段时间了,vue3 + vuex + ts 结合更加完美,简单介绍下在 vuex 中配置ts的一种方式, 下面基于vue3.x+ vuex4.x,配置之后只需要实现定义各个 state 的类型, 使用时完全不在需要再次关注,会自动推断。如下图示列中 @ 表示src的别名配置。 一、store文件夹目录介绍如下图所示,store文件夹下一级目录有index.ts 初始化vuex的配置, interface.ts 设置root层state类型, modules用来存放vuex.

一曲红尘诀 1万+

typescript vuex_vue进阶系列——用typescript玩转vue和vuex

用过vue的朋友大概对vuex也不陌生,vuex的官方解释是专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。说的简单点就是对vue的状态进行统一管理,如下图介绍了其管理模式:我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019...

weixin_39616222的博客 376

用 vite 构建 vue3 + TS 项目实战

1、项目初始化 npm install create-vite@2.9.0 -g // 全局安装 create-vite npm init @vitejs/app shop-admin // 初始化项目(shop-admin 项目名) cd shop-admin npm install npm run dev 2、eslint 基础配置 npm install eslint --save-dev npm install@eslint/create-confi...

weixin_37883657的博客 1万+

typeScript学习(六)之在vue中使用ts编写vuex

vuex 装饰器 cnpm install -s vuex-module-decorators 文件地址:/store/modules/about.ts import { Module, VuexModule, Mutation, Action, getModule } from 'vuex-module-decorators' import store from '../index' const getList = () => { return new Promise<Array&

李@@的博客 4988
上一篇: JS数据结构与算法丨时间复杂度与空间复杂度
下一篇: Vue 进阶系列丨自定义指令实现按钮权限功能
HFun TM
博客等级 码龄5年 98粉丝 46原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值