首页 > 其他分享 >vue2 对vxe-table组件二次封装并全局引入

vue2 对vxe-table组件二次封装并全局引入

时间:2023-05-11 09:36:50浏览次数:40  
标签:const vxe column filterTags vue2 vxeGrid table slots columns

要求

新组件的写法要和旧组件保持一致,
那么保留原本的插槽,属性,方法
写法如下,以vxe-table为例

组件封装

<template>
  <vxe-grid ref="vxeGrid" v-bind="$attrs" v-on="$listeners" @filter-change="filterChange">
    <template v-for="slot in slots" #[slot]="data">
      <slot :name="slot" v-bind="data"></slot>
    </template>
    <template #bottom v-if="filterTags.length">
      <div class="filter-tags">
        <transition-group class="transition">
          <el-tag
            v-for="tag in filterTags"
            :key="tag.title"
            closable
            @close="filterClose(tag)"
          >
            {{ tag.title }}
          </el-tag>
        </transition-group>

        <el-button
          class="filter-tags-btn"
          size="small"
          icon="el-icon-delete"
          @click="clearFilterGroup"
          >清空</el-button
        >
      </div>
    </template>
  </vxe-grid>
</template>

js部分

<script>
export default {
  name: 'YmsTable',
  components: {},
  data() {
    return {
      // 此处放置不定义在columns中的插槽枚举
      staticSlots: ['form', 'toolbar', 'top', 'bottom', 'pager'],
      filterTags: []
    };
  },
  computed: {
    slots() {
      const columns = this.$attrs.columns;
      // 获取定义在columns上的插槽
      const extendSlot = [];
      columns.forEach(col => {
        if (col.slots) {
          const slots = Object.values(col.slots);
          extendSlot.push(...slots);
        }
      });
      return [...this.staticSlots, ...extendSlot];
    }
  },
  created() {},
  mounted() {
    this.initVxeMethod();
  },
  methods: {
    // 暴露vxe-grid的方法
    initVxeMethod() {
      const vxeGrid = this.$refs.vxeGrid;
      Object.entries(vxeGrid).forEach(e => {
        const [key, value] = e;
        if (typeof value === 'function') {
          this[key] = this[key] || value;
        }
      });
    },
    // 筛选
    filterChange({ filterList }) {
      this.filterTags = [];
      filterList.map(val => {
        this.filterTags.push({
          title: `${val.column.title}:${val.datas.join('')}`,
          column: val.column
        });
      });
    },
    filterClose(tag) {
      this.filterTags.splice(this.filterTags.indexOf(tag), 1);
      this.$refs.vxeGrid.clearFilter(tag.column);
    },
    clearFilterGroup() {
      if (this.$refs.vxeGrid.isFilter()) {
        this.$refs.vxeGrid.clearFilter();
      }
      this.filterTags = [];
    }
  }
};
</script>

全局引入

在mian.js中

import Vue from 'vue';
import YmsTable from '@/component/ymsTable/index.vue';
Vue.component('YmsTable', YmsTable);

使用

和原本的写法保持一致

<yms-table
  ref="vxeGrid"
  :data="tableData"
  v-bind="gridOptions"
  :export-config="{}"
  @cell-click="cellClick"
  @sort-change="sortChange"
  @filter-change="filterChange"
>
  <template #pager>
    <vxe-pager
      :layouts="[
        'Sizes',
        'PrevJump',
        'PrevPage',
        'Number',
        'NextPage',
        'NextJump',
        'FullJump',
        'PageCount',
        'Total'
      ]"
      :current-page.sync="searchData.pageIndex"
      :page-sizes="$FeePageSizes"
      :page-size.sync="searchData.pageSize"
      :total="searchData.total"
      @page-change="handlePageChange"
    >
    </vxe-pager>
  </template>
  <template #operate="{ row }">
    <div class="operate">
      <button-group-custom
        :btn-data="btnData1"
        @btnClick1="editButton(row)"
      ></button-group-custom>
    </div>
  </template>
</yms-table>

标签:const,vxe,column,filterTags,vue2,vxeGrid,table,slots,columns
From: https://www.cnblogs.com/code-R/p/17387033.html

相关文章

  • table中的td在有文字填充和没有文字填充的情况下差1px
    table{width:100%;border-collapse:collapse;theadtr{height:40px;line-height:39px;border-bottom:1pxsolid#dddddd;font-weight:bold;background-color:#f0f4f5;}tbodytr{height:40px;line-height:39px;......
  • Stable Diffusion 的随机种子 seed
    seed参数允许您指定一个随机种子,将用于初始化图像生成过程。相同的种子值每次都会产生相同的图像集,这对于再现性和一致性很有用。如果将种子值保留为-1,则每次运行文本-图像特性时将生成一个随机种子。最重要的是,具有相同参数、prompt和seed将产生完全相同的图像。多亏了这......
  • Oracle之table()函数的使用,提高查询效率
    目录一、序言二、table()函数使用步骤三、table()具体使用实例3.1table()结合数组使用3.2table()结合PIPELINED函数(这次报表使用的方式)3.3table()结合系统包使用一、序言前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的......
  • Android学习|布局——TableLayout 表格布局
    一、概述TableLayout:即表格布局。当TableLayout下面写控件、则控件占据一行的大小。(自适应一行,不留空白)但是,想要多个组件占据一行,则配合TableRow实现 如下,设置三个button,其宽度为match_parent、按道应该不占据一行,而却一个button占了一整行<?xmlversion="1.0"encoding......
  • 布局——TableLayout 表格布局
    常见属性1、android:collapseColumns:设置需要被隐藏的列的序号,从o开始2、android:stretchColumns:设置允许被拉伸的列的列序号,从o开始3、android:shrinkColumns:设置允许被收缩的列的列序号,从o开始4、子控件设置属性a、android:layout_column:显示在第几列b、android:layout......
  • Stable Diffusion 反向提示词 Negative prompts
    反向提示词(Negativeprompts)用于描述图片中不希望出现的内容。常用于阻止生成特定的事物、样式或修复某些图像异常。下面是一些例子从“宁静的精灵森林”中移除“苔藓”宁静的精灵森林peacefulelvenforest,thickforest,largelivingtreesarevisibleinthebackgro......
  • Vue2没有`public`文件夹,该怎么建资源文件,编译后不被压缩
    在Vue2项目中,如果没有`public`文件夹,可以在项目根目录下创建一个`static`文件夹来存放静态资源文件,如JS、CSS、图片等。 如果你想在打包后不压缩JS文件,并且这个JS文件是在HTML中通过`script`标签引用的,可以按照以下步骤进行操作: 1.在`static`文件夹下创建一个`js`文件夹,并......
  • Vue2项目中,在编译打包后通过读取配置文件,任意修改接口地址
    可以按照以下步骤进行操作: 1.在项目根目录下创建一个名为`config`的文件夹,并在该文件夹下创建一个名为`index.js`的文件,用来存放配置文件,如: ```javascriptmodule.exports={  apiRoot:'http://api.example.com'}``` 这里定义了一个`apiRoot`属性,用来存放接口地......
  • mysql中删除时报错Cannot truncate a table referenced in a foreign key constraint
    在Mysql使用Truncate截断表时,提示Cannottruncateatablereferencedinaforeignkeyconstraint(monitoritem,CONSTRAINTmonitortaskpollutant_monitortask_fk)。这是因为存在外键约束导致的无法删除,我们可以先关闭外键约束,删除后再启动外键约束。1、检查外键约束SELE......
  • Event Tables for Efficient Experience Replay
    Abstract事件表分层抽样(SSET),它将ER缓冲区划分为事件表,每个事件表捕获最优行为的重要子序列。我们证明了一种优于传统单片缓冲方法的理论优势,并将SSET与现有的优先采样策略相结合,以进一步提高学习速度和稳定性。在具有挑战性的MiniGrid域、基准RL环境和高保真赛车模拟器中的实......