抛弃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也不顺 ...
随机推荐
- vue版本一直是2.9.6版本,卸载也卸载不掉,更新也更新不了
原文链接:https://blog.csdn.net/zlzbt/article/details/110136755 主要是找到本地文件 E:\StudyFile\VueStudy λ where v ...
- Echars统计图的使用
第一步去官网挑选自己需要的图形了. 官网地址:https://echarts.baidu.com/ 第二步按照官网的demo,下载需要的js组件并放到自己的项目中. 第三步仿照demo创建需要的div ...
- 构造方法和this的作用
一.构造方法概述 构造方法是一个特殊的方法 是创建对象时候调用的方法 方法的名字很特殊:必须和类名保持一致,大小写都要一样 方法没有返回值 方法也没有返回值类型 构造方法无法在外部手动调用 publi ...
- 话说 wait、notify 、 notifyAll
一.前言 说起java的线程之间的通信,难免会想起它,他就是 wait .notify.notifyAll 他们三个都是Object类的方法, 受到 final 和 native 加持 ,也就造就了他 ...
- div中如何让文本元素、img元素水平居中且垂直居中
一.文本元素在div中的水平居中且垂直居中方法 html代码 <div id="box"> <p>文本元素</p> </div> c ...
- 漏洞复现-ActiveMq任意文件写入漏洞(CVE-2016-3088)
0x00 实验环境 攻击机:Win 10 靶机也可作为攻击机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 未禁用PUT.MOVE等高危方法的ActiveM ...
- 不一样的软件们——GitHub 热点速览 v.21.10
作者:HelloGitHub-小鱼干 创意,是程序员的一个身份代名词,一样的软件有不一样的玩法.比如,你可以像用 git 一样操作一个 SQL 数据库,dolt 就是这样的数据库.又比如,你可以只写文 ...
- FreeBSD 日常应用
freebsd日常应用 办公libreoffice或者apache openoffice 设计 图像编辑:gimp 矢量图设计:lnkscape 视频剪辑:openshot 视频特效:natron 编 ...
- Web全段重点整理
1. HTML+CSS 1.1. HTML+CssDay01 1.1.1. 常用普通标签 常用标签如下 div span a p ul+li h1-h6 img 代码示例: <img src= ...
- Vulkan移植GpuImage(一)高斯模糊与自适应阈值
自适应阈值效果图 demo 这几天抽空看了下GpuImage的filter,移植了高斯模糊与自适应阈值的vulkan compute shader实现,一个是基本的图像处理,一个是组合基础图像处理聚合 ...