动态表格+表单组件
安装
npm i element-ui
npm i vue-gyc-ui
main.js 代码
import Vue from "vue";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import vueGycUi from "vue-gyc-ui";
Vue.use(ElementUI, { size: "medium" }).use(vueGycUi);
示例
<template>
<div>
<div
style="
padding: 5px;
height: 50px;
display: flex;
align-items: center;
justify-content: flex-end;
"
>
<el-button @click="add" type="primary">增加表单</el-button>
<el-button @click="test" type="success">测试表单</el-button>
</div>
<!--增加form表单-->
<g-add-form
:is="isshow"
:fullscreen="false"
:formAttrs="currdata"
:formInfo="formInfo"
:showFooter="true"
@saveData="saveData"
@close="isshow = undefined"
commitText="save"
cancelText="exit"
:showCommitBtn="showCommitBtn"
:showCancelBtn="true"
:labelWidth="120"
>
<!-- <div slot="add-title"></div> -->
<!-- <div slot="add-footer"></div> -->
<div slot="arrgoodstags" slot-scope="scope">
<el-input
:style="`margin-right:1px;width: ${
(200 - scope.info.arrgoodstags.length) /
scope.info.arrgoodstags.length
}px;`"
v-for="(item, index) in scope.info.arrgoodstags"
:key="index"
v-model="scope.info.arrgoodstags[index]"
></el-input>
</div>
</g-add-form>
<!--列表显示数据-->
<g-table
:tableAttrs="tdata"
height="calc(100vh - 100px)"
@load="load"
@edit="edit"
@del="del"
@read="read"
page_align="flex-end"
:btns_width="380"
>
<!-- :func="['edit', 'del', 'read', 'page', 'control']" -->
<div slot="imgurl">444</div>
<!-- <el-button type="danger" slot="del" @click="del">delete</el-button> -->
<div slot="lbtn">
<el-button type="warning" style="margin-right: 2px">fail</el-button>
</div>
<div slot="rbtn">
<el-button type="info">ok</el-button>
</div>
</g-table>
</div>
</template>
<script>
import axios from "axios";
export default {
name: "HelloWorld",
props: {
msg: String,
},
data() {
return {
currdata: [],
showCommitBtn: true,
formInfo: undefined,
isshow: undefined,
formAttrs: [
{
key: "name",
title: "姓名",
val: "刘二麻子",
required: true,
width: 210,
validate: (rule, value, callback) => {
if (value === "fail") {
callback(new Error("测试错误!"));
} else {
callback();
}
},
},
{ key: "age", title: "年龄", val: "18", number: true, width: 210 },
{ key: "company", title: "公司", val: "", max: 10, width: 210 },
{
key: "sex",
title: "性别",
val: "0",
dicts: [
{ label: "男", value: "1" },
{ label: "女", value: "0" },
],
query: (words, callback) => {
callback(
[
{ label: "男", value: "1" },
{ label: "女", value: "0" },
].filter((li) => li.label == words)
);
},
change: (data) => {
console.log(data);
},
},
{
key: "date",
title: "日期",
val: "",
date: true,
change: (data) => {
console.log(data);
},
},
{
key: "time",
title: "时间",
val: "",
time: true,
change: (data) => {
console.log(data);
},
},
{
key: "leval",
title: "等级",
val: 3,
radio: [1, 2, 3],
labels: ["大", "中", "小"],
change: (data) => {
console.log(data);
},
},
{
key: "hobby",
title: "爱好",
val: [10],
checkbox: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
labels: [
"乒乓球",
"跑步",
"吃鱼",
"打球",
"开车",
"看书",
"打游戏",
"上网",
"cosplay",
"movie",
],
width: 650,
change: (data) => {
console.log(data);
},
},
{ key: "remark", title: "备注", val: "", area: true, width: 650 },
{
key: "email",
title: "邮箱",
val: "myemail@qq.com",
email: true,
required: true,
width: 650,
},
{
key: "switch",
title: "开关",
switch: true,
val: false,
trueColor: "yellow",
falseColor: "blue",
switchWidth: 100,
change: (data) => {
console.log(data);
},
},
],
tdata: [
{
key: "goodstags",
title: "goodstags",
val: "",
col_width: 150,
suffix: true, // "el-icon-edit",
prefix: "$",
password: false,
click: (data) => {
alert("hello world!");
},
},
{
key: "amount",
title: "amount",
val: 0,
number: true,
prefix: "¥",
suffix: "<B style='color:red;'>元</B>",
click: (data) => {
//todo()
},
change: (data) => {
console.log(data);
},
},
{ key: "wareid", title: "wareid", val: 0, number: true },
{
key: "arrgoodstags",
title: "arrgoodstags",
val: ["", "", ""],
},
{ key: "goodsid", title: "goodsid", val: 0, number: true },
{
key: "retailsale",
title: "retailsale",
val: 0,
number: true,
col_width: 120,
},
{ key: "fl1", title: "fl1", val: 1 },
{
key: "goodsname",
title: "goodsname",
val: "",
tooltip: true,
col_width: 200,
},
{ key: "fl2", title: "fl2", val: 0 },
{ key: "imgurl", title: "imgurl", val: "mall/00ef4g", tooltip: true },
{ key: "sale", title: "sale", val: 865.0, number: true },
{
key: "amountxs",
title: "amountxs",
val: 0.0,
number: true,
col_width: 120,
},
{ key: "statetag", title: "statetag", val: 1, tooltip: true },
{ key: "jbstr", title: "jbstr", val: "" },
{
key: "remark",
title: "remark",
val: "Thermo King 。",
tooltip: true,
area: true,
width: 650,
},
],
};
},
methods: {
//测试表单
test() {
this.currdata = this.formAttrs;
this.formInfo = undefined;
this.isshow = "g-add-form";
},
//初始数据
async load(a, b) {
let url = "http://api.lengyun.co:18070/erp/mallvisitor/goodslist.do";
let data = await axios.post(url, {
page: a.page,
pagesize: a.pagesize,
fieldlist: "*",
fl1: 2,
orderlist: "orderid asc",
});
b(data.data.data.list, data.data.data.total);
},
//增加
add() {
this.currdata = this.tdata;
this.showCommitBtn = true;
this.formInfo = undefined;
this.isshow = "g-add-form";
},
//删除
del(data, callback) {
alert("ok");
callback(true);
//callback("删除失败了");
},
//编辑
edit(data) {
this.currdata = this.tdata;
this.showCommitBtn = true;
this.formInfo = data;
this.isshow = "g-add-form";
},
//查看详情
read(data) {
this.currdata = this.tdata;
this.showCommitBtn = false;
this.formInfo = data;
this.isshow = "g-add-form";
},
//保存数据
saveData(data) {
console.log(data);
this.isshow = undefined;
},
},
};
</script>
表单参数列表
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
formAttrs | 表单项属性(详情见表单项参数列表) | Arrary | [] | --- |
formInfo | 编辑实体 | Object | {} | --- |
title | 表单标题 | String | 新增 | String |
isreadonly | 是否禁用表单 | Boolean | false | --- |
width | 表单宽度 | Number | 780 | --- |
labelWidth | 表单项标题宽度 | Number | 120 | --- |
itemWidth | 表单项宽度 | Number | 320 | --- |
fullscreen | 全屏 | Boolean | false | --- |
showFooter | 是否显示底部操作按钮 | Boolean | true | --- |
center | 底部操作按钮是否居中 | String | center | center,left,right |
showCommitBtn | 是否显示提交按钮 | Boolean | true | --- |
showCancelBtn | 是否显示取消按钮 | Boolean | true | --- |
commitText | 提交按钮文本 | String | 提交 | --- |
cancelText | 取消按钮文本 | String | 取消 | --- |
表单项参数列表
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
title | 表单项标题 | String | --- |
key | 表单项绑定值 key | String | --- |
val | 表单项的值 | any | any |
change | 表单项值改变触发事件 | Function(data)参数是表单数据 | undefined |
------- | 表单项默认类型是 text 类型,input 输入框 | ----- | ---- |
width | 表单项宽度 | Number | undefined |
edit | 表单项设置 false 则不显示编辑项 | Boolean | undefined |
disable | 表单项是否禁用状态 | Number | undefined |
number | 数字输入框 | Boolean | undefined |
password | 文本输入框有效,设置后变成密码框 | Boolean | undefined |
prefix | 文本输入框或数字输入框的前缀 | String | undefined |
suffix | 文本输入框或数字输入框的后缀,如果设置为 true,显示默认的三个点 | Boolean,String | undefined |
click | suffix 单击后缀执行事件 | Function(data)参数是表单数据 | undefined |
date | 日期输入框 | Boolean | undefined |
time | 时间输入框 | Boolean | undefined |
dicts | 选择框初始值。格式[{label:title,value:val}] | Array | [] |
query | 选择框查询方法,执行 callBack 方法赋值给 dicts | Function(words,callBack) | undefined |
area | 多行方本框 | Boolean | undefined |
radio | 单选框 | Array | [] |
checkbox | 多选框 | Array | [] |
labels | 单选框和多选框有效,显示单选框和多选框字段,和 values 数组长度等长 | Array | [] |
switch | 开关 | Boolean | undefined |
trueColor | 开关有效,选中时背景色 | String | #13ce66 |
falseColor | 开关有效,未选中时背景色 | String | #ff4949` |
switchWidth | 开关有效,开关长度 | number | --- |
表单 Events
事件名称 | 说明 | 回调参数 |
---|---|---|
saveData | 保存表单数据 | form 对象数据 |
close | 关闭表单窗体执行事件 | --- |
validate
校验规则 | 说明 | 值 |
---|---|---|
required | 不能为空 | true,false |
邮箱格式 | true,false | |
max | 最大长度 | number |
validate | 自定义验证 | function(rule, value, callback) |
表单自定义验证示例
formAttrs: [
{
key: "name",
title: "姓名",
val: "",
required: true, //必填
//自定义验证
validate: (rule, value, callback) => {
if (value === "fail") {
callback(new Error("测试错误!"));
} else {
callback();
}
},
},
{ key: "age", title: "年龄", val: "18", number: true }, //数字
{ key: "company", title: "公司", val: "", max: 10 }, //最大长度
{
key: "url",
title: "日期",
val: "",
date: true, //日期
width: 650,
},
];
表单 slot 重写
表单项各项都可以用插槽重写,slot name=item.key
<g-add-form :formAttrs="currdata" height="calc(100vh - 100px)">
<div slot="name">这里可以放任何HTML</div>
<div slot="age">这里替换编辑控件</div>
</g-add-form>
name | 说明 |
---|---|
add-title | 重写弹窗标题 |
add-footer | 重写弹窗 footer |
表格参数列表
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
tableAttrs | 表格 column 属性数组(详情见表格 column 属性) | Array | --- | [] |
height | 表格高度 | String | px,%,calc() | calc(100vh - 120px) |
btns_width | 表格行操作按钮宽度 | Number | --- | 185 |
disFuncs | 过滤表格功能 | Array | ['control'--操作,'edit'--编辑, 'del'--删除, 'read'--查看, 'page'--分页] | undefined |
page_align | 分页条显示方式 | String | left ,center, right | center |
表格 column 属性
参数 | 说明 | 类型 | 可选值 | 默认值 |
---|---|---|---|---|
key | 对应列内容的字段名 | String | --- | --- |
title | 对应列显示的标题 | String | --- | --- |
val | 对应列值 | any | --- | --- |
col_width | 列宽度 | String | --- | 100px |
align | 列显示方式 | String | left ,center, right | center |
sortable | 列排序 | Boolean | true,false,undefined | undefined |
tooltip | 当内容过长被隐藏时显示 | Boolean | true,false,undefined | undefined |
fixed | 列是否固定在左侧或者右侧,true 表示固定在左侧 | string, boolean | true, left, right | --- |
visible | 设置为 false 则此项不显示在表格中 | boolean | true,false,undefined | undefined |
btnType | 设置表格操作列按钮类型 | Array | primary / success / warning / danger / info / text | ['text'] |
Table Events
事件名 | 说明 | 参数 |
---|---|---|
load | 加载表格数据 | {page,pagesize},callBack(list,total) |
add | 新增 | ----- |
edit | 编辑 | rowData,callBack |
del | 删除 | rowData,callBack |
read | 查看详情 | rowData |
dbclick | 行双击事件 | row,column |
Table Slot 表单 column 各项都可以用插槽重写,slot name=item.key
<g-table :tableAttrs="tdata" height="calc(100vh - 100px)" page_align="flex-end">
<div slot="imgurl">这里重写column 显示</div>
<!-- <el-button type="danger" slot="del" @click="del">重写del</el-button> -->
<div slot="lbtn">
<el-button type="warning" style="margin-right: 2px"
>这里在左边增加功能</el-button
>
</div>
<div slot="rbtn">
<el-button type="info">这里在右边增加功能</el-button>
</div>
<div slot="page">这里可以重写分页ui</div>
</g-table>
name | 说明 |
---|---|
add | 重写增加功能 |
addleft | 在新增左边增加功能 |
addright | 在新增右边增加功能 |
query | 重写查询功能 |
read | 重写查看详情功能 |
edit | 重写编辑功能 |
del | 重写删除功能 |
lbtn | 在操作按钮组左边增加功能 |
rbtn | 在操作按钮组右边增加功能 |
page | 重写分页条 |