npm install vue-dm> + 什么是数据模型?
> + 一组数据的所有操作方法与属性集合
> + 为什么要抽取数据模型?
> + 对某组数据的操作方法在所有业务逻辑上是通用的
> + Model装饰器: 所有基于vue-dm的创建的数据模型都必须使用Model装饰器
> + ChildModel装饰器:通过该装饰器可便捷的将子模型挂在到父模型
> + DataModel基类:vue-dm的核心实现,提供了data、getTemplateData、getData、onDataUpdate等属性、方法
+ 订单地址模型
``typescript
// addressList.ts
import { DataModel, Model } from 'vue-dm';
@Model
export default class AddressList extends DataModel
public setName(name: string): void {
this.data.forEach((item) => {
item.name = name;
});
}
public static filterAddressList(
data: TypeOrder.AddressList[],
list: string[]
): TypeOrder.AddressList[] {
return data.filter((item) => list.indexOf(item.code) > -1);
}
}
`
+ 订单表单模型
`typescript
// orderFormData.ts
import { reactive } from 'vue';
import { Model, ChildModel, DataModel } from 'vue-dm';
import AddressList from './addressList';
/**
* 订单表单模型
*/
@Model
export default class OrderFormData extends DataModel
/**
* 地址模型
*/
@ChildModel
public addressListModel!: AddressList;
/**
* 初始化表单数据
* @returns 初始化表单数据
*/
protected __init(): TypeOrder.FormData {
return reactive({
code: '',
name: '',
id: 0,
address_list: [
{ name: '测试', code: '1' },
{ name: '测试1', code: '2' },
],
});
}
/* 初始化表单数据 /
public initFormData() {
this.data = this.__init();
}
/**
* 通过详情数据生成表单数据
* @param detailData
* @returns
*/
public setFormDataByDetail(detailData: any) {
Object.assign(this.data, {
code: detailData.code,
name: detailData.name,
id: detailData.id,
});
}
}
`
+ 页面组件
`html
{{ item.name }}
style="margin-left: 10px"
:loading="loading"
@click="handleSave"
>保存 >
import { ref } from 'vue';
import OrderFormData from '@/formData';
import OrderAddressList from '@/addressList';
import createLoading from '@/decorators/createLoading';
/**
* 订单表单数据模型
*/
const orderFormData = new OrderFormData();
/**
* 表单数据
*/
let formData = orderFormData.getTemplateData();
let data = orderFormData.getData((newData) => data = newData);
/**
* 设置数据
*/
const handleSetData = () => {
orderFormData.setFormDataByDetail({
name: '测试订单',
code: '123',
});
};
/**
* 请求方法
*/
const requestApi = (): Promise
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, 5000);
});
};
/* 装饰器的使用 /
const { loading, fun: saveFun } = createLoading(requestApi);
/**
* 静态方法调用
*/
console.log(
OrderAddressList.filterAddressList(formData.value.address_list, ['1'])
);
/**
* 保存数据
*/
const handleSave = () => {
saveFun();
};
/**
* 设置订单地址
*/
const handleAddress = () => {
if (data.code === '123') {
orderFormData.addressListModel.setName('地址');
} else {
console.log('无法删除订单');
}
};
/**
* 初始化订单数据
*/
const handleInitForm = () => orderFormData.initFormData();
``