中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

VUE?el-tree組件左邊勾選右邊清除交互問題怎么解決

發布時間:2023-04-24 16:21:55 來源:億速云 閱讀:117 作者:iii 欄目:開發技術

這篇文章主要介紹“VUE el-tree組件左邊勾選右邊清除交互問題怎么解決”,在日常操作中,相信很多人在VUE el-tree組件左邊勾選右邊清除交互問題怎么解決問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”VUE el-tree組件左邊勾選右邊清除交互問題怎么解決”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    el-tree組件左邊勾選,右邊清除交互

    需求

    使用el-tree組件,左邊可以勾選節點,右邊展示已經勾選的節點。

    效果

    VUE?el-tree組件左邊勾選右邊清除交互問題怎么解決

    代碼實現

    <template>
      <div class="treeWrapper">
        <div class="leftView">
          <el-input placeholder="請輸入內容" v-if="relationTree.length" v-model="filterTreeName" @change="filterChange"/>
          <el-checkbox v-if="relationTree.length" class="select-box" v-model="menuNodeAll"
                       @change="handleCheckedTreeNodeAll($event)">全選
          </el-checkbox>
          <el-tree :data="relationTree" show-checkbox node-key="id" ref="tree" :props="defaultProps" @check="hanldTreeCheck"
                   default-expand-all :filter-node-method="filterNode" :default-checked-keys="checkedKeys">
          </el-tree>
        </div>
        <div class="rightView">
          <header>
            <span>已選擇 {{ checkList.length }} 個</span>
            <span @click="removeRightTreeAll">全部清除</span>
          </header>
          <div class="checkedItem" v-if="checkList.length">
            <li v-for="(m, i) in checkList" :class="['align-center','justify-between',m.checkFlag ? 'mark':'']" :key="i">
              <p>{{ m.name }}</p>
              <svg-icon icon-class="deleteTreeItem" @click="tagClose(m, i)"/>
            </li>
          </div>
          <div class="right-nodata f_c_m" v-else>暫無數據</div>
        </div>
      </div>
    </template>
    <script>
    export default {
      name: "baseTree",
      props: {
        relationTree: {
          type: Array,
          default: () => [],
        },
        checkedKeys: {
          type: Array,
          default: () => [],
        },
      },
      data() {
        return {
          filterTreeName: "",
          menuNodeAll: false,
          defaultProps: {
            children: "relationResps",
            label: "name",
          },
          // 選中機器人
          checkList: [],
          checkDataList: [],
        };
      },
      mounted() {},
     
      methods: {
        filterNode(value, data) {
          if (!value) {
            return true;
          }
          return data.name.includes(value);
        },
        // 過濾
        filterChange() {
          this.$refs.tree.filter(this.filterTreeName);
        },
        // 全部清除
        removeRightTreeAll() {
          this.checkList = [];
          if (this.menuNodeAll) {
            this.menuNodeAll = !this.menuNodeAll;
          }
          const parentCheckedLength = this.$refs.tree.getCheckedKeys().length;
          if (parentCheckedLength !== 0) {
            this.$refs.tree.setCheckedNodes([]);
          }
          this.checkDataList = [];
          this.$emit("treeclick", this.checkDataList);
        },
        // 全選
        handleCheckedTreeNodeAll(data) {
          if (this.menuNodeAll) {
            //如果是當前值是全選,依次遍歷節點設置勾選,同時過濾的disabled為true的
            // 深度遍歷
            let stack = [...this.relationTree],
              node;
            while ((node = stack.shift())) {
              console.log(node.id);
              this.$refs.tree.setChecked(node.id, true, true);
              // 如果有子元素的話進行壓棧操作
              if (node.children) stack.unshift(...node.children);
              this.checkList = this.$refs.tree.getCheckedNodes(true, false);
              this.hanldTreeCheck(this.$refs.tree.getCheckedNodes(this.checkList));
            }
          } else {
            //當前值不是全選,設置勾選列表為空
            this.$refs.tree.setCheckedKeys([]);
            this.checkList = [];
            this.$emit("treeclick", this.checkList);
          }
        },
        // 當tree 復選框被點擊的時候觸發
        hanldTreeCheck(data) {
          const childNodeList = this.$refs.tree.getCheckedNodes(true, false);
          this.checkList = childNodeList;
          this.checkDataList =
            (childNodeList.length &&
              childNodeList.map((instance) => {
                // 機器人
                const {
                  id: equipmentId,
                  name: equipmentName,
                  parentId: instanceParentId,
                  checkFlag: checkFlag,
                } = instance;
                // 門店
                const {
                  id: storeId,
                  name: storeName,
                  parentId: instanceStoreParentId,
                } = this.$refs.tree.getNode(instanceParentId).data;
                // 公司
                const {id: companyId, name: companyName} =
                  this.$refs.tree.getNode(instanceStoreParentId).data;
                return {
                  storeId,
                  storeName,
                  equipmentId,
                  equipmentName,
                  companyId,
                  companyName,
                  checkFlag,
                };
              })) ||
            [];
          this.$emit("treeclick", this.checkDataList);
        },
     
        // 右側組件點擊“關閉”按鈕觸發
        tagClose(item, index) {
          // 在已選中項的下標中刪除
          this.checkList.splice(index, 1);
          if (this.checkDataList.length) {
            this.checkDataList.splice(index, 1);
            this.$emit("treeclick", this.checkDataList);
          }
          // 在tree樹控件中更改選中狀態.
          //setChecked  接收三個參數,1. 勾選節點的 key 或者 data 2. boolean 類型,節點是否選中 3. boolean 類型,是否設置子節點 ,默認為 false
          this.$refs.tree.setChecked(item.id, false, true);
          // 重新計算已選中樹形節點
          this.hanldTreeCheck();
        },
      },
    };
    </script>
    <style lang="scss" scoped>
    .treeWrapper {
      overflow: hidden;
      display: grid;
      grid-template-columns: 50% 50%;
      grid-auto-rows: 336px;
      margin: 10px auto;
      width: 100%;
      /* height: 336px; */
      border-radius: 6px;
      border: 1px solid #dbdbdb;
     
      .leftView {
        display: flex;
        flex-direction: column;
        /* width: 100%; */
        .el-tree {
          height: 100%;
        }
     
        .select-box {
          display: flex;
          justify-content: space-between;
          flex-direction: row-reverse;
          margin-top: 10px;
          padding: 0 18px 0 10px;
     
          .el-checkbox__label {
            font-size: 10px;
            font-weight: bold;
            color: #222222;
          }
        }
     
        .el-input {
          margin: 10px auto 0;
          width: 85% !important;
        }
     
        .el-tree {
          border: none !important;
          /* height: 100%; */
          overflow: overlay;
     
          .el-tree-node__content {
            padding-right: 10px !important;
     
            .el-checkbox {
              order: 2;
              flex: 1;
              text-align: right;
            }
     
            .custom-tree-node {
              order: 1;
     
              > span {
                display: block;
                max-width: 120px;
                overflow: hidden;
                text-overflow: ellipsis;
                white-space: nowrap;
              }
            }
          }
     
          > .el-tree-node > .el-tree-node__content {
            padding-left: 10px !important;
          }
        }
      }
     
      .rightView {
        /* flex-basis: 50%; */
        position: relative;
        display: flex;
        flex-direction: column;
        padding: 0 0 0 18px;
        /* width: 100%; */
        border-left: 1px solid #dbdbdb;
     
        > header {
          display: flex;
          justify-content: space-between;
          margin: 16px 0 12px 0;
          padding-right: 10px;
          font-size: 10px;
     
          > span:nth-child(1) {
            color: #222222;
          }
     
          > span:nth-child(2) {
            color: #592c82;
            cursor: pointer;
          }
        }
     
        .checkedItem {
          height: 100%;
          overflow: overlay;
     
          > li {
            height: 26px;
            margin-right: 18px;
          }
     
          .mark {
            color: red;
          }
        }
      }
     
      .right-nodata {
        color: #909399;
        position: absolute;
        left: 50%;
        top: 60%;
        transform: translate(-50%, -50%);
      }
    }
    </style>

    vue el-tree延時過濾

    最近做了一個項目,把SQL服務器,數據庫,表的結構呈現在el-tree內,以便作數據表和字段的描述維護。

    VUE?el-tree組件左邊勾選右邊清除交互問題怎么解決

    el-tree獲取數據庫數據,前端呈現分層后,如何快速的找出一個節點,根據餓了么官方文檔,el-tree有一個過濾的功能。 :filter-node-method=”filterNode”。

    但是此功能在input輸入框每次輸入一個字符就會立即過濾整個樹形結構,導致需要過濾的字符還沒有輸入完畢,el-tree已經過濾了很多遍,造成卡頓的現象。

    比如要在樹形結構中過濾包含字符為“Test”的節點,輸入T后el-tree就會立即過濾包含T的數據,輸入e后第二次過濾包含Te的數據,輸入Tes后第三次過濾包含Tes的數據,輸入完Test后是第四次過濾。

    為此,需要在input輸入過濾的同時,在watch內增加延時功能。

    <div class="treeheight" >
              <el-input :placeholder="this.$t('SQLTreemanage.filterboxdefault')" v-model="filterText"></el-input>
                <el-tree
                   :props="props1"
                   :load="loadNode1"
                   @node-click="handlenodeclick"
                   :lazy="true"
                   :filter-node-method="filterNode"
                   :render-content="renderContent"
                   ref="tree2"
                   :expand-on-click-node="false"
                   >
                </el-tree>
            </div>
      const debounce = (function () {
        let timer = 0
        return function (func, delay) {
          clearTimeout(timer)
          timer = setTimeout(func, delay)
        }
      })()
      export default {
        data () {
          filterText: ''
        }
      }
          watch: {
          filterText (val) {
            debounce(() => {
              this.$refs.tree2.filter(val)
              }, 1000);
          }

    通過延時過濾的功能,在input輸入字符后,可在設置的延時時間1000(1秒)后進行過濾,減少了整個el-tree過濾的次數。

    到此,關于“VUE el-tree組件左邊勾選右邊清除交互問題怎么解決”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    册亨县| 合川市| 台北市| 阜阳市| 万载县| 郓城县| 大安市| 深圳市| 林口县| 肃北| 万年县| 丰台区| 高州市| 土默特左旗| 南召县| 三明市| 怀集县| 黔东| 鸡东县| 温州市| 博兴县| 延长县| 华池县| 开鲁县| 大名县| 黑河市| 新宾| 马边| 定兴县| 仁布县| 孙吴县| 伊通| 滁州市| 简阳市| 济阳县| 太原市| 独山县| 刚察县| 永兴县| 都匀市| 西乌珠穆沁旗|