tnblog
首页
视频
资源
登录

vue3封装一个通用的数据字典选择。自定义组件支持v-model双向绑定值,支持change事件,支持传递提示语placeholder

617人阅读 2025/3/27 20:00 总访问:891362 评论:0 收藏:0 手机
分类: 前端

代码如下:

  1. <template>
  2. <el-select
  3. v-model="innerValue"
  4. @change="handleSelectChange"
  5. class="select-dic"
  6. size="default"
  7. :placeholder="placeholder"
  8. clearable
  9. >
  10. <el-option
  11. v-for="item in dicDatas"
  12. :key="item.dictValue"
  13. :value="item.dictValue"
  14. :label="item.dictLabel"
  15. />
  16. </el-select>
  17. </template>
  18. <script setup lang="ts">
  19. import { ref, watch, onMounted } from 'vue';
  20. // import type { PropType } from 'vue';
  21. import request from '/@/utils/requestTools';
  22. // 定义组件props类型
  23. interface DictDataItem {
  24. dictValue: string;
  25. dictLabel: string;
  26. }
  27. const props = defineProps({
  28. modelValue: {
  29. type: String,
  30. default: ''
  31. },
  32. dictType: {
  33. type: String,
  34. required: true
  35. },
  36. placeholder: {
  37. type: String,
  38. default: '请选择类型'
  39. }
  40. });
  41. const emit = defineEmits<{
  42. (e: 'update:modelValue', value: string): void;
  43. (e: 'change', value: string): void;
  44. }>();
  45. // 响应式状态
  46. const innerValue = ref(props.modelValue);
  47. const dicDatas = ref<DictDataItem[]>([]);
  48. // 初始化加载字典数据
  49. const loadDictData = async () => {
  50. try {
  51. const res:any = await request.get('/watertap/api/SysDictData/getSysDictDataByType', {
  52. dictType: props.dictType
  53. });
  54. dicDatas.value = res.data || [];
  55. } catch (error) {
  56. console.error('加载字典数据失败:', error);
  57. // 这里可以添加错误处理逻辑
  58. }
  59. };
  60. // 处理选择变化
  61. const handleSelectChange = (value: string) => {
  62. emit('update:modelValue', value);
  63. emit('change', value);
  64. };
  65. // 监听外部modelValue变化
  66. watch(
  67. () => props.modelValue,
  68. (newVal) => {
  69. innerValue.value = newVal;
  70. }
  71. );
  72. // 生命周期钩子
  73. onMounted(loadDictData);
  74. </script>
  75. <style scoped lang="scss">
  76. .select-dic {
  77. width: 100%;
  78. :deep(.el-input__inner) {
  79. padding: 0 15px;
  80. }
  81. }
  82. </style>

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

vue3vue组件props给一个对象参数vue组件间传参数vue父组件给子组件传参数组件参数类型父组件调用子组件的方法vue组件事件监听给子组件传递方法子组件调用父组件方法

[TOC]组件可以使用props给组件传值,可以同时传递多个,可以是任意类型,比如字符串或者对象。 下面是个简单的例子: &lt...

vue3最基础的数据加载表格table

vue3表格加载一点静态数据 &lt;template&gt; &lt;el-table :data=&quot;tableData&quot; style=&quot;width: 100%&quot...

vue3 Element Plus 表单输入框放到一行

当垂直方向空间受限且表单较简单时,可以在一行内放置表单。 通过设置 inline 属性为 true 可以让表单域变为行内的表单域...

vue3 Element ui Plus 表格 分页vue3 el-pagination分页

其实就是el-pagination控件的使用而已 &lt;template&gt; &lt;div&gt; &lt;el-table :data=&quot;tableData&quot; ...

vue触发a标签的点击事件vue3 dom操作 触发点击事件 文件选择库只会触发一次change事件的问题

[TOC]vue触发a标签的点击事件直接操作dom节点的方式比较简单 &lt;button @click=&quot;handleBtnClick&quot;&gt;点击按钮&...

vue3 ref的使用多个ref的使用通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue elementuivue3 element plus 文件上传的时候设置其他参数后台.net接收传递的额外参数图片上传

比如上传文件的时候额外传递两个select选择的值 前台前面上传文件的时候要提供默认参数很简单,el-upload绑定一个data即可...

vuevue3 打开新页面页面跳转vue跳转到一个新页面vue路由传参vue3路由传参vue3 获取路由参数

[TOC]VUE页面跳转本地页面跳转 goApplicationCenter() { //进行页面跳转 let path = &quot;/application-center&quo...

vuevue3组件封装vue组件模板简单组件模板基础组件模板vue引入自定义的组件vue使用自定义的组件插槽slot使用vue封装格子效果一块一块的grid布局效果

[TOC]vue封装组件的简单模板贴一个简单模板方便自定义组件的时候直接复制 &lt;template&gt; &lt;div class=&quot;app...

.net6 Signalr+vue3 的运用(上)

.net6 Signalr+Vue3 的运用(上)[TOC] 什么是 SignalR?ASP.NET Core SignalR 是一个开放源代码库,可用于简化向应用添加...

.net6 Signalr+vue3 的运用(下)

.net6 Signalr+Vue3 的运用(下)[TOC] 上篇链接:https://www.tnblog.net/hb/article/details/7961SignalR 中的用户 Sig...

.net6 Signalr+vue3 配合Ingress Nginx的运用

.net6 Signalr+Vue3 配合Ingress Nginx的运用[TOC] 结合上篇:https://www.tnblog.net/hb/article/details/7963 项目打...

vue3 Element Plus 表格使用vue3常用界面搭配vue3基础模板使用

一个简单的表格加时间搜索界面效果如下: 代码如下: &lt;template&gt; &lt;div class=&quot;app-container&quot;&g...

vue3 如何加prototypevue3使用globalProperties

在2.X版本中创建一个vue 实例是通过 new Vue()来实现的,到了3.X中则是通过使用createApp这个 API返回一个应用实例,并且可...
这一生多幸运赶上过你.
排名
8
文章
243
粉丝
7
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术