1. 前端框架有什麼用
web前端框架是做什麼的? 5分
前端框架一般指用於簡化網頁設計的框架,比如,jquery,extjs,bootstrap等等,這些框架封裝了一些功能,比如html文檔操作,漂亮的各種控制項(按鈕,表單等等)。
使用前段框架可以降低界面開發周期和提高界面的美觀性。
有些框架比較輕量,比如jquery,有些框架比較重量,比如extjs。一般來說重量的框架會封裝更多的功能,比如extjs,封裝的grid控制項有很強的數據展示和操作功能。
前端框架是什麼?有什麼用、有什麼好處?
可以簡單的理解成是:使用廣泛的前端開發套件,可以幫助你快速的網站。
前段框架的好處:對於互聯網的產品而言,前端用戶體驗往往決定了一款產品的競爭力和吸引力;而對於前端工程師來說,考慮的問題更為復雜,他們既要為網站上提供的產品和服務實現一流的Web頁面、優化代碼,保證體驗的最佳,更要考慮與市面上各大瀏覽器的兼容性,還需顧及Web前端表現層和前後端交互的架構,以及模塊化、通用類庫、框架編寫等一系列問題,由此提升前端開發的效率,降低開發成本和周期。
html的框架到底是用來幹嘛的?什麼時候用到?
你接觸了後台就知道了,這樣可以做到頁面地址不需要變動, 但卻可以利用iframe的tagert屬性把顯示數據的頁麵包含進來, div就不行,因為它沒有這個target屬性,文件獨立出來方便重用,且結構清晰;
前端開發框架有哪些
首先我想說明一下,我們通常說的js不是框架,是語言,即javascript,據最新世界編程語言排行榜來看,已經上升到了第7位,發展迅猛,其標準是ECMAScript,現在基本上是基於ECMAScript5。jQuery是用js寫的框架,其在DOM操作上有很明顯的優勢,也是時下很常用的一個js框架。
至於之外還要學習那些框架呢?
如果你說的是js框架,建議先掌握好jQuery,然後還有很多的,比如樓上提到的extjs,近幾年比較流行的AngularJS,基於移動端考慮的輕量級仿jquery框架zepto,還有jquery mobile,還有適合寫後端或服務端的node,等等。如果是web前端框架,就不僅僅是涉及的js了,還有html和css。個人覺得只有這三種語言都涉及到的框架才能說得上是web前端框架。現在比較火的是Bootstrap,還有Foundation,比較古老的有jqueryUI,easyUI等等,還有其他很多很多。如果還有算上處理方案及版本升級代碼迭代等,就要用到網路團隊研發的fis這種了。其實內容真的很多很多,前端任重而道遠啊~
web前端框架是什麼意思 10分
前端架構師必須懂得真正的編程知識,而這正是很多自封為前端架構師的人所缺乏的。我的意思不是能夠剪切粘貼改進代碼就行了,而是能夠跟老練的工程師商討如何能夠最好地結合前端。
這就是說,前端架構師需要真正理解結構遭遇商業邏輯的問題。如果工程師說某些東西使用ASP.Net DataGrid是不可能實現的,前端架構師必須能夠解釋如何與為何要使用DataList或Repeater取代,解釋為何DataGrid在該情景下是個錯誤的選擇……
這只是個例子,問題還在於僅知道客戶端編程也是不夠的。能夠使用與工程師相同的術語,能夠討論(前後端)關鍵集成的最佳解決方案,這是絕對必須的。
斷線的風箏
我們今天正處在一個不妙的處境中,原因在於幾乎沒有人能夠為前後端的溝壑搭橋。一般工程師不會有興趣或實踐標記,CSS, 或DOM腳本編程,大部分客戶端開發者也沒有與後端技術協作的經驗。幾周入門PHP不會成為程序員,幾周入門XHTML也不會成為真正的客戶端開發者。
罪魁禍首
我首先想到的十足例子是,ASP.Net完全漠視Web標准,同樣地,web氛圍(我們指表格和佔位gif)讓Web標准郁悶。企業項目的大多數框架輸出的標記,即使使用1999年的標准來衡量,都是糟糕無比的。
如此巨大和「專業」的產品怎麼能才夠不忽視,按理說是整個項目最簡單的方面?只有靜態代碼。理由是,基於技術的立場衡量產品,結構,CSS和其他客戶端技術都是「事後諸葛亮」。表現邏輯,結構和行為混雜,壓根無助於無障礙,Web標准,或者前端技術干凈的分離。擡起你的頭來,就在2006,這些都成受歡迎的慣例了。
總結
如果這個世界上姿態最鮮明的產品和項目都如此低劣的方式來處理事情,其他的還有什麼好說?毫無疑問,我們需要前端架構師,而且就在昨天。
歸結於歸結,我們有一堆相互關聯的技術,很少人能夠埋頭鑽研它們之間的關系,這很不幸。正確做事的真正價值在於容易的維護和長期的適應性。雖然在關鍵時刻,有些方式更容易選擇其他的方法和拼湊起另外的東西。對某些人來說,這可能是可接受的做事方式。但是,對我們大部分人來說,這是拙劣的抉擇,也非常不專業。
我交給你去想了。我假設你把車交給技工修理,修好了時候,瞧瞧引擎罩內大量的輸送管,我不知道你對技工作何感想?
為什麼需要自己實現前端框架
前端對框架(庫)的大小更敏感
前端內容的渲染和交互效果的實現如果依賴JS框架(庫),需要先將這些框架(庫)下載到客戶端,此時框架(庫)的大小將直接影響到前端的首屏渲染速度。框架(庫)越小,載入的速度就越快,而隨著功能的越來越全,框架(庫)必然會越來越大,要保證性能,需要制定載入策略。
便於制定載入策略
解決框架(庫)變大的常見載入策略是將框架分為核心部分和擴展部分,核心部分在首屏渲染前必須下載完成,並且這部分的載入文件盡可能的少和小,擴展部分則可以模塊化方式來懶載入。
核心部分的JS在發布時,可對文件合並,數量盡可能少,單個文件在gzip壓縮後最好不要超過20K。核心部分可以是實現「JS語言擴展(面向對象),DOM操作API,數據交互方法(ajax),導航策略,模塊化底層實現,事件底層實現,模版解析」等。擴展部分一般是一些可非同步載入的UI組件,例如:輸入控制項、彈出窗、動畫API、文件上傳及預覽、圖表控制項、富文本編輯器等。
上面的實現模式,在主流的JS框架(庫)中,有三類選擇:一類是以ExtJS為代表的大而全的框架(庫),這類框架雖然功能滿足,但往往無法拆分為核心部分和擴展部分來載入,因此基本不予考慮;一類是相對輕量的YUI3、Dojo等框架(庫);一類是近來流行的前端MV*系列Backbone、Ember、Angular,這類在充當核心部分時,還需要組合Underscore、RequireJS,jQuery等第三方庫。
後面兩類可以滿足要求,但個人覺得不是完美的方案,因為在開發實際產品時,將這兩類作為核心部分時,往往裡面有很多是不需要的,而還有些需要自己來額外補充近來,可以是自己開發,也可以集成第三方的實現。而核心部分框架(庫)如果是自己實現,則可以保證在功能完整的情況下,不多出其它的東西,載入的JS可以控制到最小,而且代碼風格也統一。
便於擴展
前端代碼與用戶的交互直接相關,而交互的設計變化和不確定性非常大,現成的第三方實現往往難以直接利用,需要改造。有時改造第三方的框架,先要非常熟悉框架,當這個框架比較復雜時,這樣的工作量和難度就大大加大了。而自實現的框架(庫)則可以根據需要任意擴展,可以根據需求制定對應的規范和API。
前端開發框架有哪些
1. Bootstrap
Boostrap絕對是目前最流行用得最廣泛的一款框架。它是一套優美,直觀並且給力的web設計工具包,可以用來開發跨瀏覽器兼容並且美觀大氣的頁面。它提供了很多流行的樣式簡潔的UI組件,柵格系統以及一些常用的JavaScript插件。
Bootstrap是用動態語言LESS寫的,主要包括四部分的內容:
腳手架——全局樣式,響應式的12列柵格布局系統。記住Bootstrap在默認情況下並不包括響應式布局的功能。因此,如果你的設計需要實現響應式布局,那麼你需要手動開啟這項功能。
基礎CSS——包括基礎的HTML頁面要素,比如表格(table),表單(form),按鈕(button),以及圖片(image),基礎CSS為這些要素提供了優雅,一致的多種樣式。
組件——收集了大量可以重用的組件,如下拉菜單(dropdowns),按鈕組(button groups),導航面板(navigation control)——包括:tabs,pills,lists標簽,麵包屑導航(breadcrumbs)以及頁碼(pagination),縮略圖(thumbnails),進度條(progress bars),媒體對象(media objects)等等。
JavaScript——包括一系列jQuery的插件,這些插件可以實現組件的動態頁面效果。插件主要包括模態窗口(modals),提示效果(tool tips),「泡芙」效果(popovers),滾動監控(scrollspy),旋轉木馬(carousel),輸入提示(typeahead),等等。
Bootstrap已經足夠強大,能夠實現各種形式的 Web 界面。為了更加方便地利用Bootstrap進行開發,很多工具和資源可以用來配合使用,下面列舉了其中的一部分工具和資源。
jQuery UI Bootstrap —— 對於jQuery和Bootstrap愛好者來說這是個非常好的資源,能夠把 Bootstrap的清爽界面組件引入到jQuery UI中。
jQuery Mobile Bootstrap Theme —— 和上面提到的jQuery UI主題類似,這是一個為jQuery Mobile建立的主題。如果你想讓用Bootstrap開發的網站在手機端也可以優雅訪問,那麼這個資源對你來說很方便易用。
Fuel UX —— 它為Bootstrap添加了一些輕量的JavaScript控制項。Fuel UI 安裝,修改,更新以及優化都很簡單方便。
StyleBootstrap. —— Bootstrap提供了自己的幾種界面風格,StyleBootstrap提供了更多的配色選項,並且你可以給每個組件都應用不同的配色。
BootSwatchr —— 利用這個工具你可以立刻查看主題修改後的效果。對於每一次變動的效果,這個應用都會生成一個唯一的URL方便你與他人分享,你也可以在任意時刻修改你的主題。
Bootswatch —— 提供大量免費的Bootstrap主題。
Bootsnipp —— 在線前端框架交互組件製作工具,是一個供給設計師和開發者的基於Bootstrap HTML/CSS/JavaScript 架構的免費元素。
LayoutIt —— 通過界面拖放生成器簡便快捷地創建基於Bootstrap的前端代碼。通過拖放動作將Bootstrap風格的組件加入到你的個人設計里並且可以方便地修改他們的屬性,......
前端開發框架有哪些
1. Bootstrap Boostrap絕對是目前最流行用得最廣泛的一款框架。它是一套優美,直觀並且給力的web設計工具包,可以用來開發跨瀏覽器兼容並且美觀大氣的頁面。它提供了很多流行的樣式簡潔的UI組件,柵格系統以及一些常用的JavaScript插件。 Bootst...
前端框架用哪個好
1、flex
Apache基金會今天發布了Flex 4.8版本,這是Adobe將Flex捐獻給Apache基金會後發布的第一個版本。
需要注意的是,Flex目前還在孵化階段,還不是Apache的正式項目,Flex 4.8也不是一個正式的Apache版本。
Apache稱,該版本標志著Flex新時代的開始,Flex的未來將由社區來驅動,而不是由一個公司驅動。開發者可以通過貢獻代碼,來幫助改進Flex,如修復bug、增加功能等。
從Macromedia賣給Adobe,然後又捐給apache,不知道搞什麼名堂。不過還好沒有經過大幅重構,否則就真的是悲哀了!
2、extjs
ExtJS是一種主要用於創建前端用戶界面,是一個基本與後台技術無關的前端ajax框架。
功能豐富,無人能出其右。
無論是界面之美,還是功能之強,ext的表格控制項都高居榜首。
華麗的界面,靈活的功能,還有開發工具都是配套的,但有個最大的問題,用就得花錢!
3、easyui
easyui幫助你構建你的web應用更加容易。
它是一個基於jquery的插件,開發出來的一套輕量級的ui框架,非常小巧而且功能豐富。
但是她有一個最大的問題就是代碼只能找到以前的開源的版本,到了1.2以後的版本源代碼都是經過混淆的,如果遇到問題修改起來會非常麻煩!不過一個比較大的優勢是開源免費,並且界面做的還說的過去!
4、MiniUI
又一個基於jquery的框架,開發的界面功能都很豐富。
jQuery MiniUI - 快速開發WebUI。
它能縮短開發時間,減少代碼量,使開發者更專注於業務和服務端,輕松實現界面開發,帶來絕佳的用戶體驗。
使用MiniUI,開發者可以快速創建Ajax無刷新、B/S快速錄入數據、CRUD、Master-Detail、菜單工具欄、彈出面板、布局導航、數據驗證、分頁表格、樹、樹形表格等典型WEB應用系統界面。
界面做的挺不錯,功能也挺豐富,但是有兩個比較大的問題,一個是收費,一個是沒有源碼,說白了,不開源!基於這個開發如果想對功能做擴展就需要找他們的團隊進行升級!
5、jQuery UI
jQuery UI 是一套 jQuery 的頁面 UI 插件,包含很多種常用的頁面空間,例如 Tabs(如本站首頁右上角部分) 、拉簾效果(本站首頁左上角)、對話框、拖放效果、日期選擇、顏色選擇、數據排序、窗體大小調整等等非常多的內容。
功能非常全面,界面也挺漂亮的,可以整體使用,也可以分開使用其中的幾個模塊,免費開源!
6、DWZ
DWZ富客戶端框架(jQuery RIA framework), 是中國人自己開發的基於jQuery實現的Ajax RIA開源框架.
設計目標是簡單實用,快速開發,降低ajax開發成本。
歡迎大家提出建議,我們將在下一版本中進一步調整和完善功能.共同推進國內整體ajax開發水平。
畢竟是國產的,支持一下,而且源碼完全公開,可以選擇一下!不過性能怎麼樣不敢確定!
7、GWT
Google 網頁工具包——GWT 提供了一組基於Java語言的開發包,這個開發包的設計參考Java AWT包設計,類命名規則、介面設計、事件監聽等都和AWT非常類似。熟悉Java AWT的開發者不需要花費多大的力氣就能夠快速的理解GWT開發工具包,將更多地時間投入到GWT應用的開發過程中。
你不用......
web前端開發框架有哪些
bootstrap是twitter出的一款不錯的UI框架,或者與其說是框架不如說是類庫(lib),當然這里邊牽扯到一個「究竟什麼是框架什麼是類庫?」的問題,我們暫時不談。畢竟是有大公司背景的代碼堆,我覺得沒什麼「落伍」可言。
angular是前兩年之內突然火得一塌糊塗的一個fe框架,這個我覺得可以算的上是真正意義上的框架了,MVVM雙向綁定,包括它擁有足夠完善的社區、生態,甚至chrome上都有很多好用的相關插件(這一點可以說是佔了google出品的光),比較完整的大型項目都是可以考慮引入的。但如果你的網站只是做一些輕量級的東西,殺雞焉用宰牛刀吧我覺得。
backbone主要針對的MVC中的M層,至少我是這么理解的。對UI層它幾乎沒什麼太多的限制,一方面給出了coder自由度進行發揮,另一方面也等於在這方面框架本身對開發沒提供什麼太大的幫助。我覺得這更像是一個高手向的框架,另外對於underscore前端模板那一套東西,說實話作為一名php java啥都能寫的FE我始終覺得這套東西有那麼一種純JS工程師的一廂情願的意味。這是個人看法了,不一定準確,況且有人會搬出ajax動態渲染時 前端模板的作用來反駁我,別急著反駁,至少往下看完我說的話。
相比之下,react可以說是一個在MVC中V層做的十分出色和新穎的框架了,獨特的jsx編譯機制就已經讓你的代碼變得高大上了,我是覺得這個類庫在UI層做的更徹底更專業,或者說讓FE的代碼更專業了。更何況,react比angular更年輕,而且同樣擁有大公司背景,react native一出更是讓JS工程師的地位取得了革命性的提升,(不要跟我提phonegap,用過兩個東西後你會明白,react打包的app性能甩phonegap幾條街沒問題)。另外既然樓主提到了之前的網站是bootstrap,不妨可以看一看react-bootstrap這個東西,或許這就是你想要的。
2. JS前端web開源框架miniui懶載入樹形結構太慢,有什麼優化方法嗎
js本身執行效率很高,你如果不信自己嘗試生成一萬個元素在頁面用時多久看看,除非是你的數據是基於後端給的
個人建議做一套數據持久層,或者直接給個JSON文件放本地(假設你的樹形結構不變)
可以從持久層和網路靜態文件等開始優化
3. web前端diff 演算法深入一下
有同學問:能否詳細說一下 diff 演算法。
詳細的說,請閱讀這篇文章,有疑問的地方歡迎留言一起討論。
因為 diff 演算法是 vue2.x , vue3.x 以及 react 中關鍵核心點,理解 diff 演算法,更有助於理解各個框架本質。
說到「diff 演算法」,不得不說「虛擬 Dom」,因為這兩個息息相關。
比如:
等等
我們先來說說虛擬 Dom,就是通過 JS 模擬實現 DOM ,接下來難點就是如何判斷舊對象和新對象之間的差異。
Dom 是多叉樹結構,如果需要完整的對比兩棵樹的差異,那麼演算法的時間復雜度 O(n ^ 3),這個復雜度很難讓人接收,尤其在 n 很大的情況下,於是 React 團隊優化了演算法,實現了 O(n) 的復雜度來對比差異。
實現 O(n) 復雜度的關鍵就是只對比同層的節點,而不是跨層對比,這也是考慮到在實際業務中很少會去跨層的移動 DOM 元素。
虛擬 DOM 差異演算法的步驟分為 2 步:
實際 diff 演算法比較中,節點比較主要有 5 種規則的比較
部分源碼 https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L501 如下:
在 reconcileChildren 函數的入參中
diff 的兩個主體是:oldFiber(current.child)和 newChildren(nextChildren,新的 ReactElement),它們是兩個不一樣的數據結構。
部分源碼
很多時候手工優化 dom 確實會比 virtual dom 效率高,對於比較簡單的 dom 結構用手工優化沒有問題,但當頁面結構很龐大,結構很復雜時,手工優化會花去大量時間,而且可維護性也不高,不能保證每個人都有手工優化的能力。至此,virtual dom 的解決方案應運而生。
virtual dom 是「解決過多的操作 dom 影響性能」的一種解決方案。
virtual dom 很多時候都不是最優的操作,但它具有普適性,在效率、可維護性之間達到平衡。
virutal dom 的意義:
vue2.x 的 diff 位於 patch.js 文件中,該演算法來源於 snabbdom,復雜度為 O(n)。了解 diff 過程可以讓我們更高效的使用框架。react 的 diff 其實和 vue 的 diff 大同小異。
最大特點:比較只會在同層級進行, 不會跨層級比較。
對比之前和之後:可能期望將 直接移動到
的後邊,這是最優的操作。
但是實際的 diff 操作是:
vue 中也使用 diff 演算法,有必要了解一下 Vue 是如何工作的。通過這個問題,我們可以很好的掌握,diff 演算法在整個編譯過程中,哪個環節,做了哪些操作,然後使用 diff 演算法後輸出什麼?
解釋:
mount 函數主要是獲取 template,然後進入 compileToFunctions 函數。
compileToFunction 函數主要是將 template 編譯成 render 函數。首先讀取緩存,沒有緩存就調用 compile 方法拿到 render 函數的字元串形式,在通過 new Function 的方式生成 render 函數。
compile 函數將 template 編譯成 render 函數的字元串形式。後面我們主要講解 render
完成 render 方法生成後,會進入到 mount 進行 DOM 更新。該方法核心邏輯如下:
上面提到的 compile 就是將 template 編譯成 render 函數的字元串形式。核心代碼如下:
compile 這個函數主要有三個步驟組成:
分別輸出一個包含
parse 函數:主要功能是 將 template 字元串解析成 AST(抽象語法樹) 。前面定義的 ASTElement 的數據結構,parse 函數就是將 template 里的結構(指令,屬性,標簽) 轉換為 AST 形式存進 ASTElement 中,最後解析生成 AST。
optimize 函數(src/compiler/optomizer.js):主要功能是 標記靜態節點 。後面 patch 過程中對比新舊 VNode 樹形結構做優化。被標記為 static 的節點在後面的 diff 演算法中會被直接忽略,不做詳細比較。
generate 函數(src/compiler/codegen/index.js):主要功能 根據 AST 結構拼接生成 render 函數的字元串 。
其中 genElement 函數(src/compiler/codgen/index.js)是根據 AST 的屬性調用不同的方法生成字元串返回。
總之:
就是 compile 函數中三個核心步驟介紹,
patch 函數 就是新舊 VNode 對比的 diff 函數,主要是為了優化 dom,通過演算法使操作 dom 的行為降低到最低, diff 演算法來源於 snabbdom,是 VDOM 思想的核心。snabbdom 的演算法是為了 DOM 操作跨級增刪節點較少的這一目標進行優化, 它只會在同層級進行,不會跨層級比較。
總的來說:
在創建 VNode 就確定類型,以及在 mount/patch 的過程中採用位運算來判斷一個 VNode 的類型,在這個優化的基礎上再配合 Diff 演算法,性能得到提升。
可以看一下 vue3.x 的源碼:https://github.com/vuejs/vue/blob//src/core/vdom/patch.js
對 oldFiber 和新的 ReactElement 節點的比對,將會生成新的 fiber 節點,同時標記上 effectTag,這些 fiber 會被連到 workInProgress 樹中,作為新的 WIP 節點。樹的結構因此被一點點地確定,而新的 workInProgress 節點也基本定型。在 diff 過後,workInProgress 節點的 beginWork 節點就完成了,接下來會進入 completeWork 階段。
snabbdom 演算法:https://github.com/snabbdom/snabbdom
定位:一個專注於簡單性、模塊化、強大功能和性能的虛擬 DOM 庫。
snabbdom 中定義 Vnode 的類型(https://github.com/snabbdom/snabbdom/blob//src/vnode.ts#L12)
init 函數的地址:
https://github.com/snabbdom/snabbdom/blob//src/init.ts#L63
init() 函數接收一個模塊數組 moles 和可選的 domApi 對象作為參數,返回一個函數,即 patch() 函數。
domApi 對象的介麵包含了很多 DOM 操作的方法。
源碼:
https://github.com/snabbdom/snabbdom/blob//src/init.ts#L367
源碼:
https://github.com/snabbdom/snabbdom/blob//src/h.ts#L33
h() 函數接收多種參數,其中必須有一個 sel 參數,作用是將節點內容掛載到該容器中,並返回一個新 VNode。
在 vue2.x 不是完全 snabbdom 演算法,而是基於 vue 的場景進行了一些修改和優化,主要體現在判斷 key 和 diff 部分。
1、在 snabbdom 中 通過 key 和 sel 就判斷是否為同一節點,那麼在 vue 中,增加了一些判斷 在滿足 key 相等的同時會判斷,tag 名稱是否一致,是否為注釋節點,是否為非同步節點,或者為 input 時候類型是否相同等。
https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L35
2、diff 差異,patchVnode 是對比模版變化的函數,可能會用到 diff 也可能直接更新。
https://github.com/vuejs/vue/blob//src/core/vdom/patch.js#L404
4. antv G6 分層樹怎麼將圖片插入作為樹節點
你看下這個代碼能不能套用 不是完全復制哈
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.ComponentModel;
usingKingdee.BOS;
usingKingdee.BOS.Util;
usingKingdee.BOS.Core;
usingKingdee.BOS.Core.DynamicForm;
usingKingdee.BOS.Core.DynamicForm.PlugIn;
usingKingdee.BOS.Core.DynamicForm.PlugIn.Args;
usingKingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
usingKingdee.BOS.Core.Metadata;
namespaceJDSample.FormPlugIn.DynamicForm
{
///<summary>
///分批分層載入樹節點
///</summary>
///<remarks>
///案例背景:
///界面上使用樹控制項,需顯示大量的節點;
///如果一次性載入到客戶端,顯示渲染會非常慢;
///因此,需要分層、分批下載
///
///案例說明:
///新增一個動態表單,掛上本插件,並在界面有一個樹控制項F_JD_TreeView;
///界面初始化時,僅載入第一層節點;
///用戶點擊節點時,才載入其包含的子節點,而且每次最多載入10個;
///單層超過10個節點,通過"點擊載入更多..."節點,分批下載
///</remarks>
[Description("分批分層載入樹節點")]
publicclassS160107TreeEdit:AbstractDynamicFormPlugIn
{
///<summary>
///本地變數,存儲需載入到前端的所有節點信息,以及其是否已經載入標志
///</summary>
privateDictionary<string,NodeInfo>_dctNodes=newDictionary<string,NodeInfo>();
///<summary>
///本地變數,存儲已經被載入過的父節點Id,避免重復搜索其子節點,浪費時間
///</summary>
privateHashSet<string>_loadedNodeIds=newHashSet<string>();
///<summary>
///界面初始化結束,觸發此事件,通知插件開始載入樹節點:在此事件,載入第一層節點
///</summary>
///<paramname="e"></param>
publicoverrideList<TreeNode>GetTreeViewData(TreeNodeArgse)
{
if(e.Key.EqualsIgnoreCase("F_JD_TreeView")==false)
{
//需載入是其他樹控制項的節點,略過
returnnewList<TreeNode>();
}
//載入全部節點信息到內存
this.LoadNodes();
//記錄已經載入過根節點
this._loadedNodeIds.Add("0");
//展開樹控制項節點
TreeViewtv=this.View.GetControl<TreeView>("F_JD_TreeView");
tv.SetExpanded(true);
//構造根目錄下的第一層節點並返回
List<TreeNode>nodes=this.BuildTreeNodes("0");
returnnodes;
}
///<summary>
///用戶點擊節點時觸發此事件:載入更多子節點
///</summary>
///<paramname="e"></param>
(TreeNodeArgse)
{
if(e.Key.EqualsIgnoreCase("F_JD_TreeView")==false)
{
//點擊的是其他樹控制項,略過
return;
}
//判斷是否已經載入過此節點的子節點,如果載入過,則不再載入
if(this._loadedNodeIds.Contains(e.NodeId))
{
return;
}
this._loadedNodeIds.Add(e.NodeId);
TreeViewtv=this.View.GetControl<TreeView>("F_JD_TreeView");
stringparentId=e.NodeId;
if(parentId.StartsWith("more"))
{//當前點擊的節點,是"點擊載入更多..."
string[]keys=parentId.Split('|');
parentId=keys[1];//第2部分為父節點部分
//"點擊載入更多..."節點已經被點擊過,不再需要了,移除之
tv.RemoveNode(e.NodeId);
}
//開始載入更多的子節點
List<TreeNode>childNodes=this.BuildTreeNodes(parentId);
if(childNodes.Count>0)
{
tv.AddNodes(parentId,childNodes);
}
}
///<summary>
///構建樹控制項所需要的節點對象
///</summary>
///<paramname="parentId">父節點Id,為0表示第一層節點</param>
///<returns></returns>
privateList<TreeNode>BuildTreeNodes(stringparentId)
{
List<TreeNode>nodes=newList<TreeNode>();
//遍歷全部節點,找指定節點中,未載入的子節點的子節點
intcount=0;
intindex=0;
foreach(varitemin_dctNodes)
{
NodeInfonodeInfo=item.Value;
if(nodeInfo.Loaded==false
&&nodeInfo.ParentId==parentId)
{
nodeInfo.Loaded=true;
count++;
TreeNodenode=newTreeNode()
{
id=nodeInfo.Id,
text=nodeInfo.Caption,
parentid=nodeInfo.ParentId,
};
nodes.Add(node);
}
if(count>=10)
{//本次載入超過了10個
//生成一個特殊的節點(載入更多...),並停止本批載入更多子節點
TreeNodenode=newTreeNode()
{
//需要基於如下需求,生成一個特殊的節點Id
//1.需要與其他普通節點進行區分:以more為前綴
//2.需要能夠提取出父節點Id:包含父節點Id
//3.每次產生的特殊節點Id不能重復:需包含當前節點索引
id=string.Format("more|{0}|{1}",parentId,index),
text="點擊載入更多...",
parentid=parentId,
};
nodes.Add(node);
break;
}
index++;
}
returnnodes;
}
///<summary>
///到資料庫載入全部節點信息:本示例直接手工構建一批有層次的節點信息
///</summary>
privatevoidLoadNodes()
{
//節點名稱,包含其子節點的數量,以提示用戶,可以展開查看子節點
//第一層節點
_dctNodes.Add("1",newNodeInfo(){Id="1",ParentId="0",Caption="江西(100)"});
_dctNodes.Add("2",newNodeInfo(){Id="2",ParentId="0",Caption="廣東(3)"});
//循環添加100個第一層節點
for(inti=3;i<=100;i++)
{
_dctNodes.Add(i.ToString(),newNodeInfo()
{Id=i.ToString(),ParentId="0",Caption=string.Format("省份{0}(0)",i)});
}
//第二層節點:
_dctNodes.Add("1.1",newNodeInfo(){Id="1.1",ParentId="1",Caption="南昌(0)"});
_dctNodes.Add("1.2",newNodeInfo(){Id="1.2",ParentId="1",Caption="九江(0)"});
_dctNodes.Add("1.3",newNodeInfo(){Id="1.3",ParentId="1",Caption="贛州(0)"});
//循環添加100個第二層節點
for(inti=4;i<=100;i++)
{
_dctNodes.Add(string.Format("1.{0}",i),
newNodeInfo()
{
Id=string.Format("1.{0}",i),
ParentId="1",
Caption=string.Format("城市{0}(0)",i)
});
}
_dctNodes.Add("0201",newNodeInfo(){Id="0201",ParentId="02",Caption="廣州(0)"});
_dctNodes.Add("0202",newNodeInfo(){Id="0202",ParentId="02",Caption="深圳(2)"});
_dctNodes.Add("0203",newNodeInfo(){Id="0203",ParentId="02",Caption="惠州(0)"});
//第三層節點:
_dctNodes.Add("020201",newNodeInfo(){Id="020201",ParentId="0202",Caption="南山區"});
_dctNodes.Add("020202",newNodeInfo(){Id="020202",ParentId="0202",Caption="寶安區"});
}
}
///<summary>
///節點信息對象
///</summary>
classNodeInfo
{
///<summary>
///本節點Id
///</summary>
publicstringId{get;set;}
///<summary>
///父節點Id
///</summary>
publicstringParentId{get;set;}
///<summary>
///本節點標題
///</summary>
publicstringCaption{get;set;}
///<summary>
///是否已經載入標志:默認為false,未載入到前端
///</summary>
publicboolLoaded{get;set;}
}
}
5. java web 樹形結構設計
類似的插件很多 前台引入後其實只需要關心後台的json或者xml結構,比如:
jstree、ztree、easyui tree等等