vue實現複雜表格上移下移功能

2020-12-08 我的華仔部落

由於當前表格較為複雜,其中包含較多合併單元格,所以拖拽不大好處理,於是使用簡單的上移下移按鈕來替代。表格採用的是element-ui的el-table實現的。用於展示的數據是一個數組,經過合併單元格的方法處理,展現效果為上圖所示。而上移、下移是基於整體項目的上移下移。vue中無需操作dom節點僅修改數據就可以達到頁面的處理效果,所以上移、下移只需要修改這個用於展示的數組的數據即可。

大概思路:

如果,直接基於數組中的數據進行處理,邏輯上會較為複雜,所以可以考慮將相同項目的數據作為一個整體,調整順序後,重新轉換為分散的數據。

具體代碼:

/** * 根據項目id轉換二維數組 * @param sourceArray 源數組 項目明細數組 * @param targetItemId 目標項目id */ convertItemArray(sourceArray, targetItemId) { // 目標數組 const targetArray = [] // 項目順序數組 用於保存項目順序 const itemOrder = [] // 項目map 用於數據分類 const itemMap = {} // 傳入源數組有值 if (sourceArray && sourceArray.constructor === Array && sourceArray.length) { // 遍歷原數組 sourceArray.forEach(item => { const itemId = item.itemId // 項目順序數組中不存在該項目時 添加到數組中 if (itemOrder.indexOf(itemId) === -1) { itemOrder.push(itemId) } // 項目id匹配目標項目id if (targetItemId === itemId) { // 獲取目標項目id對應的下標值 this.curItemIndex = itemOrder.length - 1 } // 臨時項目數組 let tempItemArray = [] // 如果項目中存在數組 則為其賦值 if (itemMap[itemId]) { tempItemArray = itemMap[itemId] } // 將項目添加到數組中 tempItemArray.push(item) // 將數組添加到map中 itemMap[itemId] = tempItemArray }) } // 項目順序數組有值 if (itemOrder && itemOrder.length) { // 遍歷項目順序 itemOrder.forEach(itemId => { // 根據項目id取出項目數組 const tempItemArray = itemMap[itemId] // 添加到目標數組中 targetArray.push(tempItemArray) }) } // 返回目標數組 return targetArray }, /** * 將二維數組轉換為一維數組(項目數組轉換為項目明細數組) */ convertItemDetailArray(sourceArray) { // 目標數組 const targetArray = [] // 判斷不為空 if (sourceArray && sourceArray.constructor === Array && sourceArray.length) { for (let i = 0; i < sourceArray.length; i++) { const itemArray = sourceArray[i] // 判斷當前元素是數組 if (itemArray && itemArray.constructor === Array) { // 當前是最後一項時 if (i === sourceArray.length - 1) { // 計算最後一項下標值 this.lastProjectIndex = targetArray.length } for (let j = 0; j < itemArray.length; j++) { const item = itemArray[j] // 重置排序號 item.itemOrder = i // 添加元素到目標數組中 targetArray.push(item) } } } } // 返回目標數組 return targetArray }, /** * 數組元素交換位置 * @param {array} arr 數組 * @param {number} index1 添加項目的位置 * @param {number} index2 刪除項目的位置 * index1和index2分別是兩個數組的索引值,即是兩個要交換元素位置的索引值,如1,5就是數組中下標為1和5的兩個元素交換位置 */ swapArray(arr, index1, index2) { arr[index1] = arr.splice(index2, 1, arr[index1])[0] return arr }, /*** 下移項目* @param {Object} index */ downProject(index) { // 獲取項目id const itemId = this.itemDetailList[index].itemId // 先根據項目id轉換二維數組 並給項目數組下標賦值 const itemArray = this.convertItemArray(this.itemDetailList, itemId) // 下標值大於等於0 if (this.curItemIndex >= 0) { // 下移 交換位置 this.swapArray(itemArray, this.curItemIndex, this.curItemIndex + 1) } // 轉換回一維數組 this.itemDetailList = this.convertItemDetailArray(itemArray) // 項目合併單元格 this.merage() // 評價方法合併單元格 this.mergeIndexArr = this.getMergeArr(this.itemDetailList, 'checkMethod') }, /** * 上移項目 * @param {Object} index */ upProject(index) { // 獲取項目id const itemId = this.itemDetailList[index].itemId // 先根據項目id轉換二維數組 並給項目數組下標賦值 const itemArray = this.convertItemArray(this.itemDetailList, itemId) // 下標值-1 大於等於0 if (this.curItemIndex - 1 >= 0) { // 上移 交換位置 this.swapArray(itemArray, this.curItemIndex - 1, this.curItemIndex) } // 轉換回一維數組 並且重置itemOrder 項目排序號 this.itemDetailList = this.convertItemDetailArray(itemArray) // 項目合併單元格 this.merage() // 評價方法合併單元格 this.mergeIndexArr = this.getMergeArr(this.itemDetailList, 'checkMethod') },

相關焦點

  • Word表格被移到頁邊距區移不回來了,怎麼辦
    有時不小心把表格移到頁邊距區了,想把它移回來卻怎麼也移不動。如果是第一次遇到這種情況,加之事發偶然,一時之間讓人不知所措;如果是在趕時間製作表格時出現這種意外,麻煩可想而知。如果發現及時,還可以用撤消的辦法讓表格回到原處;如果發現不及時,因操作步驟太多而無法撤消,或關閉文檔後下一次打開才發現,也就再也撤消不了了,那麼應該如何把表格移回原處或頁面可編輯區?其實方法十分簡單,具體看下面的例子。
  • 結合 Bootstrap + Vue 組件實現 Laravel 異步分頁功能
    關於如何使用 Laravel 自帶的分頁功能進行分頁,可以參考官方文檔中的分頁章節,說的非常清楚,在這篇教程中我們就不再一一演示了,不過 Laravel 自帶的分頁器實現的分頁連結是動態 URL,不利於 SEO,如果你想要實現偽靜態的分頁連結,可以參考這篇教程:通過自定義分頁器實現偽靜態分頁連結以利於 SEO。
  • 如何在Element框架實現表格並聯動子表格
    ElementJavaScriptCSS3在使用vue+Element結合的框架開發項目時,會經常使用到Element中的表格。如果想要實現父子表格的聯調(根據父表格的某個欄位查詢子表格),該如何實現呢?下面利用實例說明:1、打開HBuilderX工具,創建vue模板項目,然後安裝Element;接著,在項目指定文件夾下,新建vue文件ParentChild.vue
  • 移門鎖有幾種 移門鎖壞了怎麼辦 移門鎖怎麼從外側打開
    而且現在很多家庭裝修中都會使用移門,那麼移門鎖有幾種,移門鎖壞了怎麼辦?下面就為大家介紹一下有關移門鎖怎麼從外側打開等相關知識。一、移門鎖有幾種按照其用途來分,大致可以分為:防盜鎖、臥室鎖、通道鎖和浴室鎖。 從鎖的形狀來看,鎖又可分為:球形鎖、插芯鎖、執手鎖、和呆鎖。其中球形鎖和執手鎖把鎖、拉手和碰球三種功能合為一體,而呆鎖則需要另外安裝門拉手。
  • 什麼是移就,移就修辭格
    移就修辭格在作品中經常出現,能收到以少勝多、含蘊深遠的表達效果。什麼是移就呢?在辭海解釋如下:甲乙兩項關聯,就把原來屬於形容甲事物的修飾語移屬乙事物,叫移就。唐鋮《修辭格》說:「兩個觀念聯繫在一起時,一個的形容詞常常移用於他一個上頭。」移就是一種超乎常格的語言現象,也是詞語搭配的創造性運用。
  • 搭載移遠通信C
    作為該車型的亮點之一,全新上市的紅旗E-HS9搭載了集成高通晶片組的移遠通信C-V2X(蜂窩車聯網)模組,成為首款搭載該款模組的量產車型,也是行業首款在多個LTE-V2X通信場景下實現100%輔助預警驗證的量產車型。
  • 單片機c語言中的左移右移
    4 左移與右移在內存中的關係?5 什麼時候左移相當於乘2?6 有興趣的話可以研究一下單片機彙編中的循環左右移!左移先說左移,左移就是把一個數的所有位都向左移動若干位,在C中用<int i = 1;i = i << 2; //把i裡的值左移2位也就是說,1的2進位是000...0001(這裡1前面0的個數和int的位數有關,32位機器,gcc裡有31個0),左移2位之後變成000...0100,也就是10進位的4,所以說左移1位相當於乘以2,那麼左移n位就是乘以
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    本文將會使用React來開發該組件,也會使用到Javascript中常用的一些設計模式,比如單例模式,但是不管你使用什麼框架來實現,原理都是通用的,如果感興趣的朋友可以用vue也實現以一下。的組件一樣,我們有左上,左下,右上,右下這幾個位置可以配置,也可以配置基於這幾個位置的偏移量。
  • 山東港口日照港「東煤南移」投產運營
    為什麼要「東煤南移」?簡單地說,「東煤南移」工程就是將日照港靠近主城區的石臼港區東區煤炭運輸功能,逐步搬遷到遠離城區的石臼港區南區。通過實施東煤南移工程,可以優化港口港口功能布局,改善港城空間關係,提升城市的品質。日照港東煤南移後,將部分港口空間讓給城市,使港城矛盾得到改善。
  • [前端]分別原生JS和Vue實現計數器功能
    題目用vue實現計數器功能,其中vue實現的代碼由黑馬程式設計師vue教程給出,這裡對其CSS代碼進行了注釋
  • 可能是通知您移車
    放在以前,只能使用西安交警微信「一鍵移車」功能,即日起,車主又多了一項選擇。西安交警攜手陝西電信114號碼百事通,推出智慧出行便民服務,市民撥打114即可實現移車、查詢禁限行、路線問詢三大功能。  出行問題一直是城市綜合發展面臨的痛點,也是關係社會公眾出行的民生話題。隨著城市汽車保有量的增加,城市道路負荷過重,智慧出行方式無疑是解決這些問題的新出路。
  • 物聯網模組龍頭移遠通信
    本周末我們一起梳理一下最近刷策略報告通信板塊見到的兩隻比較高頻的標的移遠通信和廣和通,今天我們先一起梳理一下移遠通信,公司主營業務是從事物聯網領域無線通信模組及其解決方案的設計、生產、研發與銷售服務,可提供包括無線通信模組、物聯網應用解決方案及雲平臺管理在內的一站式服務,公司擁有的多樣性的產品及其豐富的功能可滿足不同市場智能終端的需求。
  • RuoYi-Vue 2.1 發布,支持表單構建
    >漢化錯誤提示頁面 代碼生成已知問題修改 修復多數據源下配置關閉出現異常處理 添加HTML過濾器,用於去除XSS漏洞隱患 修復上傳頭像控制臺出現異常 修改用戶管理分頁不正確的問題 修復驗證碼記錄提示錯誤 修復request.js缺少Message引用 修復表格時間為空出現的異常
  • vue-router 實現分析
    深入如何實現對地址變更的監聽?對於預設的 HashHistory 模式(也就是基於頁面地址的 hash 部分來實現路由功能,如 http://example.com/path#/foo、http://example.com/path#/bar),是通過監聽 hashChange 事件來實現:window.addEventListener('hashchange', () =>
  • 數位化驅動品牌發展,移卡集團助力智慧餐飲
    以「通過科技創新,為商家和消費者持續創造價值,共建美好未來」為使命的移卡集團,及時響應商家需求,幫助廣大餐飲企業以科技賦能品牌,在激烈的市場競爭中尋求突破,實現快速發展。數位化門店管理,提升經營效率單獨開發一個穩定的掃碼點單小程序需要一定經費,對於一些個體小店來說,是一筆不小的支出,往往還是會犧牲用戶體驗,繼續實行傳統的排隊收銀點餐。
  • 探討網際網路賦能餐飲,移卡科技與重慶頭部餐飲企業共聚線下沙龍活動
    面對餐飲行業領域,移卡依託支付服務累積的海量數據,圍繞商戶全生命周期,以及"獲客—點單—支付—留存"的全業務環節,推出多種商戶SaaS產品,打造了數位化的商業服務閉環,為餐飲商家提供智能化的營銷、運營、管理等工具和服務,讓商戶享受到便捷的功能服務的同時,多維度促進經營水平的提升。
  • 「大倉東移」的啟示
    無獨有偶,不久前入選全國50個消費扶貧優秀典型案例的山東援疆「大倉東移 消費扶貧」模式,也是依託省內五座大型倉儲冷庫,助力喀什農產品在內地拓展銷售市場。不同的援疆省市實踐出了相似的消費扶貧模式,原因就在於他們都抓住了新疆的新鮮果品「出疆難」「出疆貴」這一痛點,集中優勢資源解決倉儲物流這一關鍵問題,為破除制約新疆林果業發展的「瓶頸」尋到了突破口。
  • PTA:成本抬升 底部上移
    供應端來看,上周四川能投裝置滿負,華彬裝置鹼洗降負。上周PTA負荷92%,前值92%,負荷處於高位。下周預期BP110萬噸及福海創450萬噸裝置檢修,中泰裝置預期重啟,PTA負荷略下降。需求端,疫苗利好,原油上漲以及資金輪動帶動聚酯產銷脈衝性波動,聚酯負荷保持91.4%的高位,後市負荷預計維持高位。12月來看,PTA處於平衡附近。短期資金認為相對原油,TA估值較低,增倉抄底PTA,PTA底部抬升。
  • Springboot Vue Login(從零開始實現Springboot+Vue登錄)
    小Hub領讀:一個完整的Spirngboot+vue實現登錄的小例子,我之前在vueblog中也搞過,哈哈,再來回顧一下!
  • 大年初一堅守一線 探訪日照港東煤南移工程
    2月16日農曆大年初一,記者在東煤南移工程現場看到,兩臺單管高壓旋噴正在不停的作業,一臺水泥攪拌機旁邊圍著三四位工人,作業正有條不紊的進行中。「現在我們正在進行的施工所在位置為翻車機房區域,為東煤南移工程的重中之重」。日照港東煤南移項目副經理張寧告訴記者,由於地勢近海,當前翻車機房工程地址條件複雜,工程量大。