前段时间学习了下vue3 和ts ,就尝试下做了个项目,结果发现vuex和ts几乎无法结合,越写越别扭,开始怀疑用ts就是自己给自己挖坑,然后加了几个vue相关的群,去抱怨了几句,得到大佬指点:你可以不用vuex!

对,我可以不用vuex,然后尝试实现了一个自己的store ,本人虽然前端是个小白,但c#还是写了五六年,对泛型还是比较熟悉的,写完之后对ts大爱。不多说了 上代码:

Store基类代码如下  :

base-store.ts

 1 import BaseEntity from '@/entities/base-entity'
2 import PageResult from '@/entities/page-result'
3 import { readonly } from '@vue/reactivity'
4
5 export default abstract class BaseStore<T extends BaseEntity> {
6 protected url = ''
7 protected _all: T[] = []
8 public get all() {
9 return readonly(this._all)
10 }
11
12 protected _list: T[] = []
13 public get list() {
14 return readonly(this._list)
15 }
16
17 protected _editItem: T | undefined
18 public get editItem() {
19 return this._editItem
20 }
21 public set editItem(val: T | undefined) {
22 this._editItem = val
23 }
24
25 protected _currentPage = 1
26 public get currentPage() {
27 return this._currentPage
28 }
29 public set currentPage(val) {
30 this._currentPage = val
31 }
32
33 protected _pageSize = 30
34 public get pageSize() {
35 return this._pageSize
36 }
37 public set pageSize(val) {
38 this._pageSize = val
39 }
40
41 protected _totalCount = 0
42 public get totalCount() {
43 return this._totalCount
44 }
45
46 protected _loading = false
47 public get loading() {
48 return this._loading
49 }
50
51 async getAll() {
52 const response = await window.ajax.get(`/api/admin/${this.url}/getall`)
53 this._all = response.data
54 }
55 async get(query: any) {
56 this._loading = true
57 const response = await window.ajax.get(`/api/admin/${this.url}`, { params: query })
58 this._loading = false
59 const page = response.data as PageResult<T>
60 this._totalCount = page.totalCount
61 this._list = page.items
62 }
63 async getById(id: string | number) {
64 const response = await window.ajax.get(`/api/admin/${this.url}/${id}`)
65 return response.data
66 }
67 async create(payload: T) {
68 await window.ajax.post(`/api/admin/${this.url}`, payload)
69 }
70 async update(payload: T) {
71 await window.ajax.put(`/api/admin/${this.url}`, payload)
72 }
73 async delete(id: string | number) {
74 await window.ajax.delete(`/api/admin/${this.url}/${id}`)
75 }
76 }

上面代码中包含了 基本的curd操作 ,和数据的存储(字段属性),不能在外部读取的字段 只需要设置get就行了 ,可以读写的设置 get set

上面代码中用到了BaseEntity 和PageResult 两个类型 代码如下

base-entiy.ts

1 export default interface BaseEntity {
2 id: number | string
3 createTime: Date
4 createUserId: number
5 updateTime: Date
6 updateUserId: number
7 }

page-result.ts

export default class PageResult<T> {
items: T[] = []
totalCount: number = 0
}

作为子类 ,只需要继承基类就可以了 无需多余代码,比如下面的 UserStore

user-store.ts

import { reactive } from 'vue'
import User from '../entities/user'
import BaseStore from './base-store'
class UserStore<T> extends BaseStore<User> {
url = 'user'
} export default reactive(new UserStore())

上面只需要这几行代码就实现了完整的的user的curd  ,还包括分页等操作,代码量大大减少,同样的方法可以实现TeacherStore, StudentStore……

如果基类的方法不能满足业主需求,子类里面可以加入自己特定方法

导出store包裹一层reactive变成代理对象, 可以响应ui界面

实体类 User代码如下

user.ts

import BaseEntity from './base-entity'

export default interface User extends BaseEntity {
id:number
password: string
name: string
phone:string
email:string
}

这样使用store的话就很简单了,就像下面的代码

import userStore from '@/store/user-store'

userStore.getAll()

const list=userStore.list

userStore.eidtItem=list[0]

这样的好处就是全部都是强类型,写代码的时候有智能提示,书写错误编译不通过!不像之前vuex,写起来太难了

像一般后台管理网站,最基本就是 一个列表页面 一个新增对话框 一个修改对话框 ,这样我们还可以进一步去抽象, 提取公共的方法、字段,进一步去减少代码量。比如实现 ListViewModel<T>  CreateViewModel<T>  EditViewModel<T>   这里就不再写了

抛弃vuex ,拥抱ts,手撸泛型Store<T>!的更多相关文章

  1. 手撸Router,还要啥Router框架?react-router/vue-router躺一边去

    有没有发现,在大家使用React/Vue的时候,总离不开一个小尾巴,到哪都得带着他,那就是react-router/vue-router,而基于它们的第三方框架又出现很多个性化约定和扩展,比如nuxt ...

  2. Haskell手撸Softmax回归实现MNIST手写识别

    Haskell手撸Softmax回归实现MNIST手写识别 前言 初学Haskell,看的书是Learn You a Haskell for Great Good, 才刚看到Making Our Ow ...

  3. .NET手撸绘制TypeScript类图——上篇

    .NET手撸绘制TypeScript类图--上篇 近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式. ...

  4. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  6. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  7. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  8. C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架

    C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...

  9. php手撸轻量级开发(一)

    聊聊本文内容 之前讲过php简单的内容,但是原生永远是不够看的,这次用框架做一些功能性的事情. 但是公司用自己的框架不能拿出来,用了用一些流行的框架比如tp,larveral之类的感觉太重,CI也不顺 ...

随机推荐

  1. 创建AD域之后设置DNS服务访问外网

    AD域内需要有DNS服务器,用于解析域内的计算机名,域内的计算解析公网的域名需要设置一个转发器(Forwarder). 一定要设置好自己的默认网关.DNS因为部署在AD服务器上,直接loopback地 ...

  2. 【ZeyFraのJavaEE开发小知识01】@DateTimeFomat和@JsonFormat

    @DateTimeFormat 所在包:org.springframework.format.annotation.DateTimeFormat springframework的注解,一般用来对Dat ...

  3. Go - 代码生成工具

    分享两个常用的代码生成工具: gormgen handlergen gormgen 基于 MySQL 数据表结构进行生成 3 个文件: 生成表的 struct 结构体 生成表的 Markdown 文档 ...

  4. JUnit5学习之八:综合进阶(终篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  5. springboot源码解析-管中窥豹系列之自动装配(九)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  6. Python切换版本工具pyenv

    目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...

  7. Linux:使用systemd管理进程

    Blog:博客园 个人 概述 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能 ...

  8. 《Asp.Net Core3 + Vue3入坑教程》 - 6.异常处理与UserFriendlyException

    简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...

  9. WPF 基础 - Binding 对数据的转换和校验

    1. Binding 对数据的转换和校验 Binding 中,有检验和转换关卡. 1.1 数据校验 源码: namespace System.Windows.Data { public class B ...

  10. 让你的浏览器变成Siri一样的语音助手

    最近业余时间浏览技术文章的时候,看到了一篇关于语音朗读的文章:Use JavaScript to Make Your Browser Speak(用Javascript让你的浏览器说话),文章中提到可 ...