vue自定义封装table表格

 封装如下:

<template>
  <div>
    <el-table ref="multipleTable" v-bind="$attrs" highlight-current-row fit stripe v-on="$listeners">
      <template v-for="(item, index) in columns">
        <!--   表格特殊列     -->
        <el-table-column v-if="['index', 'selection'].includes(item.type)" :key="`columns_${index}`" v-bind="item"/>
        <!--   表格数据列     -->
        <el-table-column v-else :key="`columns_${index}`" v-bind="item">
          <template v-slot="scope">
            <slot :name="`${item.prop}`" :row="scope.row">
              <span v-if="item.func" class="func-data">{{ item.func(scope) }}</span>
              <span v-else class="plain-data">{{ scope.row[item.prop] }}</span>
            </slot>
          </template>
        </el-table-column>
      </template>
    </el-table>
  </div>
</template>
<script>
/**
 * table组件封装
 * @columns {array} table lable显示的标题 对应的数组的key等信息
 * columns 属性兼容 element ui el-table-columns 的现有属性
 *   func  自定义方法
 *   columns slot的优先级高,有自定义方法处理自定义方法,无自定义方法显示数据
 *
 * tips:v-slot语法不支持vue2.6以下
 */
export default {
  props: {
    columns: {
      type: Array,
      default: () => {
        return []
      },
      required: true
    }
  },
  data() {
    return {}
  },
  methods: {
    /**
     * 调用当前页面的方法
     * event {string} 方法名
     * params {string | function} 参数或者回调方法
     */
    events(event, params = {}) {
      if (!event) {
        return console.error('events方法最少一个参数')
      }
      if (!this.$refs.multipleTable[event]) {
        return console.error(`${event}不是一个方法`)
      }
      this.$refs.multipleTable[event](params)
    }
  }
}
</script>

调用如下:

    <!-- 表格 -->
    <i-table ref="table" :data="data" :columns="columns" :key="tableKey">
      <template slot="status" slot-scope="{ row }">
        <el-tag v-if="row.commonGoodBrandStatus === 0">启用</el-tag>
        <el-tag v-if="row.commonGoodBrandStatus === 1" type="danger">停用</el-tag>
      </template>
      <template slot="img" slot-scope="{ row }">
        <el-image :src="imgChange(row)" style="width: 100px; height: 100px"/>
      </template>
      <template slot="action" slot-scope="{ row }">
        <el-button size="small" type="primary" @click="openDetailInfo(row)">详情</el-button>
        <el-button size="small" type="primary" @click="updateBrandInfo(row,0)">编辑基本信息</el-button>
        <el-button size="small" type="primary" @click="updateBrandInfo(row,1)">编辑资质</el-button>
        <el-button size="small" type="primary" @click="updateModeInfo(row)">编辑型号</el-button>
      </template>
    </i-table>
columns: [
        {
          type: 'index',
          label: '序号',
          width: '50',
          align: 'center'
        },
        {
          label: '中文名',
          prop: 'commonGoodBrandCnname'
        },
        {
          label: '英文名',
          prop: 'commonGoodBrandEnname'
        },
        {
          label: '别名',
          prop: 'commonGoodBrandAlias'
        },
        {
          label: '首字母',
          prop: 'commonGoodBrandFirstname'
        },
        {
          label: 'logo',
          prop: 'img'
        },
        {
          label: '状态',
          prop: 'status'
          // func: this.getStatus
        },
        {
          label: '操作',
          prop: 'action',
          width: '400'
        }
      ],

效果如图:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue3 的封装 Table 可以使用 `defineComponent` 和 `ref` 来实现。以下是一个简单的例子: ```vue <template> <table class="table"> <thead> <tr> <th v-for="header in headers" :key="header">{{ header }}</th> </tr> </thead> <tbody> <tr v-for="(row, index) in data" :key="index"> <td v-for="(value, key) in row" :key="key">{{ value }}</td> </tr> </tbody> </table> </template> <script> import { defineComponent, ref } from 'vue'; export default defineComponent({ props: { headers: { type: Array, required: true, }, data: { type: Array, required: true, }, }, setup(props) { const headers = ref(props.headers); const data = ref(props.data); return { headers, data, }; }, }); </script> ``` 在这个例子中,我们定义了两个 props:`headers` 和 `data`,分别表示表格的列头和数据。在 setup 函数中,我们使用 `ref` 将这两个 props 转化为响应式数据。在模板中,我们使用 `v-for` 渲染表头和数据。 ### 回答2: Vue3 封装 Table 是一种将表格组件进行抽象和封装,以便在项目中复用的技巧。 首先,我们可以通过 Vue 的组件开发方式来创建一个 Table 组件。在组件中,我们可以定义表格的数据源,表头信息以及表格样式等。 接下来,我们可以在组件中使用 Vue3 的 Composition API 来定义一些功能函数,例如:排序、筛选、分页等。这些功能函数可以根据不同的需求进行扩展和定制,使得 Table 组件更加灵活和易用。 在渲染表格时,我们可以使用 v-for 指令遍历数据源,并根据表头信息动态生成表格的列。同时,根据需要,我们可以使用 v-bind 指令动态绑定表格的样式和类名,以实现样式定制和多样化的展示效果。 此外,我们还可以为 Table 组件增加一些交互功能,例如:点击表头排序、点击某一行获取详情等。这些交互功能可以通过自定义事件(Event)来实现,使得 Table 组件可以更好地与其他组件进行配合和集成。 最后,封装好的 Table 组件可以在项目中进行复用,通过简单地传入不同的数据源和表头配置,就可以实现不同的表格展示效果。同时,我们也可以通过插槽(Slot)机制,让 Table 组件更加灵活地支持自定义的内容展示和布局。 总结起来,通过合理地利用 Vue3 的组件化特性和 Composition API,我们可以封装一个灵活、易用且可复用的 Table 组件,帮助我们更高效地完成项目开发中的表格展示需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值