這篇文章主要介紹了layui表格數(shù)據(jù)變更的處理方式有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供西林企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、網(wǎng)站制作、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為西林眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。表格數(shù)據(jù)變更,一般包括幾個(gè)內(nèi)容:新增、修改、刪除、移動(dòng),開發(fā)中經(jīng)常會(huì)面臨的一個(gè)問(wèn)題就是變更之后如何將數(shù)據(jù)同步到節(jié)點(diǎn)上,一直以來(lái)個(gè)人的建議還是利用表格重載,不管是url模式的還是data模式的實(shí)際都是需要重載,url重載自然會(huì)重新請(qǐng)求后臺(tái)得到新的數(shù)據(jù),data模式一般就是對(duì)data的操作,之后重新以新的data去渲染出來(lái)。
同時(shí)會(huì)考慮的是如何盡量減少請(qǐng)求,可能感受最深的就是update操作,為了要更新這一條記錄而重載整個(gè)表格,請(qǐng)求一遍數(shù)據(jù)感覺劃不來(lái),那么一般來(lái)說(shuō)就可以利用表格的tool事件中的obj.update這個(gè)方法去更新。
不過(guò)具體使用中就會(huì)發(fā)現(xiàn)其諸多的不足的地方,本文就是主要針對(duì)這些不足進(jìn)行一個(gè)處理給出一個(gè)tablePlug.update的方法,然后進(jìn)而衍生出add和remove和move,同時(shí)新增了更新統(tǒng)計(jì)行數(shù)據(jù)的方法。
測(cè)試頁(yè)面: 綜合測(cè)試頁(yè)面 流加載表格測(cè)試頁(yè)面 定時(shí)刷新表格測(cè)試頁(yè)面
一、update
正如上面說(shuō)的obj.update(data)有諸多限制,優(yōu)點(diǎn)上來(lái)說(shuō)就是用最小的修改代價(jià),實(shí)現(xiàn)了數(shù)據(jù)的更新,他就更新參數(shù)中的data中的鍵的數(shù)據(jù),不會(huì)整個(gè)行更不會(huì)整個(gè)table的節(jié)點(diǎn)更新;缺陷是底層的實(shí)現(xiàn)邏輯有點(diǎn)問(wèn)題:
1、是通過(guò)遍歷data,更新緩存cache中對(duì)應(yīng)的記錄的key的value,然后根據(jù)cols的配置信息更新td的內(nèi)容,但是如果是想要更新toolbar列的話就沒戲,目前解析的只有templet的,所以如果想要更新toolbar的話基本就只能設(shè)置成templet,而且要給這個(gè)列添加一個(gè)field,才有理論上的可能。
2、toolbar列即使加了field改成templet也未必能更新過(guò)來(lái),因?yàn)閮?nèi)部的實(shí)現(xiàn)邏輯是先判斷原始的data是否有這個(gè)key,所以如果field命名是原始的data里面沒有的,后面用obj.update也更新不進(jìn)去的,這個(gè)是一個(gè)比較大的限制。
因?yàn)槟梦覀冺?xiàng)目來(lái)說(shuō),后臺(tái)給我們的數(shù)據(jù)如果原始的記錄里面沒有這個(gè)key的值他不會(huì)給一個(gè)key: ''的,那么后面要想利用obj.update這個(gè)key就變得不可能,除非利用parseData在渲染之前對(duì)后臺(tái)給的數(shù)據(jù)做一個(gè)人工的初始化把對(duì)應(yīng)的key添加上,但是可想而知有多麻煩。
3、數(shù)據(jù)他是一個(gè)一個(gè)更新進(jìn)去,然后更新一個(gè)值就更新對(duì)應(yīng)的td,但是這個(gè)就存在另外一個(gè)風(fēng)險(xiǎn)了,就是遍歷對(duì)象他是無(wú)序的,比如update{a: 1, b:2},如果a字段的cols中會(huì)用到b字段的值做一個(gè)處理再顯示出來(lái)。
那么如果遍歷順序是先更新a的值,然后就開始更新a的td的內(nèi)容,這個(gè)時(shí)候cache中b的值還是舊的不是你要更新進(jìn)去的2,等到更新了b字段了他又不能說(shuō)檢測(cè)到其他字段有使用了這個(gè)字段會(huì)去再次更新對(duì)方的內(nèi)容,這就導(dǎo)致了a出來(lái)的結(jié)果還是錯(cuò)的。
4、更新了統(tǒng)計(jì)列的某一個(gè)值統(tǒng)計(jì)行的對(duì)應(yīng)數(shù)據(jù)沒有重新計(jì)算。
總結(jié)的來(lái)說(shuō)就是,obj.update實(shí)現(xiàn)的還是太過(guò)理想化太過(guò)簡(jiǎn)單,一條記錄從數(shù)據(jù)上來(lái)說(shuō)每個(gè)key是獨(dú)立的這個(gè)沒什么問(wèn)題,但是到頁(yè)面顯示就不然了,因?yàn)轫?yè)面的內(nèi)容它不一直是單個(gè)字段的簡(jiǎn)單值顯示,還會(huì)進(jìn)行一些特殊處理。
所以需要一個(gè)templet來(lái)轉(zhuǎn)化,來(lái)自定義,所以有可能一個(gè)td里面會(huì)用到多個(gè)字段這個(gè)很正常,工具列的按鈕也會(huì)根據(jù)數(shù)據(jù)的狀態(tài)去決定部分按鈕是否顯示等等。
所以個(gè)人認(rèn)為要更新這個(gè)數(shù)據(jù)不能是一個(gè)獨(dú)立的小單元的更新,而是先update這一行的數(shù)據(jù)然后在update這一行,而不是遍歷被update的key一個(gè)個(gè)更新,再往大了看,實(shí)際這個(gè)表的記錄也是一個(gè)整體。
也是不能說(shuō)你改了這條記錄其他的記錄必定是不變的,不排除某個(gè)字段的td他會(huì)根據(jù)當(dāng)前頁(yè)面的同一個(gè)field做了什么處理現(xiàn)實(shí),比如統(tǒng)計(jì)行,所以目前的思路就是直接將值先update到cache中,然后再調(diào)用table內(nèi)部的渲染tr td的內(nèi)容。
大致的代碼:
前面是針對(duì)參數(shù)做了一些處理讓參數(shù)更加靈活,最關(guān)鍵的是后半部分的更新cache的部分,還要一個(gè)最關(guān)鍵的renderData的方法:
他的作用就是將cache中的數(shù)據(jù)重新解析渲染一遍,同時(shí)針對(duì)是否是移動(dòng)數(shù)據(jù)還有默認(rèn)點(diǎn)擊那一條記錄的處理,但是核心是渲染cache,調(diào)用table.js內(nèi)部的renderData。
使用場(chǎng)景:
1、知道當(dāng)前編輯修改的是那一條記錄,可以看看一個(gè)最常用的場(chǎng)景就是點(diǎn)擊編輯彈出一個(gè)form然后修改提交,完成之后希望盡量不要重新請(qǐng)求接口更新到data和頁(yè)面中去,
gif很不好錄,自己使用測(cè)試的例子里面的編輯按鈕測(cè)試效果即可
調(diào)用的更新數(shù)據(jù)的形式是:
tablePlug.update(表格實(shí)例的id, 當(dāng)前tr的index, newData)
2、不知道當(dāng)前的trIndex的情況下update某一條記錄的話,必須有一個(gè)限制就是必須是有主鍵的表格,并且更新的數(shù)據(jù)中必須包含主鍵的字段,不然你也不知道更新的到底是哪條記錄。
tablePlug.update('demo', {id: 10002, username: '賢心'});
3、一次性更新多條記錄,這個(gè)參數(shù)trIndex就沒有意義了,加了也沒用,因?yàn)槭歉露鄺l記錄,所以可以這么寫
tablePlug.update('demo', [{id: 10002, username: '賢心'}, {id: 10006, username: '小偷', age: 18, sign: '大叔'}]);
這個(gè)測(cè)試頁(yè)面可以看看頭部toolbar中的“積分清零”還有“女性積分加100”這兩個(gè)測(cè)試按鈕以及背后的事件執(zhí)行的方法
4、更加任性的,只要傳入一個(gè)tableId,update會(huì)將當(dāng)前按照cache中的數(shù)據(jù)給渲染一次,這個(gè)是非常實(shí)用的,比如如果你覺得我update中的邏輯針參數(shù)對(duì)cache的修改的邏輯不滿意可以自己用自己覺得更好的方法去處理cache,最后執(zhí)行一下tablePlug.update('demo')就好了,提供更高的自由度,和拓展的可能性。
二、addData
addData添加的記錄是已經(jīng)請(qǐng)求接口完成返回的數(shù)據(jù)記錄,本質(zhì)上來(lái)說(shuō)就是不一樣的,所以不要混淆。
具體addData的代碼:
data模式的話,實(shí)際也是往data里面添加一些記錄,然后也是再reload一下。
// 添加單條記錄:tablePlug.addData ('demo', {id: newId, username: '甲'});// 添加多條記錄tablePlug.addData ('demo', [{id: newId1, username: '乙'},{id: newId2, username: '丙'}]);
關(guān)于addData的有一個(gè)比較綜合的例子可以看看利用table的data模式怎么跟流加載配合使用,弄成一個(gè)流加載的表格
https://sun_zoro.gitee.io/layuitableplug/testTableFlow
三、del
新增和刪除實(shí)際個(gè)人建議還是reload比較穩(wěn)妥,不管是url還是data模式都是,所以刪除對(duì)應(yīng)的處理方式也跟新增實(shí)際差不多,只不過(guò)刪除麻煩一點(diǎn)的就是data模式要在原始的記錄里面去刪除指定的記錄。
而且有可能開啟了復(fù)選的狀態(tài)記憶刪除了就要將關(guān)于他的狀態(tài)給調(diào)整一下;還是為了使用更方便,參數(shù)同樣做了處理,
1、刪除指定的下標(biāo)的數(shù)據(jù),可以查看表格行的toolbar中的刪除按鈕的監(jiān)聽處理,但是注意,如果表格是url的模式,目前測(cè)試頁(yè)面寫的都是json文件,所以reload也不會(huì)有效果的。
所以要測(cè)試請(qǐng)?jiān)赿ata模式的測(cè)試,不用糾結(jié)這個(gè),url的如果是實(shí)際的服務(wù)接口的話是后臺(tái)返回?cái)?shù)據(jù),一般刪除成功了后面查詢是不會(huì)再出來(lái)的,除非后臺(tái)接口有問(wèn)題。
2,刪除指定的一些記錄,這個(gè)一般有兩種形式,但是要求一樣就是必須是有主鍵的表格
// id集合tablePlug.del('demo', [1,2,3,4]);// 對(duì)象數(shù)組tablePlug.del('demo', [{id: 1, name: 'name1'}, {id:2}, {id:4}]);
根據(jù)得到哪種數(shù)據(jù)比較方便就用哪種形式,可以參考測(cè)試頁(yè)面的批量刪除的處理方式
四、move
這個(gè)處理基本跟update差不多,將數(shù)據(jù)在cache中調(diào)整位置,然后調(diào)用一下組件內(nèi)部的renderData的方法讓他重新渲染出來(lái)就好
然后為了使用方便衍生出來(lái)一個(gè)上移跟下移的方法
效果
理論上利用一些拖拽事件或者其他的插件在事件中調(diào)用一下tablePlug.move('demo', form, to);就能夠?qū)崿F(xiàn)順序的任意改變了
限制:注意!這個(gè)只是針對(duì)數(shù)據(jù)移動(dòng),不會(huì)有單條數(shù)據(jù)記錄的變動(dòng),如果原始的數(shù)據(jù)里面有點(diǎn)擊了排序,那么移動(dòng)之后默認(rèn)是會(huì)去掉這個(gè)排序的狀態(tài)了的,因?yàn)橐苿?dòng)之后很可能就不能滿足當(dāng)前的排序規(guī)則了,所以建議在使用移動(dòng)的時(shí)候不要跟sort搭配,如果有sort而且所謂的移動(dòng)是會(huì)發(fā)起請(qǐng)求改變數(shù)據(jù)的,那么這個(gè)建議還是使用請(qǐng)求接口得到兩個(gè)新的數(shù)據(jù)然后用update去更新他們的位置。
五、renderTotal
在記錄更新之后,如果存在統(tǒng)計(jì)行有需要統(tǒng)計(jì)的列,那么值一般也要跟著變,另外一個(gè)更加重要的作用就是可以自定義統(tǒng)計(jì)規(guī)則,而不是自帶的求和,可以自定一定計(jì)算的函數(shù),或者可以直接類似templet一樣的去自定義返回的內(nèi)容,包括異步的去讀取想要顯示的數(shù)據(jù)。
代碼大概如下:
從實(shí)現(xiàn)代碼可以看出就是給cols的字段配置新增一個(gè)totalFormat的設(shè)置,可以設(shè)置一個(gè)規(guī)則如果不設(shè)置的話就是sum(目前也只是添加了sum,其他的規(guī)則后面會(huì)加入或者自己加入,比如平均。
較大最小不過(guò)個(gè)人覺得主要意義是可以自定義方法,這個(gè)才是實(shí)用常用的),也可以設(shè)置一個(gè)方法,如果不是異步的可以直接把結(jié)果返回,如果是需要異步的那么也可以在得到最終想要的結(jié)果的時(shí)候執(zhí)行:
tablePlug.renderTotal(tableId, field, res);
比如下面的:
平時(shí)實(shí)用的話不是都要自己去調(diào)用的,在插件內(nèi)部已經(jīng)在renderDone回調(diào)里面會(huì)去執(zhí)行他了:
參數(shù)也是比較自由,不同的組合會(huì)有不同的效果,
// 觸發(fā)更新某個(gè)表格的所有列的統(tǒng)計(jì)數(shù)據(jù)renderTotal(tableId);// 觸發(fā)更新某個(gè)表格的某個(gè)字段的數(shù)據(jù)renderTotal(tableId, fieldName);// 更新某個(gè)表格的某個(gè)字段的統(tǒng)計(jì)數(shù)據(jù)為valuerenderTotal(tableId, fieldName, totalValue);
六、refresh
之前做過(guò)一個(gè)智能reload的修改,即在執(zhí)行table.reload的時(shí)候會(huì)根據(jù)傳過(guò)去的option來(lái)判斷只是重新請(qǐng)求數(shù)據(jù)還是需要重載一下,個(gè)人覺得效果可以了。
不過(guò)對(duì)于有強(qiáng)迫癥(有追求)的小伙伴來(lái)說(shuō),在一些場(chǎng)景下還是不夠好,就是那些定時(shí)刷新的,表現(xiàn)就是一方面滾動(dòng)條會(huì)回到top:0,left:0,還有其他的比如鼠標(biāo)在操作分頁(yè)組件的時(shí)候會(huì)覺得失去焦點(diǎn),新增一個(gè)tablePlug.refresh來(lái)試一試能否滿足要求。
先看效果:
事件背后做的事情:
表格config:
背后的實(shí)現(xiàn)思路
修改table的Class.prototype.pullData支持refresh模式
renderData的時(shí)候根據(jù)是否refresh去做一些細(xì)節(jié)的處理,還有一個(gè)限定就是返回的數(shù)據(jù)中關(guān)于總數(shù)應(yīng)該是不變的,如果發(fā)生了改變,那么還是會(huì)renderData,會(huì)重新渲染page組件。
另外一個(gè)限制就是這種refresh的表格不建議再加什么按鈕呀edit呀,因?yàn)樗恢睍?huì)在變,基本主要就是用來(lái)做一個(gè)單純用來(lái)顯示用的表格,比如一些經(jīng)常變化的數(shù)據(jù),訪問(wèn)人次,股票動(dòng)態(tài)之類的。
使用:
// 啟動(dòng)表格demo的自動(dòng)刷新功能,500毫秒一次tablePlug.refresh('demo', 500);// 取消表格demo的自動(dòng)刷新tablePlug.refresh('demo', false);// 停止所有已開啟自動(dòng)刷新的表格的自動(dòng)刷新tablePlug.refresh(false);
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“l(fā)ayui表格數(shù)據(jù)變更的處理方式有哪些”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
當(dāng)前標(biāo)題:layui表格數(shù)據(jù)變更的處理方式有哪些-創(chuàng)新互聯(lián)
文章路徑:http://m.rwnh.cn/article20/ccioco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、面包屑導(dǎo)航、服務(wù)器托管、網(wǎng)站策劃、品牌網(wǎng)站建設(shè)、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)