記錄--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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...