最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue?element-ui?el-cascader?只能末級多選問題

 更新時間:2022年09月16日 10:14:44   作者:囍一  
這篇文章主要介紹了Vue?element-ui?el-cascader?只能末級多選問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

element-ui el-cascader只能末級多選

像這樣的需求我們直接可以用css完成

/deep/.el-cascader-panel:first-child .el-checkbox{
  display:none;
}

擴(kuò)展實現(xiàn)element-ui中el-cascader全選功能

重所周知,element-ui中的cascader中,沒有對所有子節(jié)點(diǎn)的全選功能。

近期,公司項目有一個功能是,如果點(diǎn)擊了全選,則選中所有子節(jié)點(diǎn)的功能;如果在全選狀態(tài)下,取消了任意一個節(jié)點(diǎn),則移除該節(jié)點(diǎn)和全部節(jié)點(diǎn);如果在全選狀態(tài)下,又點(diǎn)擊了全選,則完成全不選的操作,即實現(xiàn)效果如下

圖1.1: 從【選中部分節(jié)點(diǎn)】(或【所有節(jié)點(diǎn)都沒有選擇】) 到【全選】的實現(xiàn)效果

圖1.2 從【已選中全部節(jié)點(diǎn)】狀態(tài)到【取消任意一個節(jié)點(diǎn)】效果圖

圖1.3 全不選效果圖(在【全選】狀態(tài)下再次點(diǎn)擊【全選】按鈕,或挨個取消已選中節(jié)點(diǎn))

實現(xiàn)思路如下

【Ⅰ】返回數(shù)據(jù)格式

1. 如果是只有一層字節(jié)點(diǎn),他的數(shù)據(jù)返回格式應(yīng)是[節(jié)點(diǎn)1, 節(jié)點(diǎn)2, .....]

2. 如果含有多層節(jié)點(diǎn),他的數(shù)據(jù)返回格式應(yīng)該是[ [父節(jié)點(diǎn),子節(jié)點(diǎn),孫子節(jié)點(diǎn)...], [父節(jié)點(diǎn),子節(jié)點(diǎn),孫子節(jié)點(diǎn)...] ],這種數(shù)據(jù)返回格式,可以很清晰的看到各個節(jié)點(diǎn)所處的層次結(jié)構(gòu)

【2】全選實現(xiàn)方式

1. 全選狀態(tài):包含了所有節(jié)點(diǎn),因為數(shù)據(jù)結(jié)構(gòu)層次的不確定,可以大致分為兩種:

第一種,單層結(jié)構(gòu),對于全選實現(xiàn)方式很簡單,通過更改綁定的數(shù)據(jù)源,加入所有節(jié)點(diǎn)即可;

第二種,多層結(jié)構(gòu),對于這種數(shù)據(jù)結(jié)構(gòu),我們采用遞歸的方式(不確定是2層,3層.還是更多),首先我們創(chuàng)建一個臨時數(shù)據(jù),用于保存根節(jié)點(diǎn)到各個子節(jié)點(diǎn)中所有節(jié)點(diǎn)的value值,對于如圖所示的11號節(jié)點(diǎn)和8號節(jié)點(diǎn),那我們應(yīng)該保存的值為[ [1, 3, 7, 11], [1, 3, 8] ]

        

 2. 全不選狀態(tài):

  • 對于這個狀態(tài)比較簡單,將數(shù)組清空即可

3. 從全選狀態(tài)到取消任意一個節(jié)點(diǎn)狀態(tài):

  • 對于這個狀態(tài),刪除【全選】所對應(yīng)的節(jié)點(diǎn)和刪除本次要移除的節(jié)點(diǎn)即可

組件源碼奉上

<template>
  <div>
    <el-cascader
      v-model="select_options"
      ref="cascader"
      :options="options_cascader"
      :props="getProps"
      :filterable="filterable"
      @change="optionsChange"
      collapse-tags
      clearable></el-cascader>
  </div>
</template>
<script>
  import cloneDeep from "lodash/cloneDeep";
 
  export default {
    name: "myCascader",
    props: {
      options: { // 級聯(lián)選擇器選項
        type: Array,
        default: []
      },
      is_deep: { // 是否有children,即數(shù)據(jù)深度是否為多層
        type: Boolean,
        required: true
      },
      has_all_select: { // 是否為帶有全部的選項
        type: Boolean,
        required: true
      },
      all_select_flag: { // '全部'選項的標(biāo)識
        type: String | Number,
        default: ''
      },
      value: {  // 綁定的value值
        type: String,
        default: 'value'
      },
      label: { // 綁定了label值
        type: String,
        default: 'label'
      },
      filterable: { // 是否可以模糊搜索(只能選中最后一層子節(jié)點(diǎn))
        type: Boolean,
        default: false
      }
    },
    mounted() {
      this.options_cascader = cloneDeep(this.options) // 深拷貝傳過來的數(shù)據(jù)源,引用了lodash包
      if (!this.is_deep && this.has_all_select && !this.all_select_flag) {
        console.warn("當(dāng)前為單層數(shù)據(jù)且含有全部選項,請輸入全部選項標(biāo)識,默認(rèn)為'',如果全部類型的標(biāo)識為''請忽略")
      }
    },
    data() {
      return {
        options_cascader: [], // 所有選項
        select_options: [], // 以選擇的節(jié)點(diǎn)
        is_select_all: false, // 是否為全選
        deep_option_data: [] // 緩存各個深度的value
      }
    },
    computed: {
      // 獲取配置選項
      getProps() {
        return {
          multiple: true,
          expandTrigger: 'hover',
          emitPath: this.is_deep,
          value: this.value,
          label: this.label
        }
      },
    },
    methods: {
      optionsChange() {
        // 判斷已選中的節(jié)點(diǎn)中是否包含全部
        let has_all_option = false
        if (!this.is_deep) {
          has_all_option = this.select_options.includes(this.all_select_flag)
        } else {
          has_all_option = this.select_options.some(res => res.length === 1)
        }
        /**
         * 如果已選擇節(jié)點(diǎn)中包含全部,且is_select_all為true時,代表移除了選項中除全部外的某個節(jié)點(diǎn)
         * 如果已選擇節(jié)點(diǎn)中包含全部,且is_select_all為false時,代表選擇了全部節(jié)點(diǎn)
         * 如果已選擇節(jié)點(diǎn)中不包含全部,且is_select_all為true時,代表取消選擇全部節(jié)點(diǎn)
         * */
        if (has_all_option && this.is_select_all) {
          this.$refs.cascader.$refs.panel.clearCheckedNodes()
          this.select_options.splice(this.searchSelectAllNodeIndex(), 1)
          this.is_select_all = false
        } else if (has_all_option && !this.is_select_all) {
          this.is_select_all = true
          this.selectAll()
        } else if (!has_all_option && this.is_select_all) {
          this.is_select_all = false
          this.$refs.cascader.$refs.panel.clearCheckedNodes()
          this.select_options = []
        }
        this.$emit('getOptions', this.select_options)
      },
      // 查找全部節(jié)點(diǎn)所在的索引
      searchSelectAllNodeIndex() {
        if (!this.is_deep) {
          return this.select_options.indexOf(this.all_select_flag)
        } else {
          let selectAllOptionIndex = -1
          this.select_options.forEach((res, index) => {
            if (res.length === 1) {
              selectAllOptionIndex = index
            }
          })
          return selectAllOptionIndex
        }
      },
      // 選擇全部
      selectAll() {
        this.select_options = []
        if (!this.is_deep) {
          // 為單層數(shù)據(jù),即沒有children
          this.options_cascader.forEach(res => {
            this.select_options.push(res[this.value])
          })
        } else {
          // 多層數(shù)據(jù), 遞歸
          this.getDeepOptions(this.options_cascader)
        }
      },
      // 遞歸獲取深層數(shù)據(jù)
      getDeepOptions(value) {
        let arr
        value.forEach(res => {
          if (res.children) {
            // 如果不是最后一層,則緩存當(dāng)前層次的value
            this.deep_option_data.push(res[this.value])
            this.getDeepOptions(res.children)
          } else {
            // 如果是最后一層,把最后一層的value放入級聯(lián)選擇器綁定的數(shù)組
            arr = cloneDeep(this.deep_option_data)
            arr.push(res[this.value])
            this.select_options.push(arr)
          }
        })
        // 每一層循環(huán)結(jié)束后,清空本層的父節(jié)點(diǎn)
        this.deep_option_data.pop()
      }
    }
  }
</script>
 
<style scoped>
 
</style>

使用方法

// 多層結(jié)構(gòu),帶全部
<my-cascader
    :options="options"
    :is_deep="true" 
    :has_all_select="true"
     @getOptions="getOptions">
</my-cascader>
 
// 單層結(jié)構(gòu),帶全部
<my-cascader
    :options="options"
    :is_deep="false" 
    :has_all_select="true"
     @getOptions="getOptions">
</my-cascader>
 
// 注:如果不需要配置全部節(jié)點(diǎn)則直接使用element提供的cascader即可
// 本組件只考慮第一層帶有全部的情況,且全部節(jié)點(diǎn)不帶有children屬性,即只有一層,若除第一層節(jié)點(diǎn)外其他層次節(jié)點(diǎn)帶有全部選項,則勾選本層次的上一層節(jié)點(diǎn)即可

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Vue中使用alibaba的iconfont矢量圖標(biāo)的問題

    關(guān)于Vue中使用alibaba的iconfont矢量圖標(biāo)的問題

    這篇文章主要介紹了Vue使用alibaba的iconfont矢量圖標(biāo)的問題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 詳解Vue項目部署遇到的問題及解決方案

    詳解Vue項目部署遇到的問題及解決方案

    這篇文章主要介紹了詳解Vue項目部署遇到的問題及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Vue 根據(jù)條件判斷van-tab的顯示方式

    Vue 根據(jù)條件判斷van-tab的顯示方式

    這篇文章主要介紹了Vue 根據(jù)條件判斷van-tab的顯示方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Vue中封裝input組件的實例詳解

    Vue中封裝input組件的實例詳解

    這篇文章主要介紹了Vue中封裝input組件的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • vue3 reactive 請求接口數(shù)據(jù)賦值后拿不到的問題及解決方案

    vue3 reactive 請求接口數(shù)據(jù)賦值后拿不到的問題及解決方案

    這篇文章主要介紹了vue3 reactive 請求接口數(shù)據(jù)賦值后拿不到的問題及解決方案,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • vue實現(xiàn)tab欄點(diǎn)擊高亮效果

    vue實現(xiàn)tab欄點(diǎn)擊高亮效果

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)tab欄點(diǎn)擊高亮效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • vue?路由跳轉(zhuǎn)打開新窗口被瀏覽器攔截問題處理

    vue?路由跳轉(zhuǎn)打開新窗口被瀏覽器攔截問題處理

    這篇文章主要介紹了vue?路由跳轉(zhuǎn)打開新窗口被瀏覽器攔截問題處理,下面文章操作中所遇到相關(guān)問題解決的內(nèi)容介紹詳細(xì),需要的小伙伴可以參考一下
    2022-03-03
  • vue2.0的虛擬DOM渲染思路分析

    vue2.0的虛擬DOM渲染思路分析

    vue2.0采用了虛擬DOM來代替對真實DOM的操作,最后通過某種機(jī)制來完成對真實DOM的更新,渲染視圖。這篇文章主要介紹了vue2.0的虛擬DOM渲染,需要的朋友可以參考下
    2018-08-08
  • 淺析Vue自定義組件的v-model

    淺析Vue自定義組件的v-model

    這篇文章主要介紹了Vue之徹底理解自定義組件的v-model的相關(guān)知識 ,需要的朋友可以參考下的相關(guān)資料
    2017-11-11
  • Vue關(guān)于組件化開發(fā)知識點(diǎn)詳解

    Vue關(guān)于組件化開發(fā)知識點(diǎn)詳解

    在本篇文章里,小編給大家分享的是關(guān)于Vue關(guān)于組件化開發(fā)知識點(diǎn)詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-05-05

最新評論

马公市| 丹江口市| 和龙市| 富裕县| 辰溪县| 怀安县| 皮山县| 仁化县| 化隆| 甘洛县| 南皮县| 兴义市| 宁远县| 麦盖提县| 新乡县| 景谷| 缙云县| 广丰县| 东莞市| 眉山市| 呈贡县| 长宁县| 长沙市| 三门县| 阳城县| 黄平县| 南投市| 鹤山市| 平凉市| 庆城县| 浦江县| 永兴县| 师宗县| 饶河县| 寿光市| 门头沟区| 诸城市| 翁源县| 革吉县| 崇文区| 监利县|