vue如何实现级联选择器功能

 更新时间:2024年04月24日 17:07:05   作者:清音啊  
这篇文章主要介绍了vue如何实现级联选择器功能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

vue实现级联选择器功能

vue开发中,通过使用 Element UI 的 el-cascader 组件来实现级联选择器功能

下面是一个示例代码:

演示如何使用 el-cascader 组件初始化级联选择器,并设置默认值为单位 测试1 和部门 测试11

<template>
  <div>
    <el-cascader
      v-model="selectedValues"
      :options="options"
      :props="props"
      @change="handleChange"
      placeholder="请选择"
    ></el-cascader>
  </div>
</template>
<script>
export default {
  data() {
    return {
      // 初始化级联选择器的选中值
      selectedValues: [],
      // 级联选择器的数据源
      options: [
        {
          value: '1',
          label: '测试1',
          children: [
            { value: '2', label: '测试11' },
            { value: '3', label: '测试12' }
          ]
        }
      ],
      // 自定义配置,用于指定数据结构中的属性名
      props: {
        value: 'value',
        label: 'label',
        children: 'children'
      }
    };
  },
  methods: {
    // 监听级联选择器值变化事件
    handleChange(selectedValues) {
      console.log('选中的值:', selectedValues);
    }
  },
  created() {
    // 设置初始化选中值为单位 '测试1' 和部门 '测试12'
    this.selectedValues = ['1', '3'];
  }
};
</script>

在这个示例中:

options 数组包含了级联选择器的数据源,其中每个对象表示一个选项,包括 valuelabelchildren 属性。

props 对象用于指定数据结构中的属性名,以便 el-cascader 组件正确地解析数据。

通过在 selectedValues 中设置初始选中值为单位 测试1 和部门 测试12,并将其绑定到 el-cascader 组件的 v-model 上,可以在初始化时选中指定的值。

vue级联选择器只传最后一级

elementUI的级联选择器的v-modle接受的参数是一个数组,数组中的值是对应树形数组的节点值,但是在真实开发中后端可能只给返回了某一处单一节点,对el-cascader进行2次封装实现三级联动

import arrayTreeFilter from 'array-tree-filter'

/*
* 双层递归逆向查找某一节点的所有父级
* */
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] : []
}

/*
* 该组件主要是通过后端传入的节点值来实现级联的双向数据绑定
* */
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)
    },
    /*
    * 当级联选择器变化时候会触发该事件
    * 向父级传递change事件来返回选中的节点id
    * 向父级传递realChange事件来返回选中的节点及其所有父节点和选中的所有label的值
    * arrayTreeFilter 第三方库用于筛查出选中的节点及其父节点
    * */
    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: '请选择',
        props: {
          value,
          label,
          checkStrictly: true
        }
      },
      on: {
        change: areaChange
      }
    })
  }
}


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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue el-upload单图片上传功能实现

    Vue el-upload单图片上传功能实现

    这篇文章主要介绍了Vue el-upload单图片上传功能实现,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • 详解vue事件对象、冒泡、阻止默认行为

    详解vue事件对象、冒泡、阻止默认行为

    本篇文章主要介绍了详解vue事件对象、冒泡、阻止默认行为,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-03-03
  • 详解VUE 数组更新

    详解VUE 数组更新

    这篇文章主要介绍了VUE 数组更新问题,文中给大家介绍了vue如何监听数据的变化的 ,需要的朋友可以参考下
    2017-12-12
  • Vue实现封装树状图的示例代码

    Vue实现封装树状图的示例代码

    这篇文章主要为大家详细介绍了如何使用Vue实现封装树状图,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • vue中then后的返回值解析

    vue中then后的返回值解析

    这篇文章主要介绍了vue中then后的返回值解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue六大基本类型中的原始值响应式

    Vue六大基本类型中的原始值响应式

    原始值指的是 Boolean、Number、BigInt、String、Symbol、undefined、null 等类型的值,在 JavaScript 中,原始值是按值传递的,引用类型是按引用传递的,这意味着,如果一个函数接收了一个原始值作为参数,那么形参和实参之间是没有引用关系的,它们是完全独立的两个值
    2023-01-01
  • Vue2 Element el-table多选表格控制选取的思路解读

    Vue2 Element el-table多选表格控制选取的思路解读

    这篇文章主要介绍了Vue2 Element el-table多选表格控制选取的思路解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • vue-router 按需加载 component: () => import() 报错的解决

    vue-router 按需加载 component: () => import() 报错的解决

    这篇文章主要介绍了vue-router 按需加载 component: () => import() 报错的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • vue组件编写之todolist组件实例详解

    vue组件编写之todolist组件实例详解

    这篇文章主要介绍了vue组件编写之todolist组件的实例讲解,本文给大家介绍的非常详细,需要的朋友可以参考下
    2018-01-01
  • vue二选一tab栏切换新做法实现

    vue二选一tab栏切换新做法实现

    这篇文章主要介绍了vue二选一tab栏切换新做法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论