利用@vue/cli创建项目
首先需要将 @vue/cli 升级到最新版。本文用的是4.5.6版本。
vue create admin cd admin npm run serve
create选择手动选择Manually select features,会有一些交互性的选择,是否要安装router、vuex等选项,空格可以切换是否选中。我们选中TypeScript、Router、Vuex、CSS Pre-processors。
我们利用axios + axios-mock-adapter + mockjs来进行接口请求、接口模拟及假数据生成,接下来再安装这几个包。
npm install axios npm install -D axios-mock-adapter mockjs
项目整体框架
假设我们的项目包含一个 Header,Header 的作用是切换页面。两个页面,分别为 List 和 About,这两个页面都是简单的列表+增删改查的操作。
路由
需要在 router 中增加一个 list 的路由信息。
const routes: Array= [ { path: '/', name: 'Home', component: Home, }, { path: '/about', name: 'About', component: () => { return import(/* webpackChunkName: "about" */ '../views/About.vue'); }, }, { path: '/list', name: 'List', component: () => { return import(/* webpackChunkName: "list" */ '../views/List.vue'); }, }, ];
列表页
首先把列表页的结构写出来,List 和 About 的结构大体相似。
{{item}} {{item.id}} {{item.name}} {{item.sex ? '男' : '女'}} {{item.birth}} {{item.address}} edit delete
其中用到了addItem、editItem、deleteItem、confirm、cancel这几个方法,每个列表页的这几个方法功能都是相同的,唯一的不同就是请求的 API,我们可以将这几个 API 做为参数,将增删改查的方法提取到setup函数中,做到复用。接下来就来到重点的composition API。
composition API具体实现
import { ref, onMounted } from 'vue';
import {ItemType, FetchType, DeleteType, AddType, EditType} from '../../types/index';
export const compositionApi = (
fetchApi: FetchType,
deleteApi: DeleteType,
confirmAddApi: AddType,
confirmEditApi: EditType,
itemData: ItemType,
) => {
const currentIndex = ref(null);
const list = ref([{}]);
const getList = () => {
fetchApi().then((res: any) => {
list.value = res.data.list;
});
};
const addItem = () => {
list.value.unshift(itemData);
currentIndex.value = 0;
};
const editItem = (index: number) => {
currentIndex.value = index;
};
const deleteItem = (index: number, item: ItemType) => {
deleteApi(item).then(() => {
list.value.splice(index, 1);
// getList();
});
};
const cancel = (item: ItemType) => {
currentIndex.value = null;
if (!item.id) {
list.value.splice(0, 1);
}
};
const confirm = (item: ItemType) => {
const api = item.id ? confirmEditApi : confirmAddApi;
api(item).then(() => {
getList();
cancel(item);
});
};
onMounted(() => {
getList();
});
return {
list,
currentIndex,
getList,
addItem,
editItem,
deleteItem,
cancel,
confirm,
};
};
export default compositionApi; 接下来就是在 List 和 About 页面中的setup方法中引入即可。