前端開發樹形插件帶來的煩惱(一)

来源:https://www.cnblogs.com/liuyuhangCastle/archive/2018/08/29/9553439.html
-Advertisement-
Play Games

liuyuhang原創,未經允許請勿轉載! 前端開發樹形插件帶來的煩惱(一) 前端開發中,有些項目中會用到樹形插件,其數據結構也比較簡單,大體如下: 數據結構說明: 每一行代表一個數據,該數據由基本信息,id,pid三個部分構成。pid為連接的父節點,額外增加的內容也包括兩個部分; ①縮進;②節點展 ...


liuyuhang原創,未經允許請勿轉載!

前端開發樹形插件帶來的煩惱(一)

前端開發中,有些項目中會用到樹形插件,其數據結構也比較簡單,大體如下:

 1 TreeRoot
 2 
 3   |-- tree01  id = 01  pid = 0
 4     |-- leaf01  id = 04  pid = 01
 5     |-- leaf02  id = 05  pid = 01
 6     |-- leaf03  id = 06  pid = 01
 7     ......
 8   |-- tree02  id = 02  pid = 0
 9     |-- leaf04  id = 07  pid = 02
10     ......
11   |-- tree03  id = 03  pid = 0
12     |-- leaf05  id = 08  pid = 03
13     ......
14   ......

數據結構說明:

  每一行代表一個數據,該數據由基本信息,id,pid三個部分構成。pid為連接的父節點,額外增加的內容也包括兩個部分;

  ①縮進;②節點展開提示,如+ - 符號,> < 符號等,方式眾多,不是重點,不繼續說了。

樹形結構展示說明:

  樹形結構的展示方式主要還是通過遍歷和遞歸,渲染方式可以一次性將數組組裝好整體展示,或者一層層展示,也可以考慮一共展示幾層(遞歸次數)

 

煩惱不在於此,煩惱是來自於業務的。我舉例兩個樹形結構,暫命名為樹形結構A和樹形結構B,描述如下: 1 樹形結構A 2

 3 科:大貓科          id = 1  pid = 0   
 5   屬:虎          id = 2  pid = 1
 7     種:01華南虎     id = 3  pid = 2
 8       02孟加拉虎    id = 4  pid = 2
 9       03東北虎     id = 5  pid = 2
10 
11  - - - - -- - - - - - - - - - - -
12 樹形結構B
13 14 鍵盤:鍵盤實例        id = 1  pid = 0 16   按鍵:Q鍵        id = 2  pid = 1 18     :W鍵        id = 3  pid = 1   19     :E鍵        id = 4  pid = 1

在以上兩個例子中,假設我需要在每個節點(包括根節點)上做個覆選框,然後拿到所選擇的 id,之後根據已選擇的id進行操作。

這裡對於節點是否已選,我見到的操作方式是不同的。如:

01、選擇根節點,子節點跟隨顯示選擇;

02、選擇根節點,子節點不跟隨顯示選擇;

03、選擇所有子節點,根節點跟隨顯示選擇;

04、選擇部分子節點,根節點跟隨顯示選擇;

05、選擇部分子節點,根節點跟隨顯示半選擇;

05、選擇部分子節點,根節點跟隨顯示不選擇;

  首先以01、03、04這種策略對上述兩種AB樹結構進行分析

    對A進行假設,已選擇 01華南虎,此時 屬:虎 對應跟隨顯示選擇,

    因為  下只有這麼一個 ,所以 科:大貓 必定跟隨顯示選擇;

    至此,對樹形結構A選擇的 id列表為 [ 1,2 ,3 ];

      此時我可以說:“華南虎是虎,華南虎是大貓”,這兩種描述都並沒有任何錯誤。

      ——即符合事實,也符合選擇覆選策略出現的id列表

    對B進行假設,已選擇 Q鍵 ,此時鍵盤實例跟隨顯示選擇;

    至此,對樹形結構B選擇的 id列表為[ 1, 2 ];

      此時我說:“我按Q鍵,鍵盤燈點亮的是Q鍵”,就是錯的,因為我按Q鍵,選擇的是Q;

      但是實際選擇的是Q和整個鍵盤,所以點亮的鍵盤燈也是整個鍵盤的,

      這個看似很簡單的問題源於樹形結構中的選擇附帶的 id 跟隨選擇策略的不同;

  同理,假設我以01、03、05這種策略對以上兩種AB樹結構進行分析,一樣會得出矛盾的結論,還是上例:

    對A結構描述:可以說:“華南虎是虎,但是虎不是華南虎,範圍不同”,這句話是正確的,也符合邏輯

    對B結構描述:可以說:“我按Q鍵,並沒有按全部的鍵盤按鍵,鍵盤燈點亮的只有Q鍵”

      以上兩種說法都符合邏輯,也很正確,但是id如何選,假設去掉父 id,則一條符合半選描述,

      一條符合不選描述的內容,半選到底是選,還是不選?

      拿出來的數據結構是否有必要重新列一張列表出來,很是矛盾,即使是使用01、03、06,依然也會產生困惑。

    這兩個例子還算好,還有更噁心的例子:

      假設父節點是空的內容,比如某頁PPT,有文字A,文字B,圖形C,圖形D,其中AB編組為X,CD編組為Y,XY編組為Z;

      這個樹形結構的父節點是架空的,內容完全由最基層的子節點來構成的情況下,

      我選擇A的時候,必定跟隨選擇AB形成的組X,必定跟隨選擇X所屬的編組XY構成的Z;

      試問,此時我要對A沿虛線剪下,剪下的是誰,如果不拆分組,剪掉的是Z,

      實際上是ABCD,如果拆分組,那破壞了本身的樹形結構;

      若此時我選擇Z,然後對Z沿虛線剪下,剪下的應該是整個組,但是這個組之間可能會有間距,有重疊,

      並沒有分開樹形結構,實際上選擇的是Z,但是獲取的id並非是ABCD的id,也不是XY的id,只獲取了Z的id;

      這種選擇了父節點而子節點並未實際跟隨選擇的情況如何計算呢?

    所以,樹形結構的覆選策略,實際上是複雜的,在給用戶的設計中,是必定要有跟隨選擇的;

    至少帶有全選,反選,子節點全選父節點跟隨全選,子節點未全選父節點要麼半選,要麼不選這種跟隨性操作;

 

    十幾種一種策略不夠用,上述描述的策略也只是適用於某種情況而已;

    如果樹形結構編組的是3D模型組?2D圖層組?真實分類的子分類?策略不能一蹴而就的;

 

    既然已經使用了樹結構,而且又要必須使用多選,那麼樹形結構就必須分開策略,分別創建,復用性就大大降低;

    而已經做好的很多樹形結構的插件大神們,有考慮以上這些問題,提供出不同覆選策略的方案麽?

 

後續會慢慢更新這個問題,有一些尚未全部完成的解決思路,有空就更一下!

以上!✧(∗≧ꇴ≦)人(≧ꈊ≦∗)✧

 


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

-Advertisement-
Play Games
更多相關文章
  • 在上一篇《前端面試 - 演算法篇(二分法)》的評論中,有朋友提出了一個“迴圈殺人游戲” 就在我為之苦惱的時候,一位同事在我身旁經過,突然說了一句:“咦,這不是約塞夫問題嗎?” 一、面試題 原題目不太明朗(一號到底殺不殺?) 於是把題目優化一下,更接近於原本的約塞夫問題 假設有100人,分別編號 1~1 ...
  • left right aaa ... ...
  • JS介紹 數據輸出\輸入 JS變數 JS數據類型 進位介紹 數字(Number) 字元串(String) Boolean類型/Undefined類型/Null類型 類型轉換 運算符 流程式控制制 break與continue關鍵字 數組(Array) 函數(function) 函數中的幾個參數 sort ...
  • 獲取ECharts npm install echarts save <! more 自定義構建ECharts 我選用的是常用版的echarts/dist/echarts.common.js 在我的項目根目錄下myProject新建echarts.common.js,然後將echarts.commo ...
  • 練習jquery上的一個插件編寫 1.標準的3個基本內容,根目錄裡面創建2個文件夾(存放css和js)和1個html頁面文件; 2.測試的主html頁面代碼 3.css文件中設置2個css格式文件 3.1第一個main.css 3.2 menu.css 4.存放js的文件中有2個文件,1個是jque ...
  • Learun.framework v7━ net快速開發框架 LeaRun.Framework v7 ,基於.NET的快速信息化系統開發、整合框架,為企業或LeaRun.Framework v7,基於.NET的快速信息化系統開發、整合框架,為企業或個人在.NET環境下快速開發系統提供了強大的支持,開 ...
  • 基於Spring Boot 2.0.4、Spring Cloud Finchley.SR1的Spring Cloud使用樣例 ...
  • 一點一點看JDK源碼(〇) 原創文章,版權所有,未經允許進位轉載 寫在前面: 幾乎所有的大神都會強調看源碼,也強調源碼的重要性; 但是如何看源碼,源碼看什麼?看了什麼用?看了怎麼用? 困擾很多人,尤其是初學者。 本文簡單的回答以下幾個問題: 1.為什麼要看源碼? 2.什麼時候或什麼條件下看源碼? 3 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...