首页 > 其他分享 >ts vue3 element-plus 自建可配置表单弹窗实现

ts vue3 element-plus 自建可配置表单弹窗实现

时间:2024-07-13 15:51:50浏览次数:14  
标签:currentRow const true ts value element plus 表单 type

当然可以!下面是使用 TypeScript 语法的动态表单弹出组件示例。

1. 创建动态表单弹出组件(TypeScript)

<template>
  <el-dialog :visible.sync="visible" title="表单" @close="handleClose">
    <el-form :model="formData" :rules="rules" ref="formRef">
      <el-form-item
        v-for="(item, index) in formItems"
        :key="index"
        :label="item.label"
        :prop="item.prop"
      >
        <component :is="item.type" v-model="formData[item.prop]" v-bind="item.props" />
      </el-form-item>
    </el-form>
    <span slot="footer" class="dialog-footer">
      <el-button @click="handleClose">取消</el-button>
      <el-button type="primary" @click="handleSubmit">提交</el-button>
    </span>
  </el-dialog>
</template>

<script lang="ts">
import { ref, defineComponent } from 'vue';

interface FormItem {
  label: string;
  prop: string;
  type: string;
  props?: Record<string, any>;
}

export default defineComponent({
  props: {
    visible: {
      type: Boolean,
      required: true,
    },
    formItems: {
      type: Array as () => FormItem[],
      required: true,
    },
    rules: {
      type: Object,
      required: true,
    },
    initialData: {
      type: Object,
      default: () => ({}),
    },
  },
  setup(props, { emit }) {
    const formData = ref<{ [key: string]: any }>({ ...props.initialData });

    const handleClose = () => {
      emit('update:visible', false);
    };

    const handleSubmit = async () => {
      const formRef = refs.formRef;
      try {
        await formRef.validate();
        emit('submit', formData.value);
        handleClose();
      } catch (error) {
        console.error('表单验证失败', error);
      }
    };

    return {
      formData,
      handleClose,
      handleSubmit,
    };
  },
});
</script>

2. 在父组件中使用动态表单弹出组件(TypeScript)

<template>
  <div>
    <el-button type="primary" @click="showDialog">新增</el-button>
    <el-table :data="tableData" style="width: 100%">
      <el-table-column prop="name" label="姓名" />
      <el-table-column prop="age" label="年龄" />
      <el-table-column prop="gender" label="性别" />
      <el-table-column label="操作">
        <template #default="{ row }">
          <el-button @click="editRow(row)">编辑</el-button>
        </template>
      </el-table-column>
    </el-table>

    <form-dialog
      :visible="dialogVisible"
      :formItems="formItems"
      :rules="rules"
      :initialData="currentRow"
      @update:visible="dialogVisible = $event"
      @submit="handleFormSubmit"
    />
  </div>
</template>

<script lang="ts">
import { ref, defineComponent } from 'vue';
import FormDialog from './FormDialog.vue';

interface TableData {
  id: number;
  name: string;
  age: number;
  gender: string;
}

export default defineComponent({
  components: {
    FormDialog,
  },
  setup() {
    const dialogVisible = ref(false);
    const currentRow = ref<TableData | {}>({});
    const tableData = ref<TableData[]>([]);

    const formItems = [
      { label: '姓名', prop: 'name', type: 'el-input', placeholder: '请输入姓名' },
      { label: '年龄', prop: 'age', type: 'el-input', placeholder: '请输入年龄' },
      {
        label: '性别',
        prop: 'gender',
        type: 'el-select',
        props: {
          placeholder: '请选择性别',
          options: [
            { label: '男', value: 'male' },
            { label: '女', value: 'female' },
          ],
        },
      },
    ];

    const rules = {
      name: [{ required: true, message: '姓名是必填项', trigger: 'blur' }],
      age: [{ required: true, message: '年龄是必填项', trigger: 'blur' }],
      gender: [{ required: true, message: '性别是必填项', trigger: 'change' }],
    };

    const showDialog = () => {
      dialogVisible.value = true;
      currentRow.value = {}; // Reset for new entry
    };

    const editRow = (row: TableData) => {
      currentRow.value = { ...row }; // Copy row data for editing
      dialogVisible.value = true;
    };

    const handleFormSubmit = (formData: TableData) => {
      if ('id' in currentRow.value) {
        // Update existing row
        const index = tableData.value.findIndex(item => item.id === currentRow.value.id);
        if (index !== -1) {
          tableData.value[index] = { ...currentRow.value, ...formData };
        }
      } else {
        // Add new row
        tableData.value.push({ ...formData, id: Date.now() });
      }
      dialogVisible.value = false;
    };

    return {
      dialogVisible,
      currentRow,
      tableData,
      formItems,
      rules,
      showDialog,
      editRow,
      handleFormSubmit,
    };
  },
});
</script>

总结

这个示例展示了如何使用 TypeScript 语法创建动态表单弹出框,支持多种表单项类型,并处理新增和编辑功能。你可以根据需要扩展更多表单项和验证规则。

标签:currentRow,const,true,ts,value,element,plus,表单,type
From: https://www.cnblogs.com/jocongmin/p/18300215

相关文章

  • FFmpeg开发笔记(三十七)分析SRS对HLS协议里TS包的插帧操作
    ​《FFmpeg开发实战:从零基础到短视频上线》一书的“2.1.2 音视频文件的封装格式”介绍了视频流的PS格式和TS格式。由于TS包的长度固定,从TS流的任一片段开始都能独立解码,因此可以把TS当成音视频文件的封装格式。鉴于TS包的独立解码特性,HLS协议引入了TS格式作为传输单元。HLS协......
  • 可视化课设总结(星巴克网页爬取信息,百度地图网页版爬取信息,百度地图api,pyecharts库,pyth
    一、引言       本博客是本人是基于本人可视化课设所做的总结,其中有些过程的实现可能并不是最优的实现方法,有些实现效果也因为本人的实力有限,并不能达到预期的效果,所以也欢迎大家指点和改良。(刚考完期末回家,终于有时间把这个课设写个博客了,虽然这课设是明天截至的,我今......
  • day08-MyBatisPlus
    导入mybatis缺点:在小的sql也需要人去手写动态sql写起来很僵硬代码量大,不简洁mybatisPlus的出现,全部一键集成,实现基友搭配,效率翻倍!!!学习目标能够基于MyBatisPlus完成标准Dao开发能够掌握MyBatisPlus的条件查询能够掌握MyBatisPlus的字段映射与表名映射能够掌握id生......
  • props与emits
    在Vue3中,父子组件之间的数据传递是一个常见的需求。本文将介绍如何在Vue3中传递对象,并且在子组件中访问和修改父组件对象中的属性值,以及子组件如何调用父组件中的方法。在Vue3中,父子组件之间传值有以下作用:1.组件通信:父组件可以通过向子组件传递数据来实现与子组件的......
  • E. Tracking Segments
    链接https://codeforces.com/problemset/problem/1843/E题面思路二分加树状数组。关键点在于看出来单点修改和区间查询,然后离线+二分:令l=1(1次操作),r=q(最多q次操作)。二分判断能不能行。以及树状数组的板子要记得。代码#define_CRT_SECURE_NO_WARNINGS#include<iostream>......
  • FastStone Capture v9.2 汉化版
    软件简介FastStoneCapture是一款出色的屏幕截图(捕捉)软件,它集图像捕捉、浏览、编辑、视频录制等功能于一身,功能完善、使用方便,值得推荐!软件提供多种截图方式(如:活动窗口、窗口/对象、矩形区域、手绘区域、整个屏幕、滚动窗口等),还具备屏幕录像机、放大镜、颜色拾取、屏幕标尺......
  • FastStone Capture (屏幕截图) v9.2 汉化版
    下载地址:https://www.mediafire.com/file/b6crzq480nyzf8v/FSCapture-9.2-CN.zip/file软件简介:FastStoneCapture是一款出色的屏幕截图(捕捉)软件,它集图像捕捉、浏览、编辑、视频录制等功能于一身,功能完善、使用方便,值得推荐!软件提供多种截图方式(如:活动窗口、窗口/对象、矩形区......
  • SpringBoot整合mybatis-plus
    1.什么是mybatis-plus?mybatis-plus是一个mybatis的增强工具,在mybatis的基本上只做增强不做改变,为简化开发,提高效率而生。2.特点:3.如何使用?添加mybatis-plus依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-bo......
  • BootStrap TreeView示例
    <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><title></title>......
  • Bootstrap图片样式使用方法
    在Bootstrap中自带了几种图片样式,能够让你很快地对其进行使用,这几种样式使用起来相当简单,让我们一起来看看怎么快速调用Bootstrap图片样式。 Bootstrap图片圆角样式在现今的网站建设中,由于扁平化设计的趋势,我们经常会用用到一些CSS3的特性,例如圆角、渐变、阴影等。同样我们也......