代码拉取完成,页面将自动刷新
Vmo 是一个用于前端的数据模型。解决前端接口访问混乱,服务端数据请求方式不统一,数据返回结果不一致的微型框架。
Vmo 主要用于处理数据请求,数据模型管理。可配合当前主流前端框架进行数据模型管理 Vue,React,Angular。
能够有效处理以下问题:
axios.get...
随处可见。Store
。Action
方法混乱,Action
中及存在同步对Store
的修改,又存在异步请求修改Store
。TypeScript
进行代码提示,只能定义 any
类型。Vmo 只提供一个基类,提倡的主要是对数据模型的封装设计。你可以像以下方式封装数据模型
import { Vmo, Field } from "@vmojs/base";
interface IFilterValue {
name: string;
value: string;
}
export default class FilterModel extends Vmo {
@Field
public key: string;
@Field
public name: string;
@Field
public filters: IFilterValue[];
/**
* 将数据适配\转换为模型字段
* @param data
*/
protected load(data: any): this {
data.filters = data.values;
return super.load(data);
}
}
在数据模型的基础上,Vmo
利用驱动器派生子类,赋予数据模型数据获取及存储的能力,你可以像这样实现一个完整的数据模型获取。
AxiosVmo
是基于 Vmo
实现的一个使用Axios
作为 数据获取、存储的 Driver
,你同样可以封装自己的Driver
,通过相同接口,实现多态方法,来做到在不同介质上存储和获取数据。比如IndexDB
,LocalStorage
。
import { AxiosVmo } from "@vmojs/axios";
import { Field, mapValue } from "@vmojs/base";
import { USER_URL } from "../constants/Urls";
import FilterModel from "./FilterModel";
// 商品查询参数
interface IGoodsQuery {
id: number;
search?: string;
filter?: any;
}
interface IGoodsCollection {
goods: GoodsModel[];
goodsRows: number;
filters: FilterModel[];
}
export default class GoodsModel extends AxiosVmo {
protected static requestUrl: string = USER_URL;
@Field
public id: number;
@Field
public catId: number;
@Field
public aliasName: string;
@Field
public uid: number;
@Field
public userId: number;
@Field
public size: { x: number; y: number };
/**
* 返回GoodsModel 集合
* @param query
*/
public static async list(query: IGoodsQuery): Promise<GoodsModel[]> {
const { items } = await this.fetch(query);
return mapValue(items, GoodsModel);
}
/**
* 返回GoodsModel 集合 及附属信息
* @param query
*/
public static async listWithDetail(
query: IGoodsQuery
): Promise<IGoodsCollection> {
const { items, allRows, aggr } = await this.fetch(query);
const goods = mapValue(items, GoodsModel);
const filters = mapValue(aggr, FilterModel);
return { goods, goodsRows: allRows, filters };
}
public static async fetch(query: IGoodsQuery): Promise<any> {
const result = await this.driver.get(this.requestUrl, query);
return result;
}
/**
* 将请求的数据适配转换为Model
* @param data
*/
protected load(data: any): this {
data.catId = data.cat_id;
data.aliasName = data.aliasname;
data.userId = data.user_id;
return super.load(data);
}
}
同样的Vmo
还可以配合 Mobx
使用,真正完成数据模型与数据响应结合使用。
import { Vmo, Field } from "@vmojs/base";
import { observable } from "mobx";
interface IFilterValue {
name: string;
value: string;
}
export default class FilterModel extends Vmo {
@Field
@observable
public key: string;
@Field
@observable
public name: string;
@Field
@observable
public filters: IFilterValue[];
/**
* 将数据适配\转换为模型字段
* @param data
*/
protected load(data: any): this {
data.filters = data.values;
return super.load(data);
}
}
import { Vmo } from "@vmojs/decorator";
@Vmo()
export class PageParams {
constructor(data: any) {}
@Vmo()
type?: string;
// subType2 => subType
@Vmo("subType2")
subType?: string;
@Vmo(({ type, subType }) => `${type}_${subType}`)
finalType?: string;
}
new PageParams({ type: "Type1", subType2: "SubType" });
/**
* =>
*
* {
* type: "Type1",
* subType: "SubType",
* finalType: "Type1_SubType"
* }
*
* */
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。