倉庫地址:Dragact爽滑的拖拽組件html
你們好,新年已通過去,你們又投入了繁忙的工做當中,因爲我在國外,所以壓根兒沒有休息...git
少說廢話,上週一週的時間裏,我陸陸續續的爲Dragact
組件進行了一系列更新,基本上作了一個大重構,並且作了一小部分性能優化。github
經過對React 組件渲染的優化以及內部算法的優化,把大量的遍歷和渲染都省掉。算法
優化前6s的性能數據庫
優化後6s的性能api
你們能夠看到,一樣是跑6s,咱們腳本計算時間,渲染時間,瀏覽器painting時間都有了很大幅度的提高。數組
能夠從最簡單的例子看出,咱們渲染子組件的方式和以往有些不一樣。以往的React組件書寫方式,採用的是相似如下寫法:瀏覽器
<Dragact col={8} width={800} margin={[5, 5]} rowHeight={40} className='plant-layout' > <div key={0} data-set={{ GridX: 0, GridY: 0, w: 4, h: 2 }} className='layout-child'>0</div> <div key={1} data-set={{ GridX: 0, GridY: 0, w: 1, h: 2 }} className='layout-child'>1</div> <div key={2} data-set={{ GridX: 0, GridY: 0, w: 3, h: 2 }} className='layout-child'>2</div> </Dragact>
這麼作固然能夠,可是有幾個問題:性能優化
爲了解決這個問題,我將子組件的渲染方式進行高度抽象成爲一個構造器,簡單來講就是如下的形式:服務器
<Dragact layout={fakeData}//必填項 .... > {(item, isDragging) => { return <div style={blockStyle}> {isDragging ? '正在抓取' : '停放'} </div> }} </Dragact>,
如今,咱們子元素渲染變成一個小小的構造函數,第一個入參是您輸入數據的每一項,第二個參數就是isDragging,狀態監聽參數。
這麼作,輕易的實現了,組件漂亮,不用寫map函數,不用寫key,同時更容易監聽每個組件的拖拽狀態isDragging.
更多的依賴注入思想以及好處,請看個人知乎問答:知乎,方正的回答:如何設計一款組件庫
最後放一張圖動圖:
很是輕鬆的追蹤到了是否拖拽
經過全新的api,如今dragact可以輕鬆的實現,全自定義的拖拽把手
點擊拖拽把手就能移動,不點擊?絕對不能移動
視圖的改變就是數據的改變
這是React給咱們的一個啓示,Dragact組件經過對數據的處理,達到了數據變化即視圖變化。
這麼作的好處就是咱們能夠輕鬆的將佈局信息記錄在服務器的數據庫中,下一次拿到數據的時候,就能夠輕鬆的恢復原來的視圖位置。
經過獲取Dragact組件的實例,我提供了一個api getLayout():DragactLayout;,用於獲取當前的佈局信息。
在這個例子:Drag例子中,咱們經過調用getLayout() api將數據存儲在本地瀏覽器中,當下次訪問的時候,咱們就能夠恢復以前所擺放的佈局。
爲了更好的觀看體驗,我爲移動端的用戶們設計了一個用例頁面,如今能夠在手機上玩耍啦!
手機端例子:Drag例子中
手機端的界面
感謝你們支持,喜歡的給一點✨!~