抛弃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也不顺 ...
随机推荐
- 阿里云DataWorks实践:数据集成+数据开发
简介 什么是DataWorks: DataWorks(数据工场,原大数据开发套件)是阿里云重要的PaaS(Platform-as-a-Service)平台产品,为您提供数据集成.数据开发.数据地图.数 ...
- WPF -- 自定义按钮
本文介绍WPF一种自定义按钮的方法. 实现效果 使用图片做按钮背景: 自定义鼠标进入时效果: 自定义按压效果: 自定义禁用效果 实现效果如下图所示: 实现步骤 创建CustomButton.cs,继承 ...
- JS产生GUID
//生成全球唯一字符串function guidGenerator() { var S4 = function () { return (((1 + Math.random()) * 0x10000) ...
- 将MacOS Catalina 降级为 Mojave
1.下载Mojave https://apps.apple.com/cn/app/macos-mojave/id1398502828?ls=1&mt=12 2.更改U盘格式和名称 3.制作U盘 ...
- js浅拷贝(地址引用)和深拷贝(克隆)
浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...
- let、const、var区别?
let.const.var区别? let和const不存在变量提升(没有预解析,var有预解析). let和const在同一作用域范围内不能重复定义变量.(var可以). let和const有严格的作 ...
- Java 集合框架 01
集合框架· ArrayList 和 Vector 对象数组的概述和使用 * A:案例演示 * 需求:我有5个学生,请把这5个学生的信息存储到数组中,并遍历数组,获取到每个学生的信息 Student[] ...
- python3 批量处理域名解析
域名批量解析,快速确认域名的存活性及IP地址,脚本中包含了具体的用法和简要说明 #!/usr/bin/env python # -*- coding:utf-8 -*- # python3.6 fro ...
- Python命令开启http.server服务器
如果想把命令E:\zpic作为提供下载的目录,那么在cmd里cd到该目录下,并执行命令:python -m SimpleHTTPServer 默认的端口号是8000, 服务器根目录就是运行python ...
- FreeBSD WIFI 配置详细介绍
首先运行ifconfig,看看能不能找到你的网卡,如果能,那么你可以走了﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉﹉运行sysctl net.wlan.devices,他可以告诉你,找到的无线网卡编辑/b ...