最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用vue3+ts實現管理后臺(增刪改查)

 更新時間:2020年10月30日 14:17:58   作者:陽呀呀  
這篇文章主要介紹了利用vue3+ts實現管理后臺(增刪改查),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

 簡單的管理后臺基本上就是數據的增刪改查。主要就是 列表 + form 表單。每個頁面的邏輯基本上都相同。不同的地方就是每個頁面需要調用的具體 API 及參數。

以前 vue2 的時候最簡單的做法是寫出來一個頁面的邏輯,然后直接 copy 到各個頁面中,修改 API 及參數即可。高級一點的是利用 mixin 函數,將可復用邏輯抽離,每個頁面引入 mixin。

vue3 之后新增了composition API。本文就是利用composition API,將可復用的邏輯抽離到composition API中,并引入ts,實現一個簡單的管理后臺功能。

利用@vue/cli創(chuàng)建項目

首先需要將 @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<RouteRecordRaw> = [
 {
  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 的結構大體相似。

<template>
  <div class='content_page'>
    <div class='content_body'>
      <div class='content_button'>
        <button class='add primary' @click='addItem' title='添加'>添加</button>
      </div>
      <div class='content_table'>
        <table>
          <thead>
            <tr>
              <th v-for='item in thead' :key='item'>{{item}}</th>
            </tr>
          </thead>
          <tbody>
            <tr v-for='(item, index) in list' :key='item.id'>
              <td>
                <span :title='item.id'>{{item.id}}</span>
              </td>
              <td>
                <div v-if='index === currentIndex'>
                  <input
                    v-model='item.name'
                    title='name'
                  />
                </div>
                <span :title='item.name' v-else>{{item.name}}</span>
              </td>
              <td :title='item.sex'>
               <div v-if='index === currentIndex'>
                  <input
                    v-model='item.sex'
                    title='sex'
                  />
                </div>
                <span :title='item.sex' v-else>{{item.sex ? '男' : '女'}}</span>
              </td>
              <td :title='item.birth'>
               <div v-if='index === currentIndex'>
                  <input
                    v-model='item.birth'
                    title='birth'
                  />
                </div>
                <span :title='item.birth' v-else>{{item.birth}}</span></td>
              <td :title='item.address'>
               <div v-if='index === currentIndex'>
                 <input
                   v-model='item.address'
                   title='birth'
                 />
               </div>
               <span :title='item.address' v-else>{{item.address}}</span>
              </td>
              <td>
                <div v-if='index === currentIndex'>
                  <button
                    class='primary confirm'
                    @click='confirm(item)'
                  >確定</button>
                  <button
                    @click='cancel(item)'
                  >取消</button>
                </div>
                <span v-else>
                  <span @click='editItem(index)'>
                    edit
                  </span>
                  <span @click='deleteItem(index, item)'>delete</span>
                </span>
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
  </div>
</template>

其中用到了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<number | null>(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方法中引入即可。

<script lang='ts'>
import axios from 'axios';
import { defineComponent, reactive } from 'vue';
import { compositionApi } from '../components/composables/index';
import {ItemType} from '../types/index';

const ListComponent = defineComponent({
 name: 'List',
 setup() {
  const state = reactive({
   itemData: {
    id: '',
    name: '',
    sex: 0,
    birth: '',
    address: '',
   },
  });
  const fetchApi = () => {
   return axios.get('/users');
  };
  const deleteApi = (item: ItemType) => {
   return axios.post('/users/delete', { id: item.id });
  };
  const confirmAddApi = (item: ItemType) => {
   return axios.post('/users/add', { 
    name: item.name,
    birth: item.birth,
    address: item.address,
   });
  };
  const confirmEditApi = (item: ItemType) => {
   return axios.post('/users/edit', {
    id: item.id,
    name: item.name,
    birth: item.birth,
    address: item.address,
   });
  };
  const localPageData = compositionApi(fetchApi, deleteApi, confirmAddApi, confirmEditApi, state.itemData);
  return {
   state,
   ...localPageData,
  };
 },
 data() {
  return {
   thead: [
    'id',
    'name',
    'sex',
    'birth',
    'address',
    'option',
   ],
  };
 }
});

這樣 List 頁面的邏輯基本上就完成了。同樣,About 頁面的邏輯也就完成了,不同的就是在 About 頁面更改一下接口請求的地址。

最終實現效果

composition API vs Mixin

在vue3之前,代碼復用的話一般都是用mixin,但是mixin相比于composition API的劣勢,在官網中的解釋如下:

  • mixin很容易發(fā)生沖突:因為每個特性的屬性都被合并到同一個組件中,所以為了避免 property名沖突和調試,你仍然需要了解其他每個特性。
  • 可重用性是有限的:我們不能向mixin傳遞任何參數來改變它的邏輯,這降低了它們在抽象邏輯方面的靈活性

源代碼

項目中用到的一些 TS 接口的定義、模擬數據及接口請求本文中沒有具體介紹,如果想了解的話可以去看看源碼。

戳這里:vue3_ts_admin

到此這篇關于利用vue3+ts實現管理后臺(增刪改查)的文章就介紹到這了,更多相關vue3 TypeScript 管理后臺內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決vuex刷新狀態(tài)初始化的方法實現

    解決vuex刷新狀態(tài)初始化的方法實現

    這篇文章主要介紹了解決vuex刷新狀態(tài)初始化的方法實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 淺談vue2的$refs在vue3組合式API中的替代方法

    淺談vue2的$refs在vue3組合式API中的替代方法

    這篇文章主要介紹了淺談vue2的$refs在vue3組合式API中的替代方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 如何使用Vue做個簡單的比較兩個數字大小頁面

    如何使用Vue做個簡單的比較兩個數字大小頁面

    這篇文章主要給大家介紹了關于如何使用Vue做個簡單的比較兩個數字大小頁面的相關資料,實現一個比較兩個數字大小的頁面,練習Vue實例的創(chuàng)建、數據綁定和事件監(jiān)聽方法,需要的朋友可以參考下
    2023-10-10
  • vue3中使用viewerjs實現圖片預覽效果的項目實踐

    vue3中使用viewerjs實現圖片預覽效果的項目實踐

    viewer.js是一款開源的圖片預覽插件,功能十分強大,本文主要介紹了vue3中使用viewerjs實現圖片預覽效果的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Vue 和 React 使用ref的示例詳解

    Vue 和 React 使用ref的示例詳解

    在 Vue 中,ref 是一個響應式對象,修改 ref 的值會觸發(fā)組件的重新渲染,因為 Vue 的 ref 是基于其響應式系統(tǒng)實現的,任何對 ref 的修改都會被 Vue 檢測到,并觸發(fā)組件的更新,本文給大家介紹Vue 和 React 使用ref的示例,感興趣的朋友一起看看吧
    2025-04-04
  • 超級詳細的Vue安裝與配置教程

    超級詳細的Vue安裝與配置教程

    Vue web前端三大主流框架之一,是一套用于構建用戶界面的漸進式框架,下面這篇文章主要給大家介紹了關于Vue安裝與配置教程的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 如何解決sass-loader和node-sass版本沖突的問題

    如何解決sass-loader和node-sass版本沖突的問題

    這篇文章主要介紹了如何解決sass-loader和node-sass版本沖突的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vuecli4中如何配置打包使用相對路徑

    vuecli4中如何配置打包使用相對路徑

    這篇文章主要介紹了vuecli4中如何配置打包使用相對路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • vuex刷新后數據丟失的解決方法

    vuex刷新后數據丟失的解決方法

    這篇文章主要給大家介紹了關于vuex刷新后數據丟失的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Vue 實用分頁paging實例代碼

    Vue 實用分頁paging實例代碼

    本篇文章主要介紹了Vue 實用分頁paging實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

肃宁县| 天水市| 蒙城县| 类乌齐县| 左权县| 杂多县| 新密市| 河北区| 塔城市| 惠水县| 满洲里市| 政和县| 崇信县| 将乐县| 共和县| 神农架林区| 罗源县| 洛隆县| 磐安县| 当涂县| 白玉县| 吐鲁番市| 邓州市| 乡城县| 嵊州市| 芜湖市| 旺苍县| 百色市| 甘洛县| 清涧县| 高阳县| 奉贤区| 金湖县| 乐亭县| 叶城县| 澎湖县| 从江县| 大余县| 怀安县| 息烽县| 东台市|