国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Vue自定義指令實現checkbox全選功能的方法

來源:懂視網 責編:小采 時間:2020-11-27 22:18:27
文檔

Vue自定義指令實現checkbox全選功能的方法

Vue自定義指令實現checkbox全選功能的方法:最近做的一個項目需要用到Vue實現全選功能,參考了一下網上的做法,發現用屬性計算的復用性不高,于是選用自定義指令,但網上的做法大多是會對原始數據有一定的格式要求,而且沒有返回結果,于是做了改進。 上代碼: <!DOCTYPE html> <h
推薦度:
導讀Vue自定義指令實現checkbox全選功能的方法:最近做的一個項目需要用到Vue實現全選功能,參考了一下網上的做法,發現用屬性計算的復用性不高,于是選用自定義指令,但網上的做法大多是會對原始數據有一定的格式要求,而且沒有返回結果,于是做了改進。 上代碼: <!DOCTYPE html> <h

最近做的一個項目需要用到Vue實現全選功能,參考了一下網上的做法,發現用屬性計算的復用性不高,于是選用自定義指令,但網上的做法大多是會對原始數據有一定的格式要求,而且沒有返回結果,于是做了改進。

上代碼:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title></title>
 </head>
 <body>
 <div id="app">
 <input type="checkbox" v-model="allCheck" v-check-all="allCheck" check-data="list" result="customerResult" key="demo"> 全選
 <ul> 
 <li v-for="item in list"> 
 <input type="checkbox" v-model="item.checked"> 
 {{item.demo}}
 </li> 
 </ul> 
 <div >
 customerResult: {{customerResult}}
 </div>
 </div>
 <script src="vue.js"></script>
 <script>
 var vm = new Vue({
 el: "#app",
 data:function(){
 return {
 list:[{demo:1},
 {demo:2},
 {demo:3}],
 allCheck:'',
 customerResult:'',
 }
 },
 directives: {
 'check-all': {
 twoWay: true,
 params: ['checkData','result','key'],
 bind() {
 /*為原始數據的每一個對象添加一個checked屬性*/
 this.vm[this.params.checkData].forEach((item)=>{
 Vue.set(item,'checked',false)
 });
 /*提取被選中的項*/
 this.setValue=function(){
 let result=[]
 this.vm[this.params.checkData].forEach((item) => {
 if(item.checked){
 result.push(item[this.params.key])
 }
 });
 this.vm[this.params.result]=result
 }
 /*如果所有的列表的checked屬性都為true,則選中全選框,否則不選中全選框 */
 this.vm.$watch(this.params.checkData, (data) => {
 if(data.every((item) => item.checked)) {
 this.set(true);
 } else {
 this.set(false);
 }
 this.setValue()
 }, {deep: true});
 },
 // checkAll發生更改時 
 update(checkAll) {
 /*如果全選框被選中,則將列表的所有checked屬性轉為true,否則轉為false */
 if(checkAll) {
 this.vm[this.params.checkData].forEach((item) => {
 item.checked = true;
 });
 } else {
 this.vm[this.params.checkData].forEach((item) => {
 item.checked = false;
 });
 }
 this.setValue()
 },
 },
 }
 })
 </script>
 </body>
</html>

通常我們都要獲取原始數據中的某個鍵值,可在“key”中填進想要獲取的鍵值,“result”就是被選中的項了。
有時,我們需要返回一個完整的對象修改一下代碼,當不輸入key時,返回一個完整的對象數組

this.setValue=()=>{
 let result=[]
 this.vm[this.params.checkData].forEach((item) => {
 //刪除checked屬性
 let temp={};
 (()=>delete Object.assign(temp,item).checked)();
 item.checked?result.push(item[this.params.key]||temp):"";
 });
 this.vm[this.params.result]=result
}

但時,這時,返回來的數組中對象中并沒有與與原數據是相同的引用地址,當需要使用array.$remove()函數時就會失敗,新增一個relative參數,用戶自定義判斷返回的數據是否與原始數據關聯

this.setValue = () => {
 let result = []
 this.vm[this.params.checkData].forEach((item) => {
 if(this.params.relative) {
 item.checked ? result.push(item) : "";
 }else{
 //刪除checked屬性
 let temp = {};
 (() => delete Object.assign(temp, item).checked)();
 item.checked ? result.push(item[this.params.key] || temp) : "";
 }
 });
 this.vm[this.params.result] = result
}

當數據長度大于2個時,需要判斷2N次,相當消耗性能,優化一下:

'check-all', {
 twoWay: true,
 params: ['checkData', 'result', 'key','relative'],
 /*checkData:列表數據,
 result:返回的結果,
 key:列表數據中需要返回的字段,
 relative:是否返回與列表數據相同引用地址的選中結果*/
 bind() {
 /*提取被選中的項*/
 this.setValue = () => {
 let result = []
 if (this.params.relative) {
 this.vm[this.params.checkData].forEach((item) => {
 item.checked ? result.push(item) : "";
 });
 } else {
 this.vm[this.params.checkData].forEach((item) => {
 //刪除checked屬性
 let temp = {};
 (() => delete Object.assign(temp, item).checked)();
 item.checked ? result.push(item[this.params.key] || temp) : "";
 });
 }
 this.vm[this.params.result] = result
 };
 /*為原始數據的每一個對象添加一個checked屬性*/
 this.addChecked = () => {
 this.vm[this.params.checkData].forEach((item) => {
 Vue.set(item, 'checked', false)
 });
 };
 /*如果所有的列表的checked屬性都為true,則選中全選框,否則不選中全選框 */
 this.vm.$watch(this.params.checkData, (data) => {
 if(!data.length) return;
 data.every((item) => item.checked) ? this.set(true) : this.set(false);
 this.setValue()
 }, {deep: true});
 //當列表發生變化時重新綁定
 this.vm.$watch(this.params.checkData, (data) => {
 if(!data.length) return
 this.addChecked();
 });
 },
 // checkAll發生更改時 
 update(checkAll) {
 /*如果全選框被選中,則將列表的所有checked屬性轉為true,否則轉為false */
 checkAll ? this.vm[this.params.checkData].forEach((item) => {
 item.checked = true
 }) : this.vm[this.params.checkData].forEach((item) => {
 item.checked = false
 });
 this.setValue()
 },
 }

這時只需要判斷N+1次。

以上這篇Vue自定義指令實現checkbox全選功能的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Vue自定義指令實現checkbox全選功能的方法

Vue自定義指令實現checkbox全選功能的方法:最近做的一個項目需要用到Vue實現全選功能,參考了一下網上的做法,發現用屬性計算的復用性不高,于是選用自定義指令,但網上的做法大多是會對原始數據有一定的格式要求,而且沒有返回結果,于是做了改進。 上代碼: <!DOCTYPE html> <h
推薦度:
標簽: 功能 VUE 全選
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 最近中文字幕高清电影在线 | 青春草国产 | 国产真实乱人偷精品 | 国产成人精品一区二区三区… | 欧美综合亚洲 | 欧美日韩亚洲一区二区三区在线观看 | 亚洲自拍另类 | 亚洲国产成人久久一区www妖精 | 91视频国产一区 | 国产成人91一区二区三区 | 国产中文字幕在线观看 | 欧美成a人片在线观看 | 国产区免费在线观看 | 久久久国产成人精品 | 午夜香蕉视频 | 91在线 | 欧美: | 国产成人一区在线播放 | 91发布页 | 国产原创91 | 在线视频区 | 高清一区二区 | 日韩午夜在线观看 | 国产成人久久精品二区三区 | 一区二区三区成人 | 亚洲国产成人久久一区www | 国产在线欧美日韩精品一区二区 | 日韩欧美三区 | 国产精品毛片一区二区三区 | 91久久精品国产免费一区 | 国内精品久久久久久中文字幕 | 亚洲一区二区视频在线观看 | 香蕉啪啪 | 日韩欧美亚州 | 欧美日韩国产精品综合 | 久久a毛片 | 欧美成人一区二区三区在线视频 | 国产精品 日韩 | 亚洲日韩欧美视频 | 欧美日韩在线高清 | 毛片国产| 色综合91久久精品中文字幕 |