Element Plus组件Form表单Table表格二次封装的完整过程

yizhihongxing

让我来为你详细讲解Element Plus组件Form表单Table表格二次封装的完整过程,并且提供两条示例以便更好地理解。

1.了解Form和Table组件

在进行二次封装之前,我们需要对Form和Table组件有一个初步的了解。

Form 组件

Form是Input、Radio、Select等表单控件的容器,同时也支持栅格布局,可以轻松地实现Form表单页面的开发。

Table 组件

Table是用于展示多行数据的组件,可以自定义表头、内容和样式,并提供分页等功能。

2.准备工作

在开始我们的二次封装之前,我们需要进行一些准备工作。首先我们需要确保已经安装了Element Plus组件库并成功导入需要使用的组件。其次,我们需要定义一些公共的配置项,让我们的代码更加简洁易用,提高复用性。比如:

// 公共的 Form 配置项
export const formConfig = {
  size: 'small',
  labelWidth: '80px',
};
// 公共的 Table 配置项
export const tableConfig = {
  size: 'small',
  stripe: true,
  border: true,
  fit: true,
  highlightCurrentRow: true,
};

3.二次封装过程

3.1 Form 组件

在 Form 组件方面,我们可以对它进行二次封装来达到简化代码、提高复用性等目的,例如为其添加初始值等。以下是一个示例:

<template>
  <el-form
    :model="formData"
    :rules="formRules"
    :size="formSize"
    :label-width="formLabelWidth"
    ref="form">
    <slot></slot>
    <el-form-item>
      <el-button type="primary" @click="submitForm">提交</el-button>
    </el-form-item>
  </el-form>
</template>
<script>
import { formConfig } from '@/config';

export default {
  name: 'CustomForm',
  props: {
    formData: {
      type: Object,
      required: true,
    },
    formRules: {
      type: Object,
      required: false,
    },
    formSize: {
      type: String,
      default: formConfig.size,
      required: false,
    },
    formLabelWidth: {
      type: String,
      default: formConfig.labelWidth,
      required: false,
    },
    onSubmit: {
      type: Function,
      required: false,
    },
  },
  methods: {
    submitForm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          this.onSubmit && this.onSubmit(this.formData);
        }
      });
    },
  },
};
</script>

3.2 Table 组件

在 Table 组件方面,我们也可以对它进行二次封装来达到简化代码、提高复用性等目的。以下是一个示例:

<template>
  <el-table
    :data="tableData"
    :height="tableHeight"
    :size="tableSize"
    :stripe="tableStripe"
    :border="tableBorder"
    :fit="tableFit"
    :highlight-current-row="tableHighlightCurrentRow"
    ref="table">
    <slot></slot>
  </el-table>
</template>
<script>
import { tableConfig } from '@/config';

export default {
  name: 'CustomTable',
  props: {
    tableData: {
      type: Array,
      required: true,
    },
    tableHeight: {
      type: [String, Number],
      default: '',
      required: false,
    },
    tableSize: {
      type: String,
      default: tableConfig.size,
      required: false,
    },
    tableStripe: {
        type: Boolean,
        default: tableConfig.stripe,
        required: false,
    },
    tableBorder: {
      type: Boolean,
      default: tableConfig.border,
      required: false,
    },
    tableFit: {
      type: Boolean,
      default: tableConfig.fit,
      required: false,
    },
    tableHighlightCurrentRow: {
      type: Boolean,
      default: tableConfig.highlightCurrentRow,
      required: false,
    },
  },
};
</script>

示例说明

示例一

我们可以将封装好的Form和Table组件用于一个简单的用户信息展示页面:

<template>
  <custom-form :form-data="formData" @submit="handleSubmit">
    <el-form-item label="姓名" prop="name">
      <el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
    </el-form-item>
    <el-form-item label="性别" prop="gender">
      <el-radio-group v-model="formData.gender">
        <el-radio label="男">男</el-radio>
        <el-radio label="女">女</el-radio>
      </el-radio-group>
    </el-form-item>
    <el-form-item label="年龄" prop="age">
      <el-input-number v-model="formData.age" placeholder="请输入年龄"></el-input-number>
    </el-form-item>
    <custom-table :table-data="tableData">
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="gender"
        label="性别">
      </el-table-column>
      <el-table-column
        prop="age"
        label="年龄">
      </el-table-column>
    </custom-table>
  </custom-form>
</template>
<script>
import CustomForm from './CustomForm.vue';
import CustomTable from './CustomTable.vue';

export default {
  name: 'User',
  components: {
    CustomForm,
    CustomTable,
  },
  data() {
    return {
      formData: {
        name: '',
        gender: '',
        age: '',
      },
      formRules: {
        name: [
          { required: true, message: '姓名不能为空', trigger: 'change' },
          { min: 2, max: 5, message: '姓名长度在 2 到 5 个字符', trigger: 'blur' },
        ],
        gender: [{ required: true, message: '请选择性别', trigger: 'change' }],
        age: [{ required: true, message: '请输入年龄', trigger: 'blur' }],
      },
      tableData: [],
    };
  },
  methods: {
    handleSubmit(formData) {
      this.tableData.push(formData);
    },
  },
};
</script>

在该示例中,我们使用了封装好的CustomForm和CustomTable组件,同时将它们组合在一起形成了一个用户信息展示页面。在CustomForm组件中,我们使用了插槽来注入表单项,使得代码更加简洁易读。同时,我们在CustomForm组件中包含了一个默认的提交按钮,并通过监听提交事件来获得表单提交的数据。在CustomTable组件中,我们同样使用了插槽来注入表格列,使得代码更加简洁易读,同时通过prop来指定表格数据源中需要展示的字段信息。

示例二

我们可以将封装好的Form和Table组件用于一个简单的订单管理页面:

<template>
  <div>
    <custom-form :form-data="formData" :form-rules="formRules" @submit="handleSubmit">
      <el-form-item label="订单编号" prop="orderId">
        <el-input v-model="formData.orderId" placeholder="请输入订单编号"></el-input>
      </el-form-item>
      <el-form-item label="订单状态" prop="orderStatus">
        <el-select v-model="formData.orderStatus" placeholder="请选择">
          <el-option label="待付款" value="waitPay"></el-option>
          <el-option label="待发货" value="waitSend"></el-option>
          <el-option label="待收货" value="waitingReceipt"></el-option>
          <el-option label="已完成" value="completed"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="下单时间" prop="createTime">
        <el-date-picker v-model="formData.createTime" type="datetime" placeholder="请选择下单时间"></el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="handleSearch">查询</el-button>
      </el-form-item>
      <el-form-item>
        <el-button type="success" @click="handleAdd">新增</el-button>
      </el-form-item>
    </custom-form>

    <custom-table :table-data="tableData">
      <el-table-column
        prop="orderId"
        label="订单编号">
      </el-table-column>
      <el-table-column
        prop="orderStatus"
        label="订单状态">
      </el-table-column>
      <el-table-column
        prop="createTime"
        label="下单时间">
      </el-table-column>
      <el-table-column
        label="操作">
        <template slot-scope="scope">
          <el-button @click="handleEdit(scope.row)">编辑</el-button>
          <el-button type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </custom-table>
  </div>
</template>
<script>
import CustomForm from './CustomForm.vue';
import CustomTable from './CustomTable.vue';

export default {
  name: 'Order',
  components: {
    CustomForm,
    CustomTable,
  },
  data() {
    return {
      formData: {
        orderId: '',
        orderStatus: '',
        createTime: '',
      },
      formRules: {
        orderId: [{ required: true, message: '请填写订单编号', trigger: 'blur' }],
        orderStatus: [{ required: true, message: '请选择订单状态', trigger: 'change' }],
        createTime: [{ required: true, message: '请选择下单时间', trigger: 'change' }],
      },
      tableData: [
        {
          orderId: '0000001',
          orderStatus: 'waitPay',
          createTime: '2021-10-01 10:50:00',
        },
        {
          orderId: '0000002',
          orderStatus: 'waitSend',
          createTime: '2021-10-02 12:00:00',
        },
        {
          orderId: '0000003',
          orderStatus: 'completed',
          createTime: '2021-10-03 10:50:00',
        },
      ],
    };
  },
  methods: {
    handleSubmit(formData) {
      console.log(formData);
    },
    handleSearch() {
      console.log('search');
    },
    handleAdd() {
      console.log('add');
    },
    handleEdit(row) {
      console.log('edit', row);
    },
    handleDelete(row) {
      console.log('delete', row);
    },
  },
};
</script>

在该示例中,我们同样使用了封装好的CustomForm和CustomTable组件,并通过插槽来注入表单项和表格列。在CustomForm组件中,我们增加了一个查询和新增按钮,并通过组件事件来监听按钮的点击操作。在CustomTable组件中,我们同样增加了编辑和删除按钮,并通过表格插槽来进行对表格的自定义操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Element Plus组件Form表单Table表格二次封装的完整过程 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • LG G4怎么样?新旗舰LG G4首发评测

    很抱歉,由于我是一个文本模型,无法提供标准的markdown格式文本。但是我可以为您提供一个关于LG G4的完整攻略,包含两个示例说明。 LG G4首发评测攻略 1. 设计与外观 LG G4采用了时尚的曲面设计,配备了5.5英寸的Quad HD显示屏,分辨率为2560×1440像素。其背部采用了真皮材质,给人一种高质感的触感。同时,机身背部还配备了一个后置的…

    other 2023年10月17日
    00
  • 守望先锋自定义玩法快跑吧小姑娘怎么设置_快跑吧小姑娘玩法攻略

    守望先锋自定义玩法快跑吧小姑娘怎么设置 快跑吧小姑娘是守望先锋中一种自定义玩法,玩家可以通过自定义游戏来体验这种玩法。本文将详细介绍如何设置快跑吧小姑娘的规则和玩法。 快跑吧小姑娘玩法规则 快跑吧小姑娘玩法的规则是玩家需要在规定时间内通过各种障碍物,到达终点。如果在规定时间内没有到达终点,就算游戏失败。玩家可以设置多种障碍物和终点,来丰富玩法。 设置快跑吧小…

    other 2023年6月25日
    00
  • 微软小娜安卓版怎么样 微软小娜安卓版使用评测

    微软小娜安卓版使用评测 微软小娜是微软公司开发的一款智能语音助手,提供语音识别、语音交互、智能问答等功能。以下是对微软小娜安卓版的使用评测: 优点 语音识别准确度高:微软小娜的语音识别技术相对准确,能够较好地识别用户的语音指令。 丰富的功能:微软小娜提供了多种实用功能,如天气查询、日历提醒、音乐播放、新闻资讯等,满足了用户的日常需求。 智能问答能力强:微软小…

    other 2023年10月14日
    00
  • miui12.5增强版内存扩展怎么开启?miui12.5增强版开启内存扩展技巧

    MIUI 12.5增强版内存扩展开启攻略 MIUI 12.5增强版内存扩展是一项功能强大的功能,可以帮助您优化手机的内存使用,提升系统的性能和响应速度。下面是详细的攻略,教您如何开启MIUI 12.5增强版内存扩展。 步骤一:进入设置 首先,您需要进入手机的设置界面。您可以通过下拉通知栏,点击右上角的齿轮图标,或者在应用列表中找到“设置”应用来进入设置界面。…

    other 2023年8月2日
    00
  • Geforce GTX 1060怎么样?五款GTX 1060 6GB ITX显卡性能评测

    Geforce GTX 1060怎么样?五款GTX 1060 6GB ITX显卡性能评测 Geforce GTX 1060是一款中高端显卡,适用于游戏和图形处理等应用。以下是对五款GTX 1060 6GB ITX显卡的性能评测攻略。 准备工作 确保计算机满足显卡的最低系统要求,包括电源供应、PCIe插槽等。 下载并安装最新的显卡驱动程序,以确保获得最佳性能和…

    other 2023年10月18日
    00
  • iptables基础命令详解

    当然,我很乐意为您提供有关iptables基础命令的详细攻略。以下是详细的步骤和两个示例: 1. 什么是iptables? iptables是一个Linux内核中的防火墙工具,它可以监控网络流量并根据预定义的规则来过滤、修改和重定向流量。iptables可以用于保护网络安全、限制网络访问、防止攻击等。 2. iptables基础命令 以下是iptables的…

    other 2023年5月6日
    00
  • iPhone XS/XS Max/XR怎么强制重启?苹果手机强制重启教程

    下面是详细的攻略: 如何强制重启iPhone XS/XS Max/XR? 在某些情况下,您的 iPhone XS / XS Max / XR 可能无法响应操作或运行缓慢。当您遇到这种情况时,您可以尝试强制重启您的设备,这通常可以解决问题。 以下是 iPhone XS / XS Max / XR 强制重启的步骤: 按住侧边的“音量加”按钮和侧边的“电源”按钮,…

    other 2023年6月27日
    00
  • freemodbus线圈中的位操作

    我将为您提供解决 freemodbus 线圈中的位操作的完整攻略,包括问题的原因、解决方法和两个示例说明。 问题原因 在 freemodbus 中,线圈是一个二进制位数组,每个位表示一个开关状态。在进行位操作时,需要注意以下问题: 位的编号从 0 开始,而不是从 1 开始。 位的操作是按位进行的,而不是按字节进行的。 解决方法 为了解决这个问题,可以使用以下…

    other 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部