記錄--Vue2屎山之 Table 屎山

来源:https://www.cnblogs.com/smileZAZ/archive/2023/11/14/17832333.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 Vue2 將在 2023 年年底停止維護了,但是 Vue2 的代碼卻不會在 2023 年消失,還會越來越多;難以想象幾十萬行或者幾百萬行的 Vue2 代碼遷移到 Vue3,這是不可能辦到的; 老一點的前端程式員肯定經歷過把大型項目從 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

前言

Vue2 將在 2023 年年底停止維護了,但是 Vue2 的代碼卻不會在 2023 年消失,還會越來越多;難以想象幾十萬行或者幾百萬行的 Vue2 代碼遷移到 Vue3,這是不可能辦到的;

老一點的前端程式員肯定經歷過把大型項目從 jQuery 遷移到 Vue/React/Angular 的經歷,那是一次思想的大變革,也是生產效率的一次大革新,但是這一次就不一樣了,Vue2 遷移到 Vue3 雖然優點很多,但是這不足以說服老闆們花費$去讓你進行重構;

既然 Vue2 還能用,那我就想把他用到極致,日常中最常用的就是 Table 組件,所以 Table 組件出現屎山的概率大大增加了,再加上 UI 框架的加持,這個屎山就被放大了!Vue2 寫後臺也就是這幾個 UI 框架:Antd-vueElementiView,兩款是個人開發者出品,一款是餓了麽出品,來看看他們的 Table 組件

iView

iView Table 屎山

為什麼先說 iView,因為 iView 早期版本裡面的 Table 組件有一個很奇葩的設定那就是使用 render 函數來渲染 columns,而我們剛好用的 iView 版本就是這個時期的,後面也難以再升級,這個時候就產生大量屎山代碼了:

比方說Table 每一行後面有四個操作按鈕,那麼就需要這樣寫:
render:(h,{row})=>{
    return h('div',[
        h('a',{
            props:{
            
            },
            styles:{
            
            },
            on:{
                click:()=>{
                    
                }
            }
        },'新增'),
        h('a',{
            class:'xxx'
        },'修改'),
        h('a',{
            class:'xxx',
            on:{
                click:()=>{
                    Modal.confirm({
                        ...
                    })
                }
            }
        },'刪除'),
        h('a',{
            class:'xxx'
        },'配置'),
    ])
}

有沒有感覺到特別醜陋,而且寫起來效率也十分低下,好像回到了原始社會;原始社會裡面大家鑽木取火,現在一個打火機就能夠搞定,而這個 Table 裡面的 Column 的設定就像是鑽木取火了,一個 Colmun 還好,如果所有 Column 都這樣寫,並且都定義在 data 裡面,想象一下一個 data 都定義了幾百行,這是不是最大的屎山呢?

這個屎山有辦法破解嗎?答案是有的,總共有兩個方向,一個方向是編譯優化,一個方向是利用 scopedSlots

編譯優化

回憶一下 React,每一個 jsx 代碼其實都等同於 createElement("div",{},"xxxx"),與上面的代碼類似,那麼在 Vue 裡面也可以寫 jsx,然後編譯為 h 函數,按照這種思路上面的代碼就可以優化為:

render:(h,{row})=>{
    return <div>
        <a>新增</a>
        <a>修改</a>
        <a onClick={()=> this.onDelete(row)}>刪除</a>
        <a>配置</a>
    </div>
}

這樣的話看起來就舒服很多了,但是有人會說了:在 Vue 裡邊寫 jsx,又有 template 又有 jsx 搞得是四不像,不倫不類了,這種方式我不喜歡,還是想利用 Vue 的特性,要麼我就還是情願回到原始社會去鑽木取火;那麼下麵一種方式就是 scopedSlots

scopedSlots 優化

先說怎麼用:在 columns 數組中增加一個參數 slot,然後定義作用域插槽:

<template>
    <Table :columns="columns">
        <template #actions="{row,index}">
            <a>新增</a>
            <a>修改</a>
            <a @click="onDelete(row)"}>刪除</a>
            <a>配置</a>
        </template>
    </Table>
<template>
<script>
export default{
    data(){
        return {
            columns:[{
                title:'操作',
                slot:'actions',
                key:'actions'
            ]}
    }
}
</script>
再來看看Table 是如何支持這個功能的呢,大概思路就是在遍歷 columns 時會判斷一下 slot 是否存在,如果存在則展示作用於插槽,如果不存在則走原來的邏輯,下麵貼了一些偽代碼:
<td>
  <!-- 如果遍歷 colums 之後 slot 屬性存在,那麼渲染 slot,否則按照預設規則渲染 -->
  <slot v-if="slotName" :name="slotName" v-bind="{row,index}"/>
  <span v-else>...</span>
</td>

學會了這兩種優化方式,領導再也不用擔心我堆屎山了!

Element

再看看 Element 中的Table,舒服多了有沒有:

不用把 Column 的配置與 內容割裂開,可以都放在 template 中書寫,這樣比上面的方式靈活多了,而且還極大減少了屎山代碼的形成,對比下來還是 Element 的 Table 組件更為成熟好用;

antd-vue

最後一個是 antd-vue,看一下 antd-vue 中 Table 的用法,這不就和上面講到的 scopedSlots 優化那種用法類似嗎?

 翻到後面,可以看到一個 template 風格 API,與 Element 這種用法類似,但是後面緊接著提示:不推薦使用,會有一定的性能損耗。,為什麼會有性能損耗呢?那麼 Element 這麼用會有性能損耗嗎?

後記

到這裡 Vue2 中的 Table 屎山就結束了,再回頭看看 iView 直接暴露 h 函數,雖然極大地增加了 Column 定義的靈活度,但是增加了很多無效代碼就好像回到原始社會一樣,也增加了不少的屎山代碼;在日常開發過程中,很多需求都是趕著工期完成的或者倒排工期完成,根本沒有時間去思考怎麼優化,這個時候 UI 框架對於效率的影響就被放大了;好的 UI 框架不僅能夠提供好的交互效果,還能從 API 層面去約束開發者,讓開發者儘可能寫出好的代碼,另外就是讓開發者儘可能少寫代碼;

本文轉載於:

https://juejin.cn/post/7300151966964678668

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 插入到集合中: 要將記錄(在MongoDB中稱為文檔)插入到集合中,使用insert_one()方法。insert_one()方法的第一個參數是一個包含文檔中每個欄位的名稱和值的字典。 import pymongo myclient = pymongo.MongoClient("mongodb:// ...
  • 事務的底層原理 在事務的實現機制上,MySQL 採用的是 WAL:Write-ahead logging,預寫式日誌,機制來實現的。 在使用 WAL 的系統中,所有的修改都先被寫入到日誌中,然後再被應用到系統中。通常包含 redo 和 undo 兩部分信息。 為什麼需要使用 WAL,然後包含 red ...
  • 項目應用中需要用mysql執行一下命令行.幾經搜索可以安裝lib_mysqludf_sys插件可以實現 本地window環境安裝(mysql8.0 , 64位 , 使用lib_mysqludf_sys.dll文件) -- 查看環境中插件目錄 show variables like '%plugin% ...
  • NineData DSQL 是針對多個同異構資料庫系統進行跨庫查詢的功能,當前支持對錶和視圖進行 SELECT 操作。您可以在一個查詢中訪問多個資料庫,獲取分散在各個資料庫中的有用信息,並且將這些信息聚合為一份查詢結果返回,輕鬆實現跨多個庫、多個數據源,乃至跨多個異構數據源的數據查詢。 ...
  • 火山引擎DataTester上線的「集成工作台」功能,能夠將DataTester的能力與企業自身的系統進行打通,減少系統之間的多次跳轉。幫助企業打造專屬AB平臺,滿足企業的個性化訴求,大幅降低企業服務的應用成本並提升用戶使用體驗。該功能可以通過完善的引導,進行一站式的定製、發佈、嵌出,幫助企業打造專... ...
  • 原文地址: Android app的暗黑模式適配實現 - Stars-One的雜貨小窩 很久之前放在草稿箱的一篇簡單筆記,是之前藍奏雲批量下載工具Android版本實現暗黑主題的適配記錄 本文所說的這裡的暗黑主題,應該只支持Android10系統,不過我手頭的Flyme系統(Android9)上測試 ...
  • 在日常的 JavaScript 編碼中,我們經常使用解構語法來提取對象中的屬性。假設我們有一個名為 fetchResult 的對象,代表從介面返回的數據,其中包含一個欄位名為 data。 const fetchResult = { data: null }; 在提取 data 欄位時,為了避免介面未 ...
  • vue 最有代表性質的就是.VUE 的文件,每一個vue文件都是一個組件,那麼vue 組件的編譯過程是什麼樣的呢 Vue 單文件組件 (SFC)和指令 ast 語法樹 一個 Vue 單文件組件 (SFC),通常使用 *.vue 作為文件擴展名,它是一種使用了類似 HTML 語法的自定義文件格式,用於 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...