npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue-gyc-ui

v5.5.1

Published

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

Downloads

585

Readme

动态表格+表单组件+TREE

安装

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,{
     globleBtnStyle: {
        size: "medium", type: 'primary', plain: false, round: false, circle: false, plain: true, icon: undefined
    },
    btnStyle: {
        save: { size: 'small', icon: 'el-icon-ss' },
        read: { type: 'text', plain: false },
        edit: { type: 'text', plain: false },
        del: { type: 'text', plain: false, style: 'color:red;' },
        cancel: { text: '关闭' }

    },
    //=================FORM=======================  
    //FORM 底部按钮对齐方式letf|center|right
    formFooterAlign: () => "center",
    //FORM 项标题分散对齐
    formLabelJustify: () => false,
    //FORM 显示验证错误消息
    showErrMessage: () => true,
    //================TABLE=======================
    //TABLE 上下查询风格或左右查询风格
    queryH: true,
    //TABLE 分页条显示位置letf|center|right|flex-end|flex-start
    page_align: () => 'flex-end',
    //TABLE 查询标题分散对齐
    queryLabelJustify: () => false,
    //TABLE 查询标题宽度
    queryLabelWidth: () => 55,
    //TABLE 查询输入宽度
    queryInputWidth: () => 160,
    //TABLE 表格右侧操作按钮显示位置letf|center|right|flex-end|flex-start
    controlAlign: () => 'center',
    //TABLE 表格列默认宽度 默认120px
    dWidth: () => '120px',
    //TABLE 列设置宽度
    setWidth: () => '578px',
});

示例
<template>
  <div style="display: flex; width: 100%; height: 100%">
    <!--列表显示数据-->
    <div style="display: flex; width: 100%; height: 100%">
      <div style="display: flex; width: 100%; height: 100%">
        <div
          style="
            display: flex;
            padding: 10px;
            margin: 10px;
            width: 150px;
            overflow: auto;
            height: calc(100vh - 40px);
          "
        >
          <g-tree
            style="height: 100%; overflow: auto; display: flex"
            @delete="(a, b) => b(true)"
            :load="loadDataById"
            :props="defaultProps"
            nodeKey="cbid"
            @add-next="treeAdd"
            @update="treeUpdate"
            :tree-columns="tree_col"
            @saveData="treeSaveData"
          ></g-tree>
        </div>
        <div style="display: flex; flex: 1">
          <g-table
            ref="tb"
            style="width: 99.9%"
            :tableAttrs="tdata"
            fixedHeight="calc(100vh - 115px)"
            @add="add"
            @load="load"
            @edit="edit"
            @del="del"
            @dbclick="dbRowClick"
            @read="read"
            :row-style="tableRowClassName"
            :row-class-name="bb"
            :page_align="()=>'center'"
            :queryInfo="queryInfo"
            :queryH="true"
            :disFuncs="['setting', 'more1', 'batch']"
            :leftWidth="250"
            suffix="ok"
            :queryLabel="true"
            :justify="()=>true"
            :sort="{ column: 'retailsale', order: 'asc' }"
            @row-click="rowClick"
            :queryInputWidth="()=>150"
            :sumData="sumData"
            :set-width="()=>'600px'"
            :row_Drop="true"
            :editTable="false"
            :show-message="false"
            @row-drop="drop"
            @select="tbselect"
            @select-all="tbselect"
            @batch-handle="batchHandle"
            @row-save="rowSave"
            @qx="
              (item, callback) => {
                callback({
                  read: () => true, //这里控制表格行查看功能
                  edit: () => true, //这里控制表格行编辑功能
                  del: () => item, //这里控制表格行删除功能
                  save: () => true,
                });
              }
            "
            :pagesizeList="[10, 50, 100]"
          >
            <!-- :btnsWidth="390" -->
            <!-- :disFuncs="['query','edit', 'del', 'read', 'page', 'control','more']" -->
            <div slot="imgurl">这里可以替换表格显示内容</div>
            <!-- <el-button type="danger" slot="del" @click="del">delete</el-button> -->
            <div slot="lbtn">
              <el-button type="text" style="margin-right: 2px">左边</el-button>
            </div>
            <div slot="rbtn">
              <el-button type="text">右边</el-button>
            </div>
            <!-- <div slot="page">这里可以重写分页条</div> -->
            <div
              slot="addright"
              style="display: inline-flex; flex-wrap: wrap; margin-right: 10px"
            >
              <el-button type="success" @click="test">测试表单</el-button>
            </div>
            <!-- <div slot="querydata" style="display: flex; flex: 1">222</div> -->
            <!-- <div slot="query">这里重写查询事件</div>
            <div slot="add">这里重写增加事件</div> -->
            <!-- <div slot="edit" slot-scope="scope" v-if="scope.info.amountxs == 0">
              {{ scope.name }}
            </div> -->
            <div slot="query-age-dict" slot-scope="data">{{ data.info }}</div>
            <div slot="query-company-autocomplete" slot-scope="data">
              {{ data.info.value }}
            </div>
            <!-- <div slot="header-retailsale">333</div> -->
            <div slot="query-java-customize" slot-scope="data">
              <el-input
                v-model="data.info.val"
                :placeholder="data.info.remark"
              ></el-input>
            </div>
            <!-- <div slot="setting">222</div> -->
            <div slot="more1">更多筛选</div>
            <div slot="goodstags" slot-scope="data">
              {{ data.info }}
            </div>
            <!-- <div slot="g-table">重写表格</div> -->
            <div slot="header-fl2" style="display: inline-flex">77</div>
            <div slot="fl2" style="display: inline-flex">88</div>
            <div
              slot="batch"
              slot-scope="data"
              style="display: inline-flex; margin-right: 10px"
            >
              <el-button type="primary">{{
                "批量" + data.info.length
              }}</el-button>
            </div>
            <!-- <div slot="line-edit">444</div> -->
          </g-table>
        </div>
      </div>
    </div>
    <!--增加form表单-->
    <g-add-form
      :isModel="true"
      :is="isshow"
      :fullscreen="false"
      :formAttrs="currdata"
      :formInfo="formInfo"
      :showFooter="true"
      @saveData="saveData"
      @close="isshow = undefined"
      :commitText="()=>'save'"
      :cancelText="()=>'exit'"
      :showCommitBtn="showCommitBtn"
      :showCancelBtn="true"
      center="center"
      @toDoChange="toDoChange"
      :border="false"
      :showErrMessage="()=>true"
      :justify="()=>true"
    >
      <!-- <div slot="add-title">这里可以替换title</div> -->
      <!-- <div slot="add-footer">这里可以替换footer</div> -->
      <!-- <div slot="label-goodsname" slot-scope="data">
      <div>{{ data.info.title }}</div>
      </div> -->
      <div slot="arrgoodstags" slot-scope="scope">
        <el-input
          :style="`margin-right:1px;width: ${
            (188 - 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>
      <!-- <div slot="goodsname" slot-scope="data">
        <el-input style="width: 188px" v-model="data.info.goodsname"></el-input>
      </div> -->
      <!-- <div slot="spareRBtn" style="display: inline-flex; margin-left: 300px">
        <el-button>右边增加备用按钮</el-button>
      </div> -->
      <div slot="auto-autocomplete" slot-scope="scope">{{ scope.info }}</div>
      <div slot="sex-dict" slot-scope="scope">
        <div>性别:{{ scope.info }}</div>
      </div>
      <div slot="bj1">
        <div style="width: 655px; margin: 0px -54px 0 -10px; display: flex">
          <el-divider><i class="el-icon-mobile-phone"></i></el-divider>
        </div>
      </div>
      <div slot="bj2">
        <div
          :style="`width: 710px;margin: 0px -104px 0 -30px;display: flex;align-items: center;padding-left: 50px;`"
        >
          <span>雨纷纷</span>
          <el-divider direction="vertical"></el-divider>
          <span>旧故里</span>
          <el-divider direction="vertical"></el-divider>
          <span>草木深</span>
        </div>
      </div>
      <div slot="upload-upload">上传</div>
      <div slot="upload-upload-tip">上传提示信息</div>
    </g-add-form>
  </div>
</template>
<script>
import dayjs from "dayjs";
export default {
  name: "HelloWorld",
  props: {
    msg: String,
  },
  data() {
    return {
      currdata: {},
      showCommitBtn: true,
      formInfo: undefined,
      isshow: undefined,
      formAttrs: {
        username: {
          title: "姓名",
          val: "刘麻子",
          required: true,
          width: 202,
          trigger: "change",
          //regular: "[A-Z0-9]{2,5}",
          validate: (a, form) => {
            console.log(form);
            return a.length !== 4;
          },
        },
        age: {
          title: "年龄",
          val: 18,
          number: true,
          width: 202,
          max: 100,
          min: 16,
          trigger: "change",
        },
        company: { title: "公司", val: "", max: 10, width: 202 },
        sex: {
          title: "性别",
          val: "0",
          dicts: [
            { label: "男", value: "1" },
            { label: "女", value: "0" },
          ],
          change: (a, b) => {
            console.log(a);
            console.log(b);
          },
          query: (words, callback) => {
            callback([
              { label: "男", value: "1" },
              { label: "女", value: "0" },
            ]);
          },
        },
        date: {
          title: "日期",
          val: "",
          required: true,
          date: true,
          options: {
            disabledDate(time) {
              return time.getTime() > Date.now() + 12 * 3600 * 7;
            },
            shortcuts: [
              {
                text: "一年后",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() + 12);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "半年后",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() + 6);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一月后",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() + 1);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一周后",
                onClick(picker) {
                  const date = new Date();
                  date.setTime(date.getTime() + 3600 * 1000 * 24 * 7);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "今天",
                onClick(picker) {
                  picker.$emit("pick", new Date());
                },
              },
              {
                text: "昨天",
                onClick(picker) {
                  const date = new Date();
                  date.setTime(date.getTime() - 3600 * 1000 * 24);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一周前",
                onClick(picker) {
                  const date = new Date();
                  date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一月前",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() - 1);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "三月前",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() - 3);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "半年",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() - 6);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一年前",
                onClick(picker) {
                  const date = new Date();
                  date.setMonth(date.getMonth() - 12);
                  picker.$emit("pick", date);
                },
              },
            ],
          },
          //time: true,
          change: (data) => {
            console.log(data);
          },
        },
        time: {
          title: "时间",
          required: true,
          val: "",
          time: true,
          date: true,
          change: (data) => {
            console.log(data);
          },
        },
        leval: {
          title: "等级",
          required: true,
          val: 3,
          radio: [1, 2, 3],
          labels: ["大", "中", "小"],
          change: (data) => {
            console.log(data);
          },
        },
        bj1: { bj: true, itemLabelWidth: 0 },
        hobby: {
          title: "爱好",
          val: [10],
          checkbox: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
          labels: [
            "乒乓球",
            "跑步",
            "吃鱼",
            "打球",
            "开车",
            "看书",
            "打游戏",
            "上网",
            "cosplay",
            "movie",
          ],
          width: 624,
          change: (data) => {
            console.log(data);
          },
        },
        remark: { title: "备注", val: "", area: true, width: 624, max: 200 },
        bj2: { bj: true, itemLabelWidth: 0 },
        email: {
          title: "邮箱",
          val: "[email protected]",
          email: true,
          required: true,
          width: 624,
        },
        auto: {
          title: "自动加载",
          val: "",
          autocomplete: true,
          triggerOnFocus: false,
          popperAppendToBody: true,
          valueKey: "name",
          input: (a, form) => {
            console.log(a, form);
          },
          fetch_suggestions: (querystr, back) => {
            back([{ name: "222" }, { name: "333" }]);
          },
          auto_select: (a, b) => {
            alert(2);
            console.log(a, b);
          },
          width: 624,
        },
        switch: {
          title: "开关",
          switch: true,
          val: 1,
          // trueColor: "red",
          // falseColor: "blue",
          activeValue: 1,
          switchWidth: 100,
          change: (data) => {
            console.log(data);
          },
        },
        upload: {
          title: "上传",
          val: "",
          upload: true,
          fileList: [],
          action: "https://jsonplaceholder.typicode.com/posts/",
          listType: "picture",
        },
      },
      tdata: {
        goodsid: {
          title: "配件ID",
          val: 0,
          number: true,
          //visible: false,
          type: "selection",
        },
        goodstags: {
          title: "标签",
          val: "",
          // col_width: 150,
          suffix: true, // "el-icon-edit",
          prefix: "$",
          password: false,
          disable: true,
          // alwaysShow: true,
          num: -100,
          tooltip: true,
          click: (data) => {
            alert("hello world!");
          },
        },
        amount: {
          alwaysShow: true,
          num: 11,
          title: "数量",
          required: true,
          filterClass: "arrgoodstags",
          editTable: true,
          required: true,
          val: undefined,
          placeholder: "输入数字",
          number: true,
          // regular: "\\d+",
          tooltip: true,
          prefix: "¥",
          col_width: 120,
          required: true,
          trigger: "blur",
          //suffix: "<B style='color:red;'>元</B>",
          click: (data) => {
            //todo()
          },
          change: (data) => {
            console.log(data);
          },
          input: (a, b) => {
            console.log(a, b);
          },
        },
        biaoji: {
          title: "标记",
          sortable: false,
          visible: false,
          filterClass: "arrgoodstags",
          children: [
            { key: "fl1", title: "标记一", val: 1 },
            {
              key: "fl2",
              title: "标记二",
              val: "5555",
              number: true,
              html: (b, a) => {
                return "<div style='color:red'>098</div>";
              },
              // autocomplete: true,
              // valueKey: "name",
              // fetch_suggestions: (querystr, back) => {
              //   back([{ name: "222" }, { name: "333" }]);
              // },
              // auto_select: (a, b) => {
              //   alert(1);
              //   console.log(a, b);
              // },
              width: 624,
            },
          ],
        },
        wareid: {
          title: "配件编号",
          val: 0,
          num: 8,
          number: true,
          visible: false,
          edit: false,
        },
        // arrgoodstags: {
        //   title: "TB标签",
        //   val: ["", "", ""],
        //   sortable: false,
        //   filterClass: "arrgoodstags",
        //   num: -101,
        //   editTable: true,
        // },
        retailsale: {
          title: "成功价",
          val: 0,
          number: true,
          range: [1, 10],
          col_width: 120,
          sortable: false,
          //suffix: "$",
          decimals: 2,
          editTable: true,
          clearable: true,
          required: true,
        },
        goodsname: {
          title: "配件名称",
          val: "555",
          tooltip: true,
          //visible: false,
          // num: 2,
          // max: 5,
          editTable: true,
          col_width: 200,
          formart: "6666",
          style: (a, b, c) => {
            return c % 2 == 0
              ? { color: "red", background: "blue", padding: "10px" }
              : "";
          },
          range: [4, 30],
          change: (a) => {
            console.log(a);
          },
        },
        imgurl: { title: "图片路径", val: "mall/00ef4g", tooltip: true },
        sale: {
          title: "销售价",
          val: 865.0,
          number: true,
          // decimals: 2,
          // suffix: "$",
          prefix: "¥",
          editTable: true,
          change: (v) => {
            console.log(v);
          },
        },
        amountxs: {
          title: "销售数量",
          val: 20,
          number: true,
          editTable: true,
          placeholder: "20-60之间",
          // range: [20, 60],
          col_width: 120,
          //regular: "[2-5]\\d",
          suffix: "$",
        },
        statetag: {
          title: "状态",
          val: 1,
          tooltip: true,
          dicts: [{ label: "禁用", value: 0 }],
        },
        jbstr: {
          title: "角标",
          val: "",
          width: 624,
          placeholder: "请输入a",
          clearable: true,
          // regular: "[a]",
          required: true,
          editTable: true,
        },
        remark: {
          title: "备注",
          val: "Thermo King 。",
          tooltip: true,
          area: true,
          width: 624,
          num: 10000,
          max: 200,
        },
      },
      queryInfo: {
        vis: {
          val: "99",
          remark: "888",
          label: "测试",
          inVisible: true,
        },
        test: {
          val: "",
          remark: "测试查询",
          clearable: true,
          label: "测试查询",
          more: true,
          //labelWidth: 400,
          //width: 300,
        },
        username: {
          val: "",
          remark: "请输入姓名",
          label: "请输入姓名",
          date: true,
          //width: 1000,
          more: true,
          //labelWidth: 400,
        },
        age: {
          val: 0,
          remark: "年龄查询",
          label: "年龄查询",
          dicts: [
            { label: "男", value: 0 },
            { label: "女", value: 1 },
          ],
          query: (a, b) => {
            b([
              { label: "男", value: 0 },
              { label: "女", value: 1 },
            ]);
          },
          change: (form, item) => {
            console.log(form);
            console.log(item);
          },
        },
        maxdate: {
          val: "",
          remark: "开始时间",
          label: "开始时间",
          clearable: true,
          date: true,
          more: true,
          dateOptions: {
            disabledDate(time) {
              return time.getTime() > Date.now();
            },
            shortcuts: [
              {
                text: "今天",
                onClick(picker) {
                  picker.$emit("pick", new Date());
                },
              },
              {
                text: "昨天",
                onClick(picker) {
                  const date = new Date();
                  date.setTime(date.getTime() - 3600 * 1000 * 24);
                  picker.$emit("pick", date);
                },
              },
              {
                text: "一周前",
                onClick(picker) {
                  const date = new Date();
                  date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
                  picker.$emit("pick", date);
                },
              },
            ],
          },
          change: (a) => {
            console.log(a);
          },
        },
        mindate: {
          val: "",
          remark: "结束时间",
          label: "结束时间",
          clearable: true,
          date: true,
          more: true,
        },
        timespan: {
          keys: ["atime", "atime1"],
          vals: [new Date(), new Date()],
          remark: "时间段查询",
          label: "时间段查询",
          clearable: true,
          daterange: true,
          more: true,
          width: 240,
          change: (a, b) => {
            console.log(a, b);
          },
        },
        bs: {
          keys: ["btime", "btime1"],
          vals: ["", ""],
          remark: "时间段查询",
          label: "时间段查询",
          clearable: true,
          daterange: true,
          more: false,
          width: 240,
          change: (val) => {
            console.log(val);
          },
        },
        company: {
          key: "company",
          val: "",
          remark: "自动查询",
          label: "自动查询",
          //valueKey: "value",
          autocomplete: true,
          fetch_suggestions: (a, b) => {
            b([{ value: 122 }]);
          },
          auto_select: (iten) => {
            alert(iten);
          },
        },
        java: {
          val: "",
          remark: "定制",
          label: "定制",
          customize: true,
          more: true,
        },
      },
      sumData: { amount: 0, goodstags: "合计" },
      defaultProps: {
        label: "cbname",
        children: "list",
        isLeaf: (data) => {
          return data.lastnode == 1;
        },
      },
      tree_col: [
        { key: "superior", title: "上级" },
        { key: "itemName", title: "名称" },
      ],
      selectRow: [],
    };
  },
  methods: {
    rowSave(row, index, back) {
      console.log(row, index);
      back(4);
    },
    batchHandle(data) {
      console.log(data);
    },
    tbselect(selection) {
      console.log(selection);
    },
    drop({ oldIndex, newIndex }) {
      console.log({ oldIndex, newIndex });
    },
    treeAdd(node, data) {
      this.tree_col[0].edit = true;
      data.superior = node.cbname;
    },
    treeUpdate(node, data) {
      this.tree_col[0].edit = false;
      data.itemName = node.cbname;
    },
    treeSaveData(data, back) {
      back(true);
    },
    async loadDataById(node, resolve) {
      if (node.level == 0) {
        return resolve([
          {
            pcbid: 0,
            cbid: 0,
            cbname: "所有品牌",
            lastnode: 0,
            id: 0,
          },
        ]);
      } else {
        return resolve([
          {
            cbname: "长安",
            pcbid: 0,
            cbid: 100,
            noused: 0,
            lastnode: 0,
            fullname: "长安",
          },
          {
            cbname: "比亚迪",
            pcbid: 0,
            cbid: 101,
            noused: 0,
            lastnode: 0,
            fullname: "比亚迪",
          },
          {
            cbname: "哈弗",
            pcbid: 0,
            cbid: 191,
            noused: 0,
            lastnode: 0,
            fullname: "哈弗",
          },
          {
            cbname: "日产",
            pcbid: 0,
            cbid: 211,
            noused: 0,
            lastnode: 0,
            fullname: "日产",
          },
          {
            cbname: "奥迪",
            pcbid: 0,
            cbid: 225,
            noused: 0,
            lastnode: 0,
            fullname: "奥迪",
          },
          {
            cbname: "奔驰",
            pcbid: 0,
            cbid: 302,
            noused: 0,
            lastnode: 0,
            fullname: "奔驰",
          },
        ]);
      }
    },
    tableRowClassName({ row, rowIndex }) {
      let styleRes = {
        // background: "red !important",
      };
      return styleRes;
    },
    bb() {
      //return "bb";
      return "";
    },
    rowClick(row, column, event) {
      // console.log(row);
      // console.log(column);
      // console.log(event);
    },
    toDoChange(data) {
      if (data.ov.sale !== undefined && data.nv.sale != data.ov.sale) {
        // console.log(data.nv.sale + "---" + data.ov.sale);
      }
    },
    dbRowClick(a, b, c, d) {
      d(true);
      alert("dbclick default ok");
    },
    //测试表单
    test() {
      this.currdata = this.formAttrs;
      this.formInfo = undefined;
      this.isshow = "g-add-form";
    },
    //初始数据
    async load(obj, callback) {
      obj.pagesize = 5;
       let { list, total } = demoData.data;
      let page = parseInt(obj.page);
      console.log(obj.page, obj.pagesize);
      callback(list.filter((a, index) => index > (page - 1) * 10 && index < (page * 10)), total, (a, b) => a.goodsid == b.goodsid);
      this.sumData = {
        amount: 1022200,
        goodstags: "合计",
        remark: "合计备注",
        remark1: "合计备注",
        retailsale: 3000,
      };
    },
    //增加
    add() {
      this.formInfo = undefined;
      this.currdata = this.tdata;
      this.showCommitBtn = true;
      this.isshow = "g-add-form";
    },
    //删除
    del(data, callback) {
      alert("ok");
      callback(true);
      //callback("删除失败了");
    },
    //编辑
    edit(data) {
      let dict = this.tdata.statetag.dicts;
      dict.dicts = [{ label: "禁用", value: 1 }];
      dict.val = data.statetag;
      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, callback) {
      //alert("保存成功,请在这里处理数据保存!");
      // callback(false);
      // this.isshow = undefined;
    },
  },
  mounted() {
    //this.$refs.ttb.get_data_list(1, { aa: "55" });
  },
};
</script>

表单参数列表

| 参数 | 说明 | 类型 | 默认值 | 可选值 | | :------------- | :------------------------------------------------------------------------ | :------: | :--------------------------------------: | :---------------- | | isModel | 是否弹窗 | Boolean | true | true,false | | fullscreen | 全屏 | Boolean | false | --- | | title | 表单标题 | String | 新增 | String | | formAttrs | 表单项属性(详情见表单项参数列表) | Object | {} | --- | | formInfo | 编辑实体 | Object | {} | --- | | width | 表单宽度 | Number | 720 | --- | | isreadonly | 是否禁用表单 | Boolean | false | --- | | center | 底部操作按钮是否居中 | Function | center | center,left,right | | commitText | 提交按钮文本 | Function | 提交 | --- | | cancelText | 取消按钮文本 | Function | 取消 | --- | | showCommitBtn | 是否显示提交按钮 | Boolean | true | --- | | showCancelBtn | 是否显示取消按钮 | Boolean | true | --- | | showFooter | 是否显示底部操作按钮 | Boolean | true | --- | | itemWidth | 表单项宽度 | Number | 308 | --- | | labelWidth | 表单项标题宽度 | Number | 120 | --- | | border | 表单表格是否显示边框 | Boolean | false | true,false | | showErrMessage | 是否显示验证错误信息 | Function | false | true,false | | justify | 表单label是否分散对齐 | Function | false | true,false | | btnType | 设置表单操作列按钮类型 例如 {commit:{type:'info'},cancel:{type:'danger'}} | Object | primary-success-warning-danger-info-text | ['text'] |

表单项参数列表

| 参数 | 说明 | 类型 | 默认值 | | :----------------: | :--------------------------------------------------------------------------------------------------- | :--------------------------- | :--------: | | key | 表单项绑定值 key (formAttrs.key值),后面所有项是value值 如:model:{key:'key1',{title:'t1',val:'v1'}} | String | --- | | title | 表单项标题 | String | --- | | val | 表单项的值 | any | any | | change | 表单项值改变触发事件 | Function(data)参数是表单数据 | undefined | | ------- | 表单项默认类型是 text 类型,input 输入框 | ----- | ---- | | width | 表单项宽度 | Number | undefined | | labelWidth | lable 宽度 | Number | 100 | | 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 | 时间输入框 date:true,time:true | Boolean | undefined | | dateOptions | 时间日期选择器特有的选项 通过一个方法返回一个对象 | Function(form) | {} | | dicts | 选择框初始值。格式[{label:title,value:val}] | Array | [] | | query | 选择框查询方法,执行 callBack 方法赋值给 dicts | Function(words,callBack) | undefined | | defaultEmpty | 默认设空值,否则默认为第一项 | true,false,undefined | undefined | | area | 多行方本框 | Boolean | undefined | | radio | 单选框 | Array | [] | | checkbox | 多选框 | Array | [] | | labels | 单选框和多选框有效,显示单选框和多选框字段,和 values 数组长度等长 | Array | [] | | switch | 开关 | Boolean | undefined | | trueColor | 开关有效,选中时背景色 | String | #13ce66 | | falseColor | 开关有效,未选中时背景色 | String | #ff4949` | | switchWidth | 开关有效,开关长度 | number | --- | | autocomplete | 输入建议框 | Boolean | undefined | | fetch_suggestions | 建议框有效,callback([])返回建议数组 | Function(words,callback) | undefined | | auto_select | 建议框有效,处理数选中后操作 | Function(item,items) | undefined | | valueKey | 建议框有效,输入建议对象中用于显示的键名 | string | value | | popperClass | Autocomplete 下拉列表的类名 | string | ----- | ---- | | triggerOnFocus | 是否在输入框 focus 时显示建议列表 | Boolean | true,false | true | | popperAppendToBody | 是否将下拉列表插入至 body 元素。在下拉列表的定位出现问题时,可将该属性设置为 false | Boolean | true,false | true | | bj | 标记项,可以设置分割线,ui 其他标记 | Boolean | undefined | | upload | 文件上传,参数详见 element-ui-upload 文档 | true | undefined | | goAdd | 选择框搜索为空时定义方法 | Function(form,item) | undefined |

表单 Events

| 事件名称 | 说明 | 回调参数 | | :------: | :------------------- | :------------ | | saveData | 保存表单数据 | form 对象数据 | | close | 关闭表单窗体执行事件 | --- |


validate 验证

| 校验规则 | 说明 | 值 | | :------: | :------------------------- | :------------------------------------------------------------------------------------------------------- | | required | 不能为空 | true,false | | email | 邮箱格式 | true,false | | url | 网址 | true,false | | len | 字符串长度 | number | | range | 数字范围 | anrry 例如:[10,20] 数字类型验证范围,字符串验证长度范围 | | max | 字符串最大长度或数字最大值 | number | | min | 数字最小值 | number | | regular | 正则表达式 | string 例如:'[a-z]' | | validate | 自定义验证 | function(val,form){return true} 返回 true(验证通过) 或 false(验证未通过,默认消息)或string(错误消息) |

表单自定义验证示例

formAttrs: [
  {
    key: "name",
    title: "姓名",
    val: "",
    required: true, //必填
    //自定义验证
    validate: (val)=>{ return true}
    },
  },
  { 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="180">
  <div slot="name">这里可以放任何HTML</div>
  <div slot="age">这里替换编辑控件</div>
</g-add-form>

| name | 说明 | | :-------------------: | :--------------------- | | item.key | 重写表单项 | | label-item.key | 重写表单项 label | | add-title | 重写弹窗标题 | | add-footer | 重写弹窗 footer | | item.key-dict | 重写 Select 控件显示项 | | item.key-autocomplete | 重写建议框显示项 | | item.key-upload | 重写上传点击按钮 | | item.key-upload-tip | 重写上传提示文本 | | spareLBtn | 在提交和取消前面增加UI | | spareRBtn | 在提交和取消后面增加UI |


表格参数列表

| 参数 | 说明 | 类型 | 可选值 | 默认值 | | :----------------: | ------------------------------------------------------------------------------------- | :------: | ----------------------------------------------------- | ---------- | | tableAttrs | 表格 column 属性数组(见表格 column 属性) | Object | {} | [] | | height | 计算表格高度 100vh-height=table 的高度 | Number | ---() | 100 | | fixedHeight | 表格固定高度 | string | px % vh calc | undefined | | btnsWidth | 表格行操作按钮宽度 | Number | --- | 185 | | sort | 排序对象{key:参数名,value:排序方式(字段名 asc,desc)} | Object | undefined --- | --- | | page_align | 分页条显示方式 | Function | left ,center, right | center | | disFuncs | 过滤表格功能[操作,编辑,删除,查看,分页,表头,查询,更多] | Array | [control,edit, del,read,page,setting,query,core] | undefined | | suffix | 表名后缀,一个页面多个表格时需要增加 | String | --- | --- | | btnType | 设置表格操作列按钮类型 例如 {add:{type:'info'},edit:{type:'danger'}} | Object | primary / success / warning / danger / info / text | ['text'] | | row_Drop | 行拖拽 | Boolean | true,false | false | | queryInfo | 表格检索对象数组,项属性见后面检索项文档 | Array | --- --- | --- | | queryH | 是否横向生成检索框组,否则纵向生成检索框组 | Number | --- | 200 | | leftWidth | 左侧查询宽度 竖形查询时有效 | Boolean | true,false --- | --- | | queryLabel | 是否显示查询 label | Boolean | true,false --- | true | | queryLabelWidth | 查询 label 宽度 | Function | --- | 0 | | queryInputWidth | 查询输入框宽度 | Function | --- | 0 | | justify | 查询标题分散对齐 | Function | undefined --- | --- | | popoverWidth | 查询弹窗宽度 | String | 150px | --- | | popoverOffset | 查询弹窗偏移量 | Number | --- | --- | | sumData | 合计 格式:{key:val} | Object | --- | undefined | | rowStyle | 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。 | Function | Function({row, rowIndex})/Object | --- | | rowClassName | 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。 | Function | Function({row, rowIndex})/String | --- | | cellStyle | 单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style。 | Function | Function({row, column, rowIndex, columnIndex})/Object | --- | | cellClassName | 单元格的 className 的回调方法,也可以使用字符串为所有单元格设置一个固定的 className。 | Function | Function({row, column, rowIndex, columnIndex})/String | --- | | pagesizeList | pagesize list | Array | [5, 10, 15, 20, 50, 100] | --- | | batchName | 批量处理按钮文字 | String | ---- | '批量处理' | | editTable | 开启表格编辑 | Boolean | ---- | false | | show-message | 表格编辑时,是否显示验证错误消息 | Boolean | ---- | false | | set-width | 设置列宽度 | Function | --- | 516px | | control-align | 操作列样式,对齐方式, | Function | --- | --- | | d-width | 表格默认列宽, | Function | --- | 120px | | horizontalShowBtns | 是否横向显示查询按钮和操作按钮 | Boolean | true,false | false |

表格 column 属性

| 参数 | 说明 | 类型 | 可选值 | 默认值 | | :---------: | ---------------------------------------------------------------------------------------------------------- | :-------------: | ---------------------- | ---------- | | key | 表单项绑定值 key (tableAttrs.key值),后面所有项是value值 如:tableAttrs:{key:'key1',{title:'t1',val:'v1'}} | String | --- | | title | 对应列显示的标题 | String | --- | --- | | val | 对应列值 | any | --- | --- | | type | selection 显示多选框;index 显示该行的索引;expand 显示为一个可展开的按钮 | String | selection/index/expand | --- | | 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 | | labelWidth | 表格项标题宽度 | Number | | undefined | | headerAlign | 表头对齐方式,若不设置该项,则使用表格的对齐方式 | Number | | ---- | | format | 时间格式化 | string | | dayjs 格式 | | prefix | 前缀 | string | ---- | ----- | | suffix | 后缀 | string | ---- | ----- | | decimals | 小数位数 | Number | number | 0 | | pad | decimals时,是否用0填充小数位数 | Boolean | true,false | true | | style | 样式 style(value,row,index) | function | --- | --- | | html | 自定义 html(value,row,index) | function | --- | --- | | alwaysShow | 表格设置时永远显示 | Boolean | true,false | --- | | editTable | 编辑模式 | Boolean | true,false | --- | | clearable | 编辑模式下可清空输入 | Boolean | true,false | --- |

表格 检索项 属性

| 参数 | 说明 | 类型 | 可选值 | 默认值 | | :----------------: | ---------------------------------------------------------------------------------- | :-------------: | -------------------- | -------- | | key | 检索 key,传入后台的参数名称 | String 或 Array | --- | --- | | val | 检索值,传入后台的参数值 | String 或 Array | --- | --- | | remark | 标识检索项名称 | String | --- | --- | | label | label 文本 | String | --- | --- | | labelWidth | label 文本长度 | Number | --- | 100 | | inVisible | 不显示,只传参数 | Boolean | true,false | undefend | | more | 生成更多查询,要在表格属性disFuncs中开启more | boolean | true,false | --- | | date | 生成时间检索框 | Boolean | true,false,undefined | --- | | daterange | 生成时间段检索框 [key1,key2] [val1,val2] | Boolean | true,false,undefined | --- | | dicts | 生成选择检索框初始对象数组 | Array | --- | --- | | query | 选择检索框的数据源 | function | words,callback | --- | | daterange | 生成时间段检索框 key 为数组,val 为数组[key1,key2],[val1,val2] | String | --- | --- | | autocomplete | 生成建议检索框 | Boolean | true,false,undefined | --- | | valueKey | 建议框有效,输入建议对象中用于显示的键名 | string | value | | fetch_suggestions | 获取建议检索框数据源 | Function | words,callback | --- | | auto_select | 建议检索框项选中处理事件 | Function | item,itmes | --- | | popperClass | Autocomplete 下拉列表的类名 | string | ----- | ---- | | triggerOnFocus | 是否在输入框 focus 时显示建议列表 | Boolean | true,false | true | | popperAppendToBody | 是否将下拉列表插入至 body 元素。在下拉列表的定位出现问题时,可将该属性设置为 false | Boolean | true,false | true | | customize | 生成自定义元素,重写自定义检索项 query-item.key-customize | Boolean | true,false | true |

表格检索项重写 Slot

| name | 说明 | | :-------------------------: | :------------------- | | query-item.key-dict | 重写选择检索框项显示 | | query-item.key-autocomplete | 重写建议框项显示 | | query-item.key-customize | 自定义检索项 |

Table Events

| 事件名 | 说明 | 参数 | | :--------------: | -------------------------------------------- | :-------------------------------------------------------------------------------------------- | | load | 加载表格数据 | {page,pagesize},callBack(list,total) | | add | 新增 | ----- | | edit | 编辑 | rowData,callBack | | del | 删除 | rowData,callBack | | read | 查看详情 | rowData | | dbclick | 行双击事件 | row,column | | qx | 设置表格操作编辑,删除,查看,保存权限 | item,callback 两个参数,参数 item 传入表格项,callback 返回{edit=>true,del=>true,read=>true} | | row-click | 当某一行被点击时会触发该事件 | row, column, event | | select | 当用户手动勾选数据行的 Checkbox 时触发的事件 | selection, row | | select-all | 当用户手动勾选全选 Checkbox 时触发的事件 | selection | | selection-change | 当选择项发生变化时会触发该事件 | selection | | batch-handle | 表格多选事件 | selectedRows | | row-save | 表格行编辑保存 | row,index,callback callback传入一个参数true,则处理回调,不传或非true则弹出默认保存消息提示 |

Table Slot 表单 column 各项都可以用插槽重写,slot name=item.key

<g-table :tableAttrs="tdata" :height="180" :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 | 说明 | | :-------------: | :----------------------- | | g-table | 重写表格 | | item.key | 重写表格 column | | header-item.key | 重写表格 column 标题 | | add | 重写增加功能 | | addleft | 在新增左边增加功能 | | addright | 在新增右边增加功能 | | query | 重写查询功能 | | read | 重写查看详情功能 | | edit | 重写编辑功能 | | del | 重写删除功能 | | lbtn | 在操作按钮组左边增加功能 | | rbtn | 在操作按钮组右边增加功能 | | page | 重写分页条 | | setting | 重写表头设置 | | more | 重写更多查询 | | more1 | 重写更多查询(弹层样式) | | batch | 批量操作 |


tree attribute

| 参数 | 说明 | 类型 | 可选值 | 默认值 | | :------------------: | ---------------------------------------------------- | :---------------------: | ------ | ------ | | treeData | 展示数据 | array | --- | --- | | iconClass | 自定义树节点的图标 | string | --- | --- | | lazy | 是否懒加载子节点,需与 load 方法结合使用 | boolean | --- | false | | nodeKey | 每个树节点用来作为唯一标识的属性,整棵树应该是唯一的 | String | --- | --- | | indent | 相邻级节点间的水平缩进,单位为像素 | number | --- | 20 | | load | 加载子树数据的方法,仅当 lazy 属性为true 时生效 | function(node, resolve) | --- | --- | | props | 配置选项 | object | --- | --- | | expand-on-click-node | 是否在点击节点的时候展开或者收缩节点, | boolean | --- | true | | check-on-click-node | 是否在点击节点的时候选中节点 | boolean | --- | false | | add-form-width | 增加或修改节点弹窗宽度 | number | --- | 410 | | tree-columns | 增加节点或修改节点实体属性(见表格项属性) | Object | --- | --- |

tree Events

| 事件名 | 说明 | 参数 | | :--------------: | -------------------------------------- | :------------------------------------------------------------------------------------------------------------------- | | node-click | 节点被点击时的回调 | (data, node, self) | | node-contextmenu | 当某一节点被鼠标右键点击时会触发该事件 | (event, data, node, self, (edit, del,isAddNext) => {this.isdel = del;this.isedit = edit;this.isAddNext=isAddNext;})) | | add-next | 打开增加节点窗口 | (node,treeItemData) | | update | 打开修改节点窗口 | (node, treeItemData) | | delete | 删除节点事件 | (node,callback(tree或msg)) | | saveData | 保存节点事件 | (data,callback(true或msg) |

tree Slot

| name | 说明 | | :----: | :---------------------------------------- | | ------ | 自定义树节点的内容,参数为 { node, data } |

项目地址

点击跳转至 GITHUB

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

QQ