基于element-plus定义表单配置化扩展表单按钮

news2025/6/9 14:29:34

文章目录

  • 前言
  • 一、新增`btn.vue`组件
  • 二、使用
  • 总结
    • `如有启发,可点赞收藏哟~`


前言

在后台管理系统一般都存在列表查询,且可输入数据进行查询

基于element-plus定义表单配置化

新增按钮配置化
在这里插入图片描述


一、新增btn.vue组件

<template>
  <template v-for="(btn, index) in fieldProperty.btns" :key="btn + index">
    <el-button
      @click="btn.fun"
      :size="fieldProperty.size"
      :name="btn.name"
      :readonly="btn.readonly"
      :disabled="btn.disabled"
      :type="btn.type"
      :color="btn.color"
      :dark="btn.dark"
      :plain="btn.plain"
      :round="btn.round"
      :circle="btn.circle">
      <SvgIcon v-if="btn.icon" :icon-class="btn.icon"/>
      {{ btn.name }}
    </el-button>
  </template>
</template>
<script lang="ts">
import { computed, reactive } from "vue";
import SvgIcon from "@/components/svg-icon/index.vue";
export default {
  components: { SvgIcon },
  name: "Radio",
  props: {
    modelvalue: [Boolean],
    property: {
      type: Object,
      default() {
        return {};
      },
    },
  },
  setup(props, { emit }) {
    const fieldProperty = reactive({
      size: "default", // 'large' | 'default' | 'small'
      btns: [{
        fun: () => { console.log('Save') },
        name: 'Save',
        readonly: false,
        disabled: false,
        type: "primary", // 'primary'| 'success'| 'warning'| 'danger'| 'info'| 'text'(delete)
        color: "#334343",
        icon: 'save', // 图标
        dark: false, // dark 模式, 意味着自动设置 color 为 dark 模式的颜色 和color一起设置
        plain: false, // 是否为朴素按钮
        round: false, // 是否为圆角按钮
        circle: true, // 是否为圆形按钮
        // loading: false, // 是否为加载中状态
        // 'loading-icon': 'Loading', // 自定义加载中状态图标组件
      }],
      ...props.property,
    });
    const val = computed({
      get() {
        return props.modelvalue;
      },
      set(val) {
        emit("update:modelvalue", val); // 触发
      },
    });
    return {
      val,
      fieldProperty,
    };
  },
};
</script>
<style lang="less" scoped></style>

  • form.vue新增btn组件引入
import Btn from "@/components/form-configuration/btn.vue";
export default {
  components: {
 	...
    Btn
  },
}

二、使用

  • entity.ts
import { ObjectEntries } from "@/entity/objectentries";
import enableStatus from "@/enum/enable-status";
import type { Rules, DefaultFields, FormData } from "@/interface/form";
import { useI18n } from "vue-i18n";
export class UserSearchFormEntity extends ObjectEntries {
  public formRules: Rules = {};
  public formFields: DefaultFields = {};
  public formData: FormData = {};
  constructor() {
    const { t } = useI18n()
    super()
    this.formFields = {
      userName: "",
      nickName: "",
      phoneNumber: "",
      status: "",
      createDate: [],
    };
    this.formData = {
      userName: {
        type: "Input",
        colSize: 8,
        show: true,
        class: [],
        title: t('userName'),
        field: "userName",
        property: {
          type: "text",
          placeholder: "text",
        },
      },
      nickName: {
        type: "Input",
        colSize: 8,
        show: true,
        class: [],
        title: t('nickName'),
        field: "nickName",
        property: {
          type: "text",
          placeholder: "text",
        },
      },
      phoneNumber: {
        type: "Input",
        colSize: 8,
        show: true,
        class: [],
        title: t('phoneNumber'),
        field: "phoneNumber",
        property: {
          type: "text",
          placeholder: "text",
        },
      },
      status: {
        type: "Select",
        colSize: 8,
        show: true,
        class: [],
        title: t('status'),
        field: "status",
        property: {
          data: UserSearchFormEntity.objectEntries(enableStatus),
        },
      },
      createDate: {
        type: "Date",
        colSize: 8,
        show: true,
        class: [],
        title: t('createDate'),
        field: "createDate",
        property: {
          type: "daterange",
          placeholder: "text",
        },
      },
      btn: {
        type: "Btn",
        colSize: 8,
        show: true,
        class: ['noLabel'],
        field: "btn",
        property: {
          btns: []
        },
      },
    };
  }
}

  • page/index.ts
import { defineComponent, reactive, ref } from 'vue'
import FormList from "@/components/form-configuration/form.vue";
import { UserSearchFormEntity } from './composables/entity';
import { useI18n } from 'vue-i18n';

export default defineComponent({
  components: {
    FormList
  },
  setup() {
    const { t } = useI18n()
    const userSearchFormRef = ref()
    const userSearchFormEntity = reactive(new UserSearchFormEntity())
    userSearchFormEntity.formData.btn.property.btns = [
      {
        fun: () => {},
        name: t('search'),
        type: 'primary',
        icon: 'search'
      },
      {
        fun: () => {},
        name: t('reset'),
        icon: 'refresh',
      },
    ]
    return {
      userSearchFormRef,
      userSearchFormEntity
    };
  },
});

  • page/index.vue
<script lang="ts" src="./index.ts" />
<template>
  <div>
    <FormList
      class="register-info-form"
      ref="userSearchFormRef"
      :fields="userSearchFormEntity.formFields"
      :formData="userSearchFormEntity.formData"
      :rules="userSearchFormEntity.formRules"
      labelWidth="120px"
    />
  </div>
</template>

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


总结

如有启发,可点赞收藏哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1239918.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做好性能压测?压测环境设计和搭建的7个步骤你知道吗?

简介&#xff1a;一般来说&#xff0c;保证执行性能压测的环境和生产环境高度一致是执行一次有效性能压测的首要原则。有时候&#xff0c;即便是压测环境和生产环境有很细微的差别&#xff0c;都有可能导致整个压测活动评测出来的结果不准确。 1. 性能环境要考虑的要素 1.1 系…

5种社交媒体策略提升你的SEO

你希望你的网站在多大程度上在搜索结果中被更多的受众看到&#xff1f;如果你想增加你网站的曝光率和流量&#xff0c;社交媒体整合是提高你的SEO的一个好方法。为了帮助公司和网站所有者提高他们的搜索引擎优化 &#xff08;SEO&#xff09;&#xff0c;这篇文章将介绍五种社交…

易点易动设备管理系统:提升企业设备保养效率的最佳选择

在现代企业中&#xff0c;设备的正常运行和保养对于业务的顺利进行至关重要。然而&#xff0c;传统的手动设备管理方式往往效率低下、容易出错&#xff0c;给企业带来不必要的成本和风险。为了解决这一问题&#xff0c;易点易动设备管理系统应运而生。本文将介绍易点易动设备管…

ansible的基本安装

目录 一、简介 1.ansible自动化运维人工运维时代 2.自动化运维时代 3.ansible介绍 4.ansible特点 二、ansible实践 1.环境 2.ansible管理安装 3.ansible被管理安装 4.管理方式 5.添加被管理机器的ip 6.ssh密码认证方式管理 三、配置免密登录 1.ansible自带的密码…

2021年12月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 舞台上有3个角色,小猫的程序如下图所示,另外两个角色没有程序。点击绿旗,下列选项正确的是? A:小猫随鼠标移动,可能会遮挡其他两个角色 B:小猫随鼠标移动,可能会被其他两个…

前缀和的动态维护——树状数组[C/C++]

文章目录 前言lowbitlowbit的定义lowbit的计算 树状数组的思想树状数组的操作单点修改 update前缀查询 query树状数组的建立 build 前言 树状数组巧妙了利用位运算和树形结构实现了允许单点修改的情况下&#xff0c;动态维护前缀和&#xff0c;并且实现单点修改和前缀和查询的效…

2021年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下图所示程序,舞台上的角色? A:在1秒内滑行到随机位置 B:不断地重复滑行到随机位置 C:只有按下空格键的时候,才会滑行到随机位置 D:只有按下空格键以外键的时候,才会滑行…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战一使用鸿蒙登录组件实现客户端登录

目录 概述使用云端一体化开发模板创建项目工程创建登录入口页面集成登录SDK组件依赖登录组件SDK使用登录组件SDK 开启“手机号码”和“邮箱地址”认证方式 概述 通过本次课程&#xff0c;我们将学习怎么使用云端一体化开发模板来创建云开发工程&#xff0c;以及如何使用鸿蒙登…

机器学习第12天:聚类

文章目录 机器学习专栏 无监督学习介绍 聚类 K-Means 使用方法 实例演示 代码解析 绘制决策边界 本章总结 机器学习专栏 机器学习_Nowl的博客-CSDN博客 无监督学习介绍 某位著名计算机科学家有句话&#xff1a;“如果智能是蛋糕&#xff0c;无监督学习将是蛋糕本体&a…

Deepmind开发音频模型Lyria 用于生成高品质音乐;创建亚马逊新产品评论摘要

&#x1f989; AI新闻 &#x1f680; Deepmind开发音频模型Lyria 用于生成高品质音乐 摘要&#xff1a;Deepmind推出名为Lyria的音频模型&#xff0c;可生成带有乐器和人声的高品质音乐。Lyria模型针对音乐生成的挑战&#xff0c;解决了音乐信息密度高、音乐序列中的连续性维…

智能驾驶产品开发中如何贯彻“正向开发”理念

摘要&#xff1a; 基于演绎法的正向开发理念&#xff0c;能够让智能驾驶产品在充分满足用户需求&#xff0c;保证产品质量的同时&#xff0c;确保开发目标合理且得到落实。 前段时间&#xff0c;微博CEO吐槽理想L9智能驾驶“行驶轨迹不居中”&#xff0c;在网上引发了热烈讨论…

Youtube运营如何打破0播放?你需要的技巧、策略与工具

对于有跨境意向的内容创作者或者品牌企业来说&#xff0c;YouTube是因其巨大的潜在受众群和商业价值成为最值得投入变现与营销计划的平台。 据统计&#xff0c;98% 的美国人每月访问 YouTube&#xff0c;近三分之二的人每天访问。但是&#xff0c;YouTube还远未达到过度饱和的…

Android APN 参数数据库设计和代码实现

Android U 网页代码&#xff1a;/ - OpenGrok cross reference for / (aospxref.com) 字段参数介绍 实体对象 ApnSetting ApnSetting.java - OpenGrok cross reference for /frameworks/base/telephony/java/android/telephony/data/ApnSetting.java (aospxref.com) An Acc…

你不知道的库:库的种类,作用和加载方式

你不知道的库&#xff1a;库的种类&#xff0c;作用和加载方式 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客…

Linux 局域网传输工具LANDrop安装

Linux 局域网传输工具LANDrop安装 &#x1f959;下载&#x1f32d;解压&#x1f96a;运行 &#x1f959;下载 官网下载 或网盘 &#x1f32d;解压 使用以下命令解压获得squashfs-root文件夹 ./LANDrop-latest-linux.AppImage --appimage-extract&#x1f96a;运行 进入squ…

分布式锁3: zk实现分布式锁

一 zk 实现分布式锁 1.1 zk分布式操作命令 1.指令&#xff1a; ls / get /zookeeper create /aa "test" delete /aa set /aa "test1" 2..znode节点类型&#xff1a; 永久节点&#xff1a;create /pa…

028 - STM32学习笔记 - ADC结构体学习(二)

028 - STM32学习笔记 - 结构体学习&#xff08;二&#xff09; 上节对ADC基础知识进行了学习&#xff0c;这节在了解一下ADC相关的结构体。 一、ADC初始化结构体 在标准库函数中基本上对于外设都有一个初始化结构体xx_InitTypeDef&#xff08;其中xx为外设名&#xff0c;例如…

从mysql源码编译出相应的库和可执行文件及搭建mysql服务端

目录 1. 问题的提出 2. 源码下载 3. 升级或安装某些前置软件 3.1. 升级CMake 3.2. 升级gcc、g 4. 安装依赖库 4.1. 安装OpenSSL 4.2. 安装Curses 4.3. 安装pkg-config 5. 编译、安装 6. 编译结果、配置 7. 编译错误处理 7.1. 错误1 7.2. 错误2 8. 搭建mysql数…

FindMy技术用于充电宝

充电宝是一种便捷的充电器&#xff0c;方便个人随身携带&#xff0c;能够自行储备电能&#xff0c;为主流电子设备提供充电服务。它广泛应用于没有外部电源供应的场所&#xff0c;例如旅行、户外活动或紧急情况下&#xff0c;为用户的手持设备提供持续的电力支持&#xff0c;确…

C语言--数组与指针--打印字符串的n种方式

一.知识背景 一维数组名的含义 arr一般表示数组的起始地址&#xff08;除了两种例外&#xff09; 1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数 2.在定义数组的同一个函数中(不是形参),&arr1,加整个数组的大小 (经常考试) 3.除上面以外,arr都表…