抛弃vuex ,拥抱ts,手撸泛型Store<T>!
前段时间学习了下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>!的更多相关文章
- 手撸Router,还要啥Router框架?react-router/vue-router躺一边去
有没有发现,在大家使用React/Vue的时候,总离不开一个小尾巴,到哪都得带着他,那就是react-router/vue-router,而基于它们的第三方框架又出现很多个性化约定和扩展,比如nuxt ...
- Haskell手撸Softmax回归实现MNIST手写识别
Haskell手撸Softmax回归实现MNIST手写识别 前言 初学Haskell,看的书是Learn You a Haskell for Great Good, 才刚看到Making Our Ow ...
- .NET手撸绘制TypeScript类图——上篇
.NET手撸绘制TypeScript类图--上篇 近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式. ...
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- C#基于Mongo的官方驱动手撸一个Super简易版MongoDB-ORM框架
C#基于Mongo的官方驱动手撸一个简易版MongoDB-ORM框架 如题,在GitHub上找了一圈想找一个MongoDB的的ORM框架,未偿所愿,就去翻了翻官网(https://docs.mongo ...
- php手撸轻量级开发(一)
聊聊本文内容 之前讲过php简单的内容,但是原生永远是不够看的,这次用框架做一些功能性的事情. 但是公司用自己的框架不能拿出来,用了用一些流行的框架比如tp,larveral之类的感觉太重,CI也不顺 ...
随机推荐
- sql注入和union all关联查询的学习总结
1.后台从页面取值进行sql查询时最好不要直接拼,如下代码: String sql = "SELECT wo.* " + " from push_command pu & ...
- OSPF“孤儿”区域
在多区域OSPF中,area0为主干区域,其他非主干区域都需要包含一个接口连接主干区域,那么当出现有的区域不和主干区域相连,成了"孤儿": 解决办法: 虚链路 在连接孤儿区域的路由 ...
- 【机制】js中的this指向
1.this的使用场景 我们先把this的使用场景分为两大类:函数外和函数内: 函数外的this 就是在全局代码里,直接使用this: "use strict"; let name ...
- 记录PHP post提交表单导入mysql中文乱码的问题
记录记录PHP post提交表单导入mysql中文乱码的问题 关于乱码,这是个糟糕的问题!涉及到很多地方 解决思路:程序所涉及的环境字符集不一致导致 mysql出现乱码一般是mysql数据库内部的字符 ...
- java将一个list转换成一个String,中间用分隔符隔开
List sn=[123,1231,1231,231] sn.toString();//[123,1231,1231,231] sn.join(',').toString();//123,1231,1 ...
- java 递归求二叉树深度
给定二叉树,找到它的最大深度. 最大深度是从根节点到最远叶节点的最长路径上的节点数. 注意:叶子是没有子节点的节点. Example: Given binary tree [3,9,20,null,n ...
- 仿MSDN的帮助系统
作为软件开发人员,软件做好后,接下来就是编写文档.我自己也是做软件的,经常有用户询问软件的安装与使用, 我一直很喜欢微软的MSDN帮助系统,简介.大气,使用方便. 网上也找了很久,感觉一直没有合适的, ...
- Python中并发、多线程等
1.基本概念 并发和并行的区别: 1)并行,parallel 同时做某些事,可以互不干扰的同一时刻做几件事.(解决并发的一种方法) 高速公路多个车道,车辆都在跑.同一时刻. 2)并发 concurre ...
- 1.mysql读写
一.数据库读取(mysql) 参数 接受 作用 默认 sql or table_name string 读取的表名,或sql语句 无 con 数据库连接 数据库连接信息 无 index_col Int ...
- 制作API离线chm帮助文件教程
当我们开发好一个通信库的时候,我们希望给这个通信库配备一个帮助文档,最好的方式,就是有一个离线的chm版本的API文档,这样别人在使用的时候,就可以清楚看到命名空间.类的结构,同时也能看到每个方法和属 ...