溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue之ele多級聯(lián)組件如何使用

發(fā)布時間:2022-07-16 09:31:05 來源:億速云 閱讀:196 作者:iii 欄目:開發(fā)技術(shù)

這篇“vue之ele多級聯(lián)組件如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“vue之ele多級聯(lián)組件如何使用”文章吧。

多級聯(lián)組件的使用

vue之ele多級聯(lián)組件如何使用

html

<el-cascader
        ref="cascader"
        :options="options"
        @focus="cascaderFocus"
        @change="cascaderChange"
        v-model="cascadeValue"
        :props="propsVal"
        popper-class="cascader"
></el-cascader>

js

data () {
    return {
        options : [
        {
          value: "01",
          label: "科技",
          parentValue: "0",
          children: [
            {
              value: "0101",
              label: "半導(dǎo)體",
              parentValue: "01",
              children: [
                {
                  value: "010101",
                  label: "環(huán)",
                  parentValue: "0101",
                },
              ],
            },
            {
              value: "0102",
              label: "半導(dǎo)體2",
              parentValue: "01",
              children: [
                {
                  value: "010201",
                  label: "顯1",
                  parentValue: "0102",
                },
              ],
            },
            { value: "0103", label: "產(chǎn)業(yè)", parentValue: "01" },
          ],
        },
        {value: "02", label: "業(yè)", parentValue: "0" }, // 沒有子集的時候 
        {value: "04", label: "類", parentValue: "0",children: [], }
      ],
            cascadeValue: [], //級聯(lián)選中的值
            currentIndustry:[], 
      propsVal: {
        checkStrictly: true,
      },
    };
  },
  methods: {
    cascaderFocus(){
            console.log("jiagouFocus");
    },
    cascaderChange(valArr){
     console.log("jgTreeChange", valArr);
      this.currentIndustry = valArr
    },
  }
  // 重置的時候
    reset() {
      this.$refs.cascader.checkedValue = [];
      this.$refs.cascader.dropDownVisible = false;
    },

css

.cascader .el-scrollbar{
  min-width: 120px!important;
  max-width: 100%;
}
.cascader .el-cascader-node{
  padding: 0 18px 0 0;
  height: 30px;
}
.cascader.el-cascader-node .el-cascader-node__postfix{
  right: 5px;
}
.cascader .el-cascader-node > .el-radio{
  margin-left: 7px;
}

vue 之ele多級聯(lián)組件 添加額外的按鈕

需求:

  • 第一層:集團; 第二層:板塊; 第三層:產(chǎn)業(yè)

  • 在ele多級聯(lián)組件之中,第一層的時候添加一個全部按鈕,點擊第一層的全部的時候,則直接查詢所有集團的數(shù)據(jù);

  • 在ele多級聯(lián)組件之中,第二層的時候添加一個全部按鈕,點擊第二層的全部的時候,則直接查詢所有板塊的數(shù)據(jù);

  • 點擊級聯(lián)的第三層的時候,才加載數(shù)據(jù)!

vue之ele多級聯(lián)組件如何使用

HTML

  • groupName :則是需要現(xiàn)實的 點擊了第二層的全部的時候,才顯示的!否則的話,走多級聯(lián)三層選中,顯示效果!

  • cascadeValue :級聯(lián)選中的值

  • propsVal : 級聯(lián)動態(tài)加載的配置屬性

  • selectChange : 級聯(lián)選中的時候觸發(fā)的函數(shù)

  • expandChange: 級聯(lián)展開觸發(fā)

目的:點擊級聯(lián)的時候,只是在點擊第二層的時候,獲取到第一層集團的選中的值!

<div class="top_pane_select">
  <div class="group_name" v-if="showGroupName" >{{ groupName }} / 全部</div>
  <el-cascader
    ref="cascader"
    v-model="cascadeValue"
    :props="propsVal"
    @change="selectChange"
    @expand-change="expandChange"
  ></el-cascader>
</div>

js

data() {
    return {
      propsVal: {
      // 點擊的時候 觸發(fā)
        expandTrigger: "click",
        // 完整路徑
        emitPath: true,
        // 動態(tài)加載
        lazy: true,
        // 動態(tài)加載的時候 觸發(fā)渲染dom節(jié)點
        lazyLoad: (node, resolve) => {
          this.selectLazyLoad(node, resolve);
        },
      },
      currentIndustry: [], // 當(dāng)前產(chǎn)業(yè)
      groupName:"",// 當(dāng)選中為 集團 + 第二級 全部的時候 顯示再級聯(lián)菜單
      firstHomeGroup:[], // 集團的數(shù)據(jù)
      showGroupName:false, 
      jtCode:"", // 當(dāng)前集團選中的code
      cascadeValue: [], //級聯(lián)選中的值
     }
  }
  watch: {
      // 級聯(lián)選中的值 判斷:當(dāng)選中的值 為空數(shù)組(也就是查詢所以集團的數(shù)據(jù)時候),調(diào)用級聯(lián)的重置方法!
    cascadeValue(newV) {
      if (newV.length === 0) {
        this.selectReset();
      }else{
        this.groupName = "";
      }
    },
    // 當(dāng)前選中的產(chǎn)業(yè) 傳遞到子組件的數(shù)據(jù)
    currentIndustry(newV){
      this.currentIndustry = newV;
      if(newV.length == 0){
        this.groupName = "";
        this.showGroupName = false;
      }
    }
  },
methods: {
    // 創(chuàng)建dom節(jié)點 和 刪除 dom節(jié)點
    createDom(dom){
      let li = document.createElement("li")
      li.innerHTML = "全部";
      dom.insertBefore(li, dom.children[0])
      dom.children[0].style.paddingLeft = "10px";
      dom.children[0].style.cursor = "pointer";
    },
    destroyedDom(dom){
      dom.removeChild(dom.children[0])
    },
    // 級聯(lián)選擇器 動態(tài)加載數(shù)據(jù)
    selectLazyLoad(node, resolve) {
      const { level } = node;
      if (level == 0) {
        // 請求集團的數(shù)據(jù)
        getHomeGroup().then(({ data }) => {
          this.firstHomeGroup  = data.dat;
          this.renderNode(data, level, resolve);
        });
      } else if (level == 1) {
        // 請求板塊的數(shù)據(jù)
        let groupNo = node.data ? node.data.value : null; // 拿到選中的第一級的value
        getHomePlate(groupNo).then(({ data }) => {
          this.renderNode(data, level, resolve);
        });
      } else if (level == 2) {
        // 請求產(chǎn)業(yè)的數(shù)據(jù)
        let palteNo = node.data ? node.data.value : null; // 拿到選中的第二級的value
        getHomeIndustry(palteNo).then(({ data }) => {
          this.renderNode(data, level, resolve);
        });
      }
    },
    // 渲染dom節(jié)點 就是拿到后臺請求的數(shù)據(jù)的時候,渲染dom節(jié)點
    renderNode(data, level, resolve) {
      if (data.code == 0 && data.dat.length > 0) {
        let nodes = data.dat.map((item) => {
          return {
            value: item.code,
            label: item.name,
            leaf: level >= 2,
          };
        });
        resolve(nodes);
        if( level === 0){
          this.$nextTick(() => {
            let dom = document.querySelector(".el-cascader-panel > .el-scrollbar:nth-child(1) .el-scrollbar__view")
            this.createDom(dom);
            dom.children[0].onclick = () => {
              this.jtCode = "";
              this.cascadeValue = [];
              this.currentIndustry = [];
              this.selectChange([]);
              this.$refs.cascader.dropDownVisible = false;
              this.selectReset();
            }
          })
        }
      }
    },
    // 級聯(lián)展開 只為創(chuàng)建最新的dom節(jié)點
    expandChange(item){
      // console.log('展開item',item);
      if(item.length === 1){
        this.$nextTick(() => {
          let dom = document.querySelector(".el-cascader-panel > .el-scrollbar:nth-child(2) .el-scrollbar__view");
          if(dom.children[0].innerText == "全部"){
            this.destroyedDom(dom);
            this.createDom(dom);
            this.groupClick(item);
          }else{
            this.createDom(dom);
            this.groupClick(item);
          }
        })
      }
    },
    // 點擊 集團的時候 創(chuàng)建 全部 按鈕
    groupClick(item){
      this.$nextTick(() => {
        let dom = document.querySelector(".el-cascader-panel > .el-scrollbar:nth-child(2) .el-scrollbar__view");
        if(dom.children[0]){
          dom.children[0].onclick = () => {
            this.jtCode = item[0];
            this.currentIndustry = [this.jtCode, ""];
            // this.selectChange(this.currentIndustry);
            this.firstHomeGroup.forEach(item => {
              if(item.code == this.jtCode){
                this.groupName = item.name;
                this.showGroupName = true;
              }
            })
            this.selectReset();
            this.$refs.cascader.dropDownVisible = false;
          }
        }
      })
    },
    // 級聯(lián)選中的時候 對數(shù)據(jù)的判斷!
    selectChange(item) {
      // console.log("級聯(lián)選中item", item,item.length);
      // this.currentIndustry = item[item.length - 1];
      if(item.length == 3){
        this.currentIndustry = item;
        this.showGroupName = false;
        this.groupName = "";
      } else {
        if(this.jtCode){
          this.currentIndustry = [this.jtCode,""];
        }else{
          this.currentIndustry = [];
        }
      }
    },
    // 級聯(lián)下拉菜單 重置
    selectReset() {
      const _cascader = this.$refs.cascader;
      if (_cascader) {
        _cascader.$refs.panel.checkedValue = [];
        _cascader.$refs.panel.activePath = [];
        _cascader.$refs.panel.syncActivePath();
      }
      let dom = document.querySelector(".el-cascader-panel > .el-scrollbar:nth-child(2) .el-scrollbar__view");
      if(dom){
        if(dom.children[0].innerText == "全部" && dom.children[0]){
          dom.removeChild(dom.children[0])
        }
      }
    },

},

CSS

.top_pane_select {
          position: relative;
          margin-top: 2px;
          margin-left: 115px;
          width: 240px;
          height: 24px;
          border: 1px solid #e82323;
          border-radius: 2px;
          overflow: hidden;

          ::v-deep .el-cascader {
            top: -8px !important;
            width: 240px!important;

            .el-input__inner {
              color: #e82323;
              border: none !important;
            }
          }
          // 單獨選中 集團的時候 顯示
          .group_name{
            background: #fff;
            z-index: 10;
            position: absolute;
            top: 2px;
            left: 15px;
            width: 40%;
            height: 22px;
            line-height: 22px;
            color: #e82323;
          }
}

以上就是關(guān)于“vue之ele多級聯(lián)組件如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI