国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)

這篇具有很好參考價(jià)值的文章主要介紹了Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

這個(gè)需求有點(diǎn)多選與單選結(jié)合的意思,同一父級(jí)下的子節(jié)點(diǎn)單選,又可以選擇多個(gè)不同父級(jí)下的節(jié)點(diǎn)。這里以兩級(jí)為例,實(shí)現(xiàn)一個(gè)在多選模式下,同一父級(jí)下最多只能選中一個(gè)子級(jí)的級(jí)聯(lián)選擇器。

1、隱藏父級(jí)節(jié)點(diǎn)處的CheckBox

多選模式下可以通過(guò)勾選父級(jí)一鍵選中所有的子級(jí),而每個(gè)父級(jí)下可能有多個(gè)子級(jí),也可能只有一個(gè),起初我想的是根據(jù)本次選擇選中的個(gè)數(shù)分類討論,但討論起來(lái)比較繁瑣,所以最后決定直接把父級(jí)的checkbox隱藏掉,不讓用戶直接勾選父級(jí),減少了很多不必要的麻煩。

.hide {
  .el-cascader-menu:first-of-type {
    .el-cascader-node {
      .el-checkbox {
        display: none;
      }
    }
  }
}

這里需要注意的一點(diǎn)是hide類名必須使用級(jí)聯(lián)選擇器中的popper-class來(lái)添加自定義浮層類名的。

Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)

?2、對(duì)選中的項(xiàng)進(jìn)行篩選限制,先找到本次新增的項(xiàng),和新增前的值進(jìn)行對(duì)比,看是否存在與本次新增的項(xiàng)同屬于一個(gè)父級(jí)的,如果存在則刪除之前已經(jīng)存在的那一項(xiàng),留下本次新增的。

這里的解決花費(fèi)了我很多時(shí)間,因?yàn)橐婚_(kāi)始想著直接操作級(jí)聯(lián)選擇器綁定值,刪除掉不要的那一項(xiàng)就可以了,但問(wèn)題出現(xiàn)了。綁定的值確實(shí)達(dá)到了我想要的效果(即刪除之前已經(jīng)存在的那一項(xiàng),留下本次新增的),但級(jí)聯(lián)面板中右側(cè)的部分(即子節(jié)點(diǎn)部分),會(huì)自動(dòng)刷新跳轉(zhuǎn)到第一個(gè)父級(jí)下的子級(jí)面板,用戶體驗(yàn)差,嘗試解決,沒(méi)解決掉。。。

最后,選擇從另外一個(gè)角度來(lái)實(shí)現(xiàn),如果存在與本次新增的項(xiàng)同屬于一個(gè)父級(jí)的,則直接通過(guò)js觸發(fā)點(diǎn)擊事件,取消勾選之前已經(jīng)存在的那一項(xiàng)。

有了思路以后就可以一步一步來(lái)實(shí)現(xiàn)了。

首先找到本次新增的這一項(xiàng),由于組件庫(kù)文檔中級(jí)聯(lián)選擇器這一塊并沒(méi)有提供相關(guān)的辦法獲取到最新選擇的一項(xiàng),只能拿到已選擇的所有值,并且級(jí)聯(lián)選擇器新增的項(xiàng)并不是直接push到綁定值的末尾,而是按選項(xiàng)值在頁(yè)面上展示的順序添加的,所以只能手動(dòng)去對(duì)比查找,需要定義一個(gè)preValue數(shù)組來(lái)存儲(chǔ)上一次的值。

let newIndex;
let i = 0, j = 0;
while (i < val.length && j < this.preValue.length) {
  if (val[i][0] === this.preValue[j][0] && val[i][1] === this.preValue[j][1]) {
    i++;
    j++;
  } else {
    //添加在中間的情況
    newIndex = i;
    break;
  }
}
//添加在末尾的情況
if (j === this.preValue.length) {
  newIndex = i;
}

找到新增項(xiàng)后,再去對(duì)比在此之前是否添加過(guò)于新增項(xiàng)同一父級(jí)下的其他子級(jí)。

let delIndex = val.findIndex((item, index) => index !== newIndex && item[0] === val[newIndex][0]);

如果存在的話,接下來(lái)就需要去觸發(fā)相應(yīng)的點(diǎn)擊事件取消這一項(xiàng)的勾選。

我們先來(lái)觀察一下html結(jié)構(gòu),右側(cè)面板下的各個(gè)li標(biāo)簽的id值其實(shí)就是右側(cè)面板id值加上:'-'+index,因此我們只需要拿到右側(cè)面板id值就能知道對(duì)應(yīng)選項(xiàng)的id值,再觸發(fā)li標(biāo)簽的孩子標(biāo)簽中的checkbox的點(diǎn)擊事件就可以了。

Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)

?右側(cè)面板id通過(guò)級(jí)聯(lián)選擇器的引用可以拿到,另外需要求得取消勾選選項(xiàng)的index,通過(guò)與級(jí)聯(lián)選擇器選項(xiàng)值對(duì)比得到。

let cancelIndex;
for (let i = 0; i < this.options.length; i++) {
  if (this.options[i].value === val[delIndex][0]) {
    for (let j = 0; j < this.options[i].children.length; j++) {
      if (this.options[i].children[j].value === val[delIndex][1]) {
        cancelIndex = j;
        break;
      }
    }
    break;
  }
}

獲取id值。

this.$nextTick(() => {
    let panelId = this.$refs.cascade.panel.$refs.menu[1].$el.id;  //其中menu[1]表示右側(cè)的面板 menu[0]即為左側(cè)的面板
    let liId = document.getElementById(panelId + '-' + cancelIndex);
    liId.children[0].click();
  })

到這里就基本完成了這個(gè)需求,其實(shí)不難,但因?yàn)橐婚_(kāi)始自己的思路(直接刪值)實(shí)現(xiàn)起來(lái)出現(xiàn)了問(wèn)題,想著去解決花費(fèi)了很多時(shí)間,也沒(méi)解決掉,最后和同事討論換一種思路很快就實(shí)現(xiàn)了,所以思路變通是非常重要的~

3、完整代碼

<template>
  <div class='test'>
    <el-cascader
      class='cascader'
      :options='options'
      :props='props'
      clearable
      :popper-class="'hide'"
      @change='handleChange'
      ref='cascade'
    ></el-cascader>
  </div>
</template>

<script>
export default {
  name: 'Cascader',
  data() {
    return {
      props: { multiple: true, expandTrigger: 'click' },
      options: [{
        value: 1,
        label: '杭州',
        children: [{
          value: 3,
          label: '西湖'
        }, {
          value: 4,
          label: '錢塘'
        }, {
          value: 7,
          label: '上城'
        }]
      }, {
        value: 2,
        label: '成都',
        children: [{
          value: 5,
          label: '青羊'
        }, {
          value: 6,
          label: '武侯'
        }]
      }],
      preValue:[]
    }
  },
  methods:{
    handleChange(val){
      if (this.preValue.length > 0 && val.length > this.preValue.length) {
        let newIndex;
        let i = 0, j = 0;
        while (i < val.length && j < this.preValue.length) {
          if (val[i][0] === this.preValue[j][0] && val[i][1] === this.preValue[j][1]) {
            i++;
            j++;
          } else {
            //添加在中間的情況
            newIndex = i;
            break;
          }
        }
        //添加在末尾的情況
        if (j === this.preValue.length) {
          newIndex = i;
        }

        let delIndex = val.findIndex((item, index) => index !== newIndex && item[0] === val[newIndex][0]);
        if (delIndex >= 0) {
          // 取消選擇的節(jié)點(diǎn)
          let cancelIndex;
          for (let i = 0; i < this.options.length; i++) {
            if (this.options[i].value === val[delIndex][0]) {
              for (let j = 0; j < this.options[i].children.length; j++) {
                if (this.options[i].children[j].value === val[delIndex][1]) {
                  cancelIndex = j;
                  break;
                }
              }
              break;
            }
          }
          this.$nextTick(() => {
            let panelId = this.$refs.cascade.panel.$refs.menu[1].$el.id;  //其中menu[1]表示右側(cè)的面板 menu[0]即為左側(cè)的面板
            let liId = document.getElementById(panelId + '-' + cancelIndex);
            liId.children[0].click();
          })
          val[delIndex] = '';
          val = val.filter(item => item !== '');
        }
      }
      this.preValue = val;
    }
  }
};
</script>

<style lang='less'>
.test {
  text-align: center;
  margin-top: 200px;

  .title {
    display: block;
    margin-bottom: 20px;
  }

  .cascader {
    .el-input__inner {
      width: 362px;
    }

    .el-cascader__tags {
      display: flex;
      flex-wrap: nowrap;
      overflow-y: overlay;
      margin-left: 2px;
    }

    .el-cascader__tags::-webkit-scrollbar {
      width: 0;
      height: 3px;
    }

    /*定義滾動(dòng)條軌道 內(nèi)陰影+圓角*/

    .el-cascader__tags::-webkit-scrollbar-track {
      background-color: rgba(186, 203, 227, 0.3);
    }

    /*定義滑塊 內(nèi)陰影+圓角*/

    .el-cascader__tags::-webkit-scrollbar-thumb {
      background-color: #B3C2D7;
    }
  }
}

.hide {
  .el-cascader-menu:first-of-type {
    .el-cascader-node {
      .el-checkbox {
        display: none;
      }
    }
  }
}
</style>

如果大家有更好的解決辦法或優(yōu)化,歡迎評(píng)論區(qū)討論~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-428506.html

到了這里,關(guān)于Element UI級(jí)聯(lián)選擇器 多選模式下,實(shí)現(xiàn)同一父級(jí)下最多只能選中一個(gè)子級(jí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • element ui 中 Cascader 級(jí)聯(lián)選擇器實(shí)現(xiàn) 動(dòng)態(tài)加載 動(dòng)態(tài)禁用 入門

    element ui 中 Cascader 級(jí)聯(lián)選擇器實(shí)現(xiàn) 動(dòng)態(tài)加載 動(dòng)態(tài)禁用 入門

    實(shí)現(xiàn)效果 當(dāng)點(diǎn)擊的 根選項(xiàng) 有 子選項(xiàng) 時(shí),會(huì)向后臺(tái)發(fā)送請(qǐng)求,并且接收數(shù)據(jù)實(shí)現(xiàn)動(dòng)態(tài)加載。 點(diǎn)擊特殊選項(xiàng)時(shí),可以禁用其他選項(xiàng)。 相關(guān)代碼 props prop handleClassOrStudentChange

    2024年02月11日
    瀏覽(22)
  • element ui級(jí)聯(lián)選擇器數(shù)據(jù)處理

    后端同事返回的級(jí)聯(lián)選擇器數(shù)據(jù)的children是 childrens ,而組件渲染只識(shí)別children,所以需要props自定義傳入,代碼如下 因?yàn)楹蠖送伦詈笠粚訉?duì)象也返回了children,但是數(shù)據(jù)是空,這時(shí)候級(jí)聯(lián)的最后一層就沒(méi)法選擇,所以需要將最后一層對(duì)象的children設(shè)置為undefine,這樣子就可以選

    2024年02月09日
    瀏覽(17)
  • element ui cascader級(jí)聯(lián)選擇器 動(dòng)態(tài)加載以及回顯

    當(dāng)數(shù)據(jù)比較多的時(shí)候,一次性獲取全部數(shù)據(jù)速度太慢,而且體驗(yàn)不太好,所有需要用到懶加載,一級(jí)一級(jí)的選擇數(shù)據(jù)就能很好避免速度慢的問(wèn)題。 以及我們使用el-cascader加載默認(rèn)值的時(shí)候,cascader的輸入框和聯(lián)級(jí)選擇框都會(huì)遇到的回顯問(wèn)題??创a!!! 參數(shù)說(shuō)明: value / v-model 選中

    2024年02月15日
    瀏覽(27)
  • ElementPlus el-cascader級(jí)聯(lián)選擇器 實(shí)現(xiàn)一級(jí)菜單單選,二級(jí)菜單多選

    ElementPlus el-cascader級(jí)聯(lián)選擇器 實(shí)現(xiàn)一級(jí)菜單單選,二級(jí)菜單多選

    需求: 利用el-cascader級(jí)聯(lián)實(shí)現(xiàn)一級(jí)菜單單選,二級(jí)菜單多選的功能,如下圖所示: 思路: 使用了多選multiply屬性,這個(gè)屬性下,選中的數(shù)據(jù)結(jié)構(gòu)為:一級(jí)為length1的數(shù)組,二級(jí)為length2的數(shù)組。利用標(biāo)識(shí)符,把最后選中的一級(jí)菜單的值與標(biāo)識(shí)符做對(duì)比,如不同,則讓標(biāo)識(shí)符的值

    2024年02月11日
    瀏覽(29)
  • vue中使用element-ui ,設(shè)置級(jí)聯(lián)選擇器高度問(wèn)題

    我本來(lái)以為設(shè)置elemnt-ui組件樣式需要用到深度選擇器,然后找了好多關(guān)于深度選擇器的,比如 /deep/ ::v-deep 后來(lái)才明白是權(quán)重不夠,解決方法如下 1、在全局css中設(shè)置 缺點(diǎn):所有級(jí)聯(lián)選擇器的高度都是固定的 結(jié)論:只有在所有頁(yè)面級(jí)聯(lián)選擇器都一致的情況下或者只有一個(gè)級(jí)聯(lián)

    2024年02月12日
    瀏覽(26)
  • element UI級(jí)聯(lián)選擇器---動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)控制二級(jí)面板的顯示與隱藏

    element UI級(jí)聯(lián)選擇器---動(dòng)態(tài)加載數(shù)據(jù),動(dòng)態(tài)控制二級(jí)面板的顯示與隱藏

    ?一級(jí)數(shù)據(jù)列表是在頁(yè)面初始化的時(shí)候調(diào)用接口返回的數(shù)據(jù); 二級(jí)數(shù)據(jù)列表需要在獲取到一級(jí)數(shù)據(jù)id的時(shí)候調(diào)用接口得到數(shù)據(jù)進(jìn)行列表渲染; 問(wèn)題: 使用了el-cascader后發(fā)現(xiàn)如果第一次點(diǎn)擊父級(jí)A獲取到二級(jí)數(shù)據(jù),并且二級(jí)面板顯示,第二次點(diǎn)擊父級(jí)B獲取到二級(jí)數(shù)據(jù)為[ ],此時(shí)

    2024年02月08日
    瀏覽(21)
  • element ui中select多選框change選擇獲取選項(xiàng)的所有字段信息

    ? ? ? ? 在 Element UI 的 Select 組件中, 多選框 的選擇變化( change )事件可以通過(guò)監(jiān)聽(tīng) change 事件來(lái)獲取選項(xiàng)的所有字段信息。 ? ? ? ? 當(dāng)多選框選項(xiàng)發(fā)生改變時(shí),會(huì)觸發(fā) change 事件,此時(shí)可以通過(guò)該事件的回調(diào)函數(shù)來(lái)獲取選中的選項(xiàng)的所有字段信息。 示例: html代碼: dat

    2024年02月06日
    瀏覽(26)
  • vue element UI el-cascader 級(jí)聯(lián)選擇器 獲取當(dāng)前選擇值的整個(gè)對(duì)象

    vue element UI el-cascader 級(jí)聯(lián)選擇器 獲取當(dāng)前選擇值的整個(gè)對(duì)象

    要使用到cascader組件選中的數(shù)據(jù)的所有部分,并沒(méi)有類似于select組件中的value可以指定,查看官方文檔提供了新的方法,官方地址https://element.eleme.cn/#/zh-CN/component/cascader html部分 可以正常獲取到該節(jié)點(diǎn)的全部數(shù)據(jù),如下圖所示: 如有問(wèn)題請(qǐng)聯(lián)系我~ 歡迎加入QQ群:

    2024年02月15日
    瀏覽(28)
  • element-ui cascader級(jí)聯(lián)選擇器,獲取對(duì)象Object(getCheckedNodes()、currentLabels)

    element-ui cascader級(jí)聯(lián)選擇器,獲取對(duì)象Object(getCheckedNodes()、currentLabels)

    element-ui中的cascader級(jí)聯(lián)選擇器,官網(wǎng)文檔中并沒(méi)有提供方法直接獲取當(dāng)前選擇的Object,這里特別需要注意element-ui的版本問(wèn)題,不同的版本需要用到不同的方法。 可以用this.$refs[‘cascader’].currentLabels獲取選中節(jié)點(diǎn)。 //獲取節(jié)點(diǎn)label內(nèi)容 因?yàn)榘惭b的element-ui版本高于2.7.0版本,所

    2024年02月16日
    瀏覽(52)
  • element ui 層級(jí)選擇器el-cascader只能選最后一級(jí)多選

    element ui 層級(jí)選擇器el-cascader只能選最后一級(jí)多選

    在element ui 中el-cascader多選: 每個(gè)層級(jí)都可以選擇,但并不是我需要的,我需要多選只能選最后一級(jí),在網(wǎng)上找了很久都復(fù)雜的,最終自己選擇用css樣式對(duì)checkbox進(jìn)行隱藏。 實(shí)現(xiàn)方法: 在css 中加入 關(guān)鍵點(diǎn)在于利用屬性選擇器,遇到屬性是 aria-haspopup (表示點(diǎn)擊的時(shí)候是否會(huì)

    2024年02月11日
    瀏覽(20)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包