首页 > 其他分享 >vue2 简洁的行政区划选择组件封装

vue2 简洁的行政区划选择组件封装

时间:2024-07-16 15:40:18浏览次数:17  
标签:封装 value label item vue2 组件 return modelValue children

 

vue2 简洁的行政区划选择组件封装


// 判断变量是否为 null 或 undefined
export function isNullOrEmpty(value) {
	return value === null || value === undefined || value === ''
}

// 判断变量是否为 null 或 undefined
export function isNullOrUndefined(value) {
	return value === null || value === undefined
}
<script>
import { isNullOrEmpty, isNullOrUndefined } from '@utils/index'

export default {
	name: 'RegionSelect',
	props: {
		placeholder: { type: String, default: '请选择行政区' },
		clearable: { type: Boolean, default: true },
		showAllLevels: { type: Boolean, default: true },
		value: { type: [String, Array], default: '' },
		label: String,
		props: {
			type: Object,
			default() {
				return {
					multiple: false,
					label: 'label',
					value: 'value',
					children: 'children',
					// 是否可以任选一级
					checkStrictly: true,
					// 次级菜单的展开方式 click hover
					expandTrigger: 'hover'
				}
			}
		},
		options: {
			type: Array,
			default() {
				return []
			}
		}
	},
	watch: {
		value: {
			handler(modelValue) {
				this.modelValue = modelValue
			}
		}
	},
	computed: {
		listMap() {
			const { options, config } = this
			const { label, value, children } = config
			const map = new Map()
			const deep = (list = []) => {
				list.forEach(item => {
					map.set(item[value], {
						...item,
						label: item[label],
						value: item[value]
					})

					if (item[children] && item[children].length) {
						deep(item[children])
					}
				})
			}
			deep(options)
			return map
		},
		config() {
			return {
				multiple: false,
				label: 'label',
				value: 'value',
				children: 'children',
				// 是否可以任选一级
				checkStrictly: true,
				// 次级菜单的展开方式 click hover
				expandTrigger: 'hover',
				...this.props
			}
		}
	},
	data() {
		return {
			modelValue: this.value
		}
	},
	methods: {
		handleChange(codeArray) {
			this.$refs.regionCodeOptionsRef.dropDownVisible = false //监听值发生变化就关闭它
			if (this.config.multiple) {
				this.modelValue = codeArray
			} else {
				let code = codeArray[codeArray.length - 1]
				if (isNullOrUndefined(code)) {
					code = ''
				}
				this.modelValue = code
			}

			this.$emit('input', this.modelValue)
			this.$emit('update:label', this.listMap.get(this.modelValue)?.label)
			this.$emit('change', this.modelValue)
		}
	}
}
</script>

<template>
	<el-cascader
		ref="regionCodeOptionsRef"
		:value="modelValue"
		:options="options"
		:show-all-levels="showAllLevels"
		:clearable="clearable"
		:props="config"
		:style="{ width: '100%' }"
		v-bind="{ ...$attrs, ...$props }"
		@change="handleChange"
	/>
</template>

<style scoped lang="scss"></style>

 

标签:封装,value,label,item,vue2,组件,return,modelValue,children
From: https://www.cnblogs.com/yeminglong/p/18305388

相关文章

  • 2024-07-16 记录vue内置组件(ps:内容来自GPT)
    1. Transition和TransitionGroup用途:用于为单个元素或组件提供过渡效果。TransitionGroup则用于列表中的多个元素或组件的过渡效果。特点:Transition:只影响单个元素或组件,不会额外渲染DOM元素。TransitionGroup:渲染一个真实的DOM元素(默认为<span>),可以通过tag属性改变渲染......
  • Vue2的计算属性
    计算属性概念:基于现有的数据进行计算出新的数据。依赖的数据变化,自动重新计算。语法:声明在computed配置项中,一个计算属性对应的是一个函数使用起来跟普通属性一样{{计算属性名}} <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><meta......
  • 组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)
     一、什么是组态软件组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域,用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具,使用户能够创建用户界......
  • 类模板案例——数组类封装(vector<>的逻辑代码)
    .hpp文件#pragma#include<iostream>usingnamespacestd;template<classT>classMy_arry{public: My_arry(intcapacity)//赋初值 { this->m_capacity=capacity;//容量 this->m_Arry_size=0;//大小 this->m_Arry_Addres=newT[capacity];......
  • 深入探讨React表单组件:从基础到高级
    深入探讨React表单组件:从基础到高级大家好!今天我们来聊聊React中的表单组件。表单在前端开发中是非常常见的需求,无论是登录、注册还是数据提交,表单组件都扮演着重要的角色。本文将带你从基础到高级,深入了解React表单组件的使用和优化。基础知识在React中,表单元素(如<input>、<te......
  • 论 Suspense 组件在 Vue 3 中的重要性
        大家好,我是CodeQi! 一位热衷于技术分享的码仔。你是否曾经遇到过在加载大量数据时,界面卡顿或是空白的问题?如果你正在开发一个复杂的前端项目,那么一定需要处理很多异步数据请求。而异步请求太多就会导致用户看到空白屏幕时间变长,这对用户体验非常不友好。......
  • Lazarus 将LNET封装到DLL中
    最近工作中有个要求SOCKET的功能,想将一个通信功能做得简单一点。发现LNET非常方便,所以对它研究了一下。LNET有两种类型,可视化和非可视化。做WINDOWS下一般都是用可视化的。用于LINUX和WINCE,必须用非可视化的。我要将它封装成DLL的话,必须用非可视化的。DLL代码如下:librarypro......
  • vue2和vue3的生命周期对比?
    Vue2和Vue3在生命周期钩子函数方面存在明显的区别,这些区别主要体现在命名、新增钩子函数、触发时机以及API的使用方式等方面。以下是对两者生命周期的详细对比:一、命名变化Vue2:生命周期钩子函数的名称通常以"before"、"created"、"mounted"等前缀命名,如beforeCreate、crea......
  • 【vue组件库搭建07】Vitest单元测试
    vitest官网vue-test-utils我们的测试框架选择的是Vitest和vue-test-utils。两者的关系为:Vitest提供测试方法:断言、Mock、SpyOn等方法。vue-test-utils:挂载和渲染组件:VueTestUtils允许您在隔离中挂载组件,这意味着您可以测试单个组件而不必担心其子组件或需要......
  • vite 实现自动导入element plus icons 图标组件
    vite.config.js配置import{fileURLToPath,URL}from"node:url";importComponentsfrom"unplugin-vue-components/vite";importAutoImportfrom"unplugin-auto-import/vite";import{ElementPlusResolver}from"unplugin-v......