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

来源: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
  • 示例項目結構 在 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# ...