``` npm i element-ui npm i vue-gyc-ui ```


Keywords
vue, element-ui, guoyuanchao, vue-gyc-ui, 郭远朝
License
MIT
Install
npm install vue-gyc-ui@5.4.61

Documentation

动态表格+表单组件

安装

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
email 邮箱格式 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 重写分页条

项目地址

点击跳转至 GITHUB

目前功能正在完善中,欢迎大家加入下面的 QQ 群,我们一起交流吧!

QQ