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

vue如何實(shí)現(xiàn)級(jí)聯(lián)選擇器功能

 更新時(shí)間:2024年04月24日 17:07:05   作者:清音啊  
這篇文章主要介紹了vue如何實(shí)現(xiàn)級(jí)聯(lián)選擇器功能問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue實(shí)現(xiàn)級(jí)聯(lián)選擇器功能

vue開(kāi)發(fā)中,通過(guò)使用 Element UI 的 el-cascader 組件來(lái)實(shí)現(xiàn)級(jí)聯(lián)選擇器功能

下面是一個(gè)示例代碼:

演示如何使用 el-cascader 組件初始化級(jí)聯(lián)選擇器,并設(shè)置默認(rèn)值為單位 測(cè)試1 和部門(mén) 測(cè)試11

<template>
  <div>
    <el-cascader
      v-model="selectedValues"
      :options="options"
      :props="props"
      @change="handleChange"
      placeholder="請(qǐng)選擇"
    ></el-cascader>
  </div>
</template>
<script>
export default {
  data() {
    return {
      // 初始化級(jí)聯(lián)選擇器的選中值
      selectedValues: [],
      // 級(jí)聯(lián)選擇器的數(shù)據(jù)源
      options: [
        {
          value: '1',
          label: '測(cè)試1',
          children: [
            { value: '2', label: '測(cè)試11' },
            { value: '3', label: '測(cè)試12' }
          ]
        }
      ],
      // 自定義配置,用于指定數(shù)據(jù)結(jié)構(gòu)中的屬性名
      props: {
        value: 'value',
        label: 'label',
        children: 'children'
      }
    };
  },
  methods: {
    // 監(jiān)聽(tīng)級(jí)聯(lián)選擇器值變化事件
    handleChange(selectedValues) {
      console.log('選中的值:', selectedValues);
    }
  },
  created() {
    // 設(shè)置初始化選中值為單位 '測(cè)試1' 和部門(mén) '測(cè)試12'
    this.selectedValues = ['1', '3'];
  }
};
</script>

在這個(gè)示例中:

options 數(shù)組包含了級(jí)聯(lián)選擇器的數(shù)據(jù)源,其中每個(gè)對(duì)象表示一個(gè)選項(xiàng),包括 value、labelchildren 屬性。

props 對(duì)象用于指定數(shù)據(jù)結(jié)構(gòu)中的屬性名,以便 el-cascader 組件正確地解析數(shù)據(jù)。

通過(guò)在 selectedValues 中設(shè)置初始選中值為單位 測(cè)試1 和部門(mén) 測(cè)試12,并將其綁定到 el-cascader 組件的 v-model 上,可以在初始化時(shí)選中指定的值。

vue級(jí)聯(lián)選擇器只傳最后一級(jí)

elementUI的級(jí)聯(lián)選擇器的v-modle接受的參數(shù)是一個(gè)數(shù)組,數(shù)組中的值是對(duì)應(yīng)樹(shù)形數(shù)組的節(jié)點(diǎn)值,但是在真實(shí)開(kāi)發(fā)中后端可能只給返回了某一處單一節(jié)點(diǎn),對(duì)el-cascader進(jìn)行2次封裝實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)

import arrayTreeFilter from 'array-tree-filter'

/*
* 雙層遞歸逆向查找某一節(jié)點(diǎn)的所有父級(jí)
* */
const findPatentValue = (array, value, valueName = 'value', childrenName = 'children') => {
  if (!value || !Array.isArray(array)) return []
  const result = []
  let valid = false
  const seek = (array, value) => {
    let parentValue = ''
    const up = (array, value, lastValue) => {
      array.forEach(v => {
        const val = v[valueName]
        const child = v[childrenName]
        if (val === value) {
          valid = true
          parentValue = lastValue
          return
        }
        if (child && child.length) up(child, value, val)
      })
    }
    up(array, value)
    if (parentValue) {
      result.unshift(parentValue)
      seek(array, parentValue)
    }
  }
  seek(array, value)
  return valid ? [...result, value] : []
}

/*
* 該組件主要是通過(guò)后端傳入的節(jié)點(diǎn)值來(lái)實(shí)現(xiàn)級(jí)聯(lián)的雙向數(shù)據(jù)綁定
* */
export default {
  model: {
    prop: 'value',
    event: 'change'
  },
  props: {
    value: {
      type: String,
      default: ''
    },
    options: {
      type: Array,
      default() {
        return []
      }
    },
    config: {
      type: Object,
      default() {
        return {
          value: 'value',
          label: 'label',
          children: 'children'
        }
      }
    }
  },
  data() {
    return {
      result: []
    }
  },
  watch: {
    value() {
      this.setResult()
    },
    options() {
      this.setResult()
    }
  },
  mounted() {
    this.setResult()
  },
  methods: {
    setResult() {
      const {config, options, value} = this
      const {value: valueName, children: childrenName} = config
      this.result = findPatentValue(options, value, valueName, childrenName)
      console.log(this.result)
    },
    /*
    * 當(dāng)級(jí)聯(lián)選擇器變化時(shí)候會(huì)觸發(fā)該事件
    * 向父級(jí)傳遞change事件來(lái)返回選中的節(jié)點(diǎn)id
    * 向父級(jí)傳遞realChange事件來(lái)返回選中的節(jié)點(diǎn)及其所有父節(jié)點(diǎn)和選中的所有l(wèi)abel的值
    * arrayTreeFilter 第三方庫(kù)用于篩查出選中的節(jié)點(diǎn)及其父節(jié)點(diǎn)
    * */
    areaChange(v = []) {
      this.result = v
      const value = v[v.length - 1] || ''
      this.$emit('change', value)
      const {options, config} = this
      const {value: valueName, label: labelName} = config
      const areas = arrayTreeFilter(options, (item, level) => item[valueName] === v[level])
        .map(o => o[labelName])
      this.$emit('realChange', v, areas)
    },
  },
  render(createElement) {
    const {areaChange, config, result} = this
    const {value, label} = config
    return createElement('el-cascader', {
      props: {
        options: this.options,
        value: result,
        size: 'small',
        clearable: true,
        placeholder: '請(qǐng)選擇',
        props: {
          value,
          label,
          checkStrictly: true
        }
      },
      on: {
        change: areaChange
      }
    })
  }
}


<ChoiceArea v-model="memberForm.regionCode" :options="areaOptions"
                          :config="{value: 'code', label: 'name', children: 'children'}"
                          @realChange="choiceAreaChange"
  
              />

總結(jié)

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

相關(guān)文章

  • 手寫(xiě)vue無(wú)限滾動(dòng)指令的詳細(xì)過(guò)程

    手寫(xiě)vue無(wú)限滾動(dòng)指令的詳細(xì)過(guò)程

    今天在移動(dòng)端項(xiàng)目中遇見(jiàn)一個(gè)需求,需要數(shù)據(jù)無(wú)限滾動(dòng),所以下面這篇文章主要給大家介紹了關(guān)于手寫(xiě)vue無(wú)限滾動(dòng)指令的詳細(xì)過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • vue-router跳轉(zhuǎn)頁(yè)面的方法

    vue-router跳轉(zhuǎn)頁(yè)面的方法

    本篇文章主要介紹了vue-router跳轉(zhuǎn)頁(yè)面的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 詳解vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案

    詳解vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案

    這篇文章主要介紹了vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Vue組件基礎(chǔ)操作介紹

    Vue組件基礎(chǔ)操作介紹

    這篇文章主要介紹了Vue組件基礎(chǔ)操作,組件是vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無(wú)法相互進(jìn)行直接的引用
    2023-01-01
  • vue3中引入svg矢量圖的實(shí)現(xiàn)示例

    vue3中引入svg矢量圖的實(shí)現(xiàn)示例

    在項(xiàng)目開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)用到svg矢量圖,本文主要介紹了vue3中引入svg矢量圖的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • vue使用import.meta.glob動(dòng)態(tài)導(dǎo)入多個(gè)模塊方式

    vue使用import.meta.glob動(dòng)態(tài)導(dǎo)入多個(gè)模塊方式

    文章介紹了Vite提供的`import.meta.glob`功能,用于動(dòng)態(tài)導(dǎo)入多個(gè)模塊,它通過(guò)glob模式匹配文件,返回一個(gè)對(duì)象,鍵為文件路徑,值為返回Promise的動(dòng)態(tài)導(dǎo)入函數(shù),支持eager模式直接導(dǎo)入和as選項(xiàng)指定導(dǎo)入方式,如原始字符串或文件URL,適用于Vite或Rollup項(xiàng)目
    2025-10-10
  • ESLint 是如何檢查 .vue 文件的

    ESLint 是如何檢查 .vue 文件的

    這篇文章主要介紹了ESLint 是如何檢查 .vue 文件的,幫助大家更好的理解和使用ESLINT,感興趣的朋友可以了解下
    2020-11-11
  • vue 自定義組件的寫(xiě)法與用法詳解

    vue 自定義組件的寫(xiě)法與用法詳解

    這篇文章主要介紹了vue 自定義組件的寫(xiě)法與用法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2020-03-03
  • 解決vant框架做H5時(shí)踩過(guò)的坑(下拉刷新、上拉加載等)

    解決vant框架做H5時(shí)踩過(guò)的坑(下拉刷新、上拉加載等)

    這篇文章主要介紹了解決vant框架做H5時(shí)踩過(guò)的坑(下拉刷新、上拉加載等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • element的el-table中記錄滾動(dòng)條位置的示例代碼

    element的el-table中記錄滾動(dòng)條位置的示例代碼

    這篇文章主要介紹了element的el-table中記錄滾動(dòng)條位置的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論

武隆县| 汪清县| 澜沧| 双峰县| 泰州市| 出国| 合山市| 军事| 二连浩特市| 方正县| 旺苍县| 广元市| 共和县| 会宁县| 瑞金市| 封开县| 广平县| 怀仁县| 滦平县| 张家川| 上蔡县| 丘北县| 青阳县| 壶关县| 特克斯县| 横山县| 金乡县| 叙永县| 宁阳县| 文化| 拉萨市| 东丰县| 乡宁县| 革吉县| 卢湾区| 惠州市| 大城县| 濉溪县| 夹江县| 高邑县| 巴南区|