element ui vue cascader省市区级联选择

默认返回值格式:all:code、name都返回 name:只返回name code:只返回code,level:可设置显示层级 1: 省  2: 省、市 3: 省、市、区

v-model 默认值 可以是 name: [ "天津市", "天津市", "和平区" ] code: [ "120000", "120100", "120101" ]

all:[ { "code": "120000", "name": "天津市" }, { "code": "120100", "name": "天津市" }, { "code": "120101", "name": "和平区" } ]

1、数据来源  area-data
 

npm i -s area-data

area-data 直辖市默认下级是市辖区 如:北京市->市辖区 若显示 北京市->北京市 需找到安装的包将数据里的市辖区改为相应的直辖市名称

2、自定义级联组件 al-cascader.vue 

<template>
  <div>
    <el-cascader
      v-model="select"
      :options="data"
      :disabled="disabled"
      :size="size"
      :placeholder="placeholder"
      :separator="separator"
      @change="handleChange"
    />
  </div>
</template>

<script>
import { pcaa } from 'area-data'
import util from '@/util'

export default {
  name: 'AlCascader',
  props: {
    value: {
      type: Array,
      default: () => [],
    },
    level: {
      type: [Number, String],
      default: 3,
      validator: (val) => {
        return util.checkLevel(parseInt(val))
      },
    },
    dataType: {
      type: String,
      default: 'all',
      validator: (val) => {
        return util.oneOf(val, util.dataType)
      },
    },
    disabled: {
      type: Boolean,
      default: false,
    },
    size: {
      type: String,
      default: 'medium',
    },
    placeholder: {
      type: String,
      default: '请选择',
    },
    separator: {
      type: String,
      default: '/',
    },
  },
  data() {
    return {
      data: [],
      select: [],
      oldData: [],
    }
  },
  computed: {
    showLevel() {
      return parseInt(this.level)
    },
  },
  watch: {
    value(val) {
      if (this.canEmit(this.value)) this.setDefaultValue()
    },
    showLevel() {
      this.init()
      this.setDefaultValue()
    },
    dataType() {
      this.setDefaultValue()
    },
  },
  mounted() {
    this.init()
    if (this.canEmit(this.value)) this.setDefaultValue()
  },
  methods: {
    init() {
      const { showLevel } = this
      const proData = []
      for (const p in pcaa['86']) {
        const children = []
        if (showLevel > 1)
          for (const c in pcaa[p]) {
            const _children = []
            if (showLevel > 2)
              for (const co in pcaa[c]) {
                const v = { value: co, label: pcaa[c][co] } // 县区级
                _children.push(v)
              }
            const v = { value: c, label: pcaa[p][c] } // 市级
            if (_children.length > 0) v.children = _children
            children.push(v)
          }
        const proitem = { value: p, label: pcaa['86'][p] }
        if (children.length > 0) proitem.children = children
        proData.push(proitem)
      }
      this.data = proData
    },
    setDefaultValue() {
      const { value, showLevel } = this
      if (value[0]) {
        let select = []
        if (isNaN(parseInt(value[0]))) {
          let i = 0
          let code = '' // 编码
          while (value[i] && i <= this.showLevel) {
            if (i === 0)
              code = util.getIndex(pcaa['86'], value[0].name || value[0])
            else code = util.getIndex(pcaa[code], value[i].name || value[i])
            select.push(code)
            i++
          }
        } else select = value
        select = select.slice(0, showLevel)
        this.select = select
        const res = this.procesValue(this.select)
        this.oldData = res
        this.$emit('input', res)
        this.$emit('on-change', res)
      }
    },
    canEmit(res) {
      let ifEmit = false
      const { value, oldData } = this
      if (value && value.length !== 0) {
        const v = value[value.length - 1]
        const o = oldData[oldData.length - 1]
        if (typeof res[0] === 'string') ifEmit = v !== o
        else if (oldData.length === 0 || v.code !== o.code) ifEmit = true
      } else ifEmit = true
      return ifEmit
    },
    handleChange(resArr) {
      const res = this.procesValue(resArr)
      this.oldData = res
      this.$emit('input', res)
      this.$emit('on-change', res)
    },
    procesValue(arr) {
      let i = 0
      const res = []
      while (arr[i]) {
        const name = i === 0 ? pcaa['86'][arr[i]] : pcaa[arr[i - 1]][arr[i]]
        let item
        switch (this.dataType) {
          case 'all':
            item = { code: arr[i], name }
            break
          case 'name':
            item = name
            break
          default:
            item = arr[i]
            break
        }
        res.push(item)
        i++
      }
      console.log(res, '88888')
      return res
    },
  },
}
</script>

util.js

const util = {}

util.levelArr = [1, 2, 3]

util.oneOf = (item, arr) => {
  return arr.includes(item)
}
util.getIndex = (list, name) => {
  for (const i in list) {
    if (list[i] === name) return i
  }
}

util.dataType = ['all', 'code', 'name']

util.checkLevel = (val) => {
  return util.oneOf(val, util.levelArr)
}

export default util

 应用

import AlCascader from '@/components/select-area/al-cascader'
//在需要使用的地方引入组件
 
<al-cascader v-model="resArr" level="2" data-type="all" />

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Element UI是一个基于Vue.js的UI组件库,可以帮助开发者快速构建漂亮的用户界面。在使用Element UI之前,需要在main.js中引入Element UI的样式文件和注册Element UI组件。具体的引入方式是通过import语句引入Element UI的库文件,并使用Vue.use()方法注册Element UI组件。例如,在main.js中添加以下代码: import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; Vue.use(ElementUI); 这样就可以在Vue项目中使用Element UI的各种组件了。同时,需要注意的是,Vue.js中的Vue()是一个构造函数,通过new Vue()可以创建一个Vue实例对象,而Vue实例对象是Vue.js中最基本的单元,用于实现根结点、根组件的功能。在项目中,可以在main.js中创建最外层的Vue实例对象来实现根结点、根组件的功能。\[1\]\[2\] 总结起来,Element UI是一个基于Vue.js的UI组件库,可以通过在main.js中引入Element UI的样式文件和注册Element UI组件来使用。同时,Vue.js中的Vue()是一个构造函数,通过new Vue()可以创建一个Vue实例对象,用于实现根结点、根组件的功能。\[1\]\[2\] #### 引用[.reference_title] - *1* [1-element-ui创建项目](https://blog.csdn.net/chencaw/article/details/116644007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [VueElement-UI](https://blog.csdn.net/qq_42814867/article/details/121739287)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少十步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值