h5封装table表格 vue

vue2

table表格

因某些原因,开发时总是需要在h5页面上开发表格, 所以就自己封装了一个, 这样就便于维护.一下直接提供源码, 不足之处, 请不吝赐教.

先来看看效果图:
在这里插入图片描述
在这里插入图片描述

以下为源码:
<template>
  <div
      class="cuTable"
      :style="{
        ...scroll && {
          overflowX: 'scroll'
        },
        ...!scroll && {
          overflow: 'hidden'
        }
      }"
  >
    <div :class="border ? 't-table_border' : ''">
      <table :class="round ? 't-table_th_round' : ''">
        <tr v-if="tableTitle">
          <th :colspan="params.length"
              :style="{
                background: hBgColor,
                borderBottom: 'none',
                color: '#232A33',
                fontSize: '14px'
              }"
          >
            {{ tableTitle }}
          </th>
        </tr>
        <tr>
          <th v-for="(item, index) in params"
              :style="{
                width: item.width ? item.width : 'auto',
                height: rowHeight,
                background: hBgColor,
                color: hColor,
                textAlign: align,
                whiteSpace: scroll ? 'nowrap' : 'wrap'
              }"
              :key="index+'p'"
          >
            <span :style="{whiteSpace: item.whiteSpace ? 'wrap' : 'nowrap'}">{{ item.title }}</span>
          </th>
        </tr>
        <tr
            v-show="list && list.length > 0"
            v-for="(item, index) in list"
            :key="index+'p1'"
            @click="rowClick(item)"
            :style="{
              background: rowBgColor && (index%2 !== 0 ? rowBgColor : '#fff'),
            }"
        >
          <td
              v-for="(ite, idx) in params"
              :key="idx+'p2'"
              :style="{
                textAlign: align,
                wordBreak: scroll ? '' : 'break-word',
              }"
          >
            <span v-if="wordWrap && wordWrap === ite.labelKey" style="white-space: nowrap">{{
                item[ite.labelKey]
              }}</span>
            <span v-else>{{ item[ite.labelKey] }}</span>
          </td>
        </tr>
        <tr v-if="list.length === 0">
          <td :colspan="params.length">
            <slot name="empty">
              <div style="color: #666; font-size: 14px; padding: 6px; text-align: center">暂无数据</div>
            </slot>
          </td>
        </tr>
      </table>
    </div>

  </div>
</template>

<script>
export default {
  name: "cuTable",
  data() {
    return {
      list: []
    }
  },
  props: {
    params: { // 配置参数 title: 标题, labelKey: 数据取值的key  width: 表格宽度, whiteSpace: 标题是否换行
      type: Array,
      default: () => {
        return ([])
      }
    },
    dataSource: { // 数据
      type: Array,
      default: () => {
        return ([])
      }
    },
    tableTitle: { // 表格标题
      type: String
    },
    wordWrap: { // 表格项数据不换行, key
      type: String
    },
    border: { // 边框
      type: Boolean,
      default: true
    },
    scroll: { // 左右滑动
      type: Boolean,
      default: true
    },
    round: { // 边框圆角
      type: Boolean,
      default: true
    },
    borderColor: { // 边框颜色
      type: String,
      default: '#D4E6FF'
    },
    hBgColor: { // 头背景颜色
      type: String,
      default: '#EDF5FF'
    },
    hColor: { // 头字体颜色
      type: String,
      default: '#868C94'
    },
    align: { // 文字对齐方式
      type: String,
      default: 'left'
    },
    rowHeight: { // 行高
      type: String,
      default: '31px'
    },
    rowBgColor: { // 行背景色 n+1行
      type: [String, Boolean],
      default: '#fff'
    },
    format: { // 格式
      type: String,
      default: 'YYYY.MM.DD'
    },
    formatKey: {
      type: String,
      default: "PREM_DUE_DATE"
    },
  },
  watch: {
    dataSource: {
      deep: true,
      handler(newV, oldV) {
        if (newV !== oldV) {
          this.initData()
        }
      }
    }
  },
  mounted() {
    this.initData()
  },
  methods: {
    initData() {
      this.list = JSON.parse(JSON.stringify(this.dataSource))
      if (this.format && this.formatKey) {
        this.list.map(item => {
          if (item[this.formatKey] && item[this.formatKey].indexOf('9999') > -1) {
            item[this.formatKey] = '终身'
          } else {
            let date = new Date(item[this.formatKey]);
            if (date) {
              let y = date.getFullYear()
              let m = date.getMonth() + 1 > 9 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`
              let d = date.getDate() + 1 > 9 ? date.getDate() + 1 : `0${date.getDate() + 1}`
              let h = date.getHours() + 1 > 9 ? date.getHours() + 1 : `0${date.getHours() + 1}`
              let ms = date.getMinutes() + 1 > 9 ? date.getMinutes() + 1 : `0${date.getMinutes() + 1}`
              let s = date.getSeconds() + 1 > 9 ? date.getSeconds() + 1 : `0${date.getSeconds() + 1}`
              if (this.format === 'YYYY.MM.DD') {
                item[this.formatKey] = `${y}.${m}.${d}`
              }
              if (this.format === 'YYYY.MM.DD hh:mm:ss') {
                item[this.formatKey] = `${y}.${m}.${d} ${h}:${ms}:${s}`
              }
              if (this.format === 'YYYY-MM-DD') {
                item[this.formatKey] = `${y}-${m}-${d}`
              }
              if (this.format === 'YYYY-MM-DD hh:mm:ss') {
                item[this.formatKey] = `${y}-${m}-${d} ${h}:${ms}:${s}`
              }
            }
          }
        })
      }
    },

    rowClick(row) {
      this.$emit('onClick', row)
    },
  }
}
</script>

<style lang="less" scoped>
table {
  width: 100%;
  margin: auto;
  border-spacing: 0;
  font-size: 14px;
}

.t-table_border {
  table {
    width: 100%;
    margin: auto;
    border-spacing: 0;
    font-size: 14px;
  }

  table tr > th {
    text-align: center;
    border: 1px solid #D4E6FF;
    padding: 4px;
  }

  table tr > th:nth-child(2n) {
    border-right: none;
    border-left: none;
  }

  table tr > th:last-child {
    border-right: 1px solid #D4E6FF;
  }

  table tr > td {
    text-align: center;
    border: 1px solid #D4E6FF;
    border-top: none;
    padding: 4px;
  }

  table tr > td:nth-child(2n) {
    border-right: none;
    border-left: none;
  }

  table tr > td:last-child {
    border-right: 1px solid #D4E6FF;
  }
}

.t-table_th_round {
  tr:first-child th:first-child {
    border-top-left-radius: 8px;
  }

  tr:first-child th:last-child {
    border-top-right-radius: 8px;
  }

  tr:last-child {
    td:first-child {
      border-bottom-left-radius: 8px;
    }
  }

  tr:last-child {
    td:last-child {
      border-bottom-right-radius: 8px;
    }
  }
}
</style>
往下是使用例子:
<cuTable
                  :tableTitle="`${ item.clientName }的个人${ type }`"
                  :params="params"
                  :data-source="dataSource"
                  wordWrap="enddate"
              />

data() {
	return {
	dataSource: [{liaBesc: '保险'}, {liaBexp: '保额(万元)'}, endDate: "2022-02-01"}],
	params: [{
        title: '保险责任',
        labelKey: 'liaBesc'
      }, {
        title: '保额(万元)',
        labelKey: 'liaBexp',
        whiteSpace: false
      }, {
        title: '保险期间',
        labelKey: 'endDate'
      }]

}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Vue3 中封装 Table 可以使用 composition API 来实现。下面是一个简单的示例代码: ```vue <template> <table> <thead> <tr> <th v-for="column in columns" :key="column.key">{{ column.title }}</th> </tr> </thead> <tbody> <tr v-for="row in rows" :key="row.id"> <td v-for="column in columns" :key="column.key">{{ row[column.key] }}</td> </tr> </tbody> </table> </template> <script> import { ref } from 'vue'; export default { props: { columns: { type: Array, required: true, }, rows: { type: Array, required: true, }, }, }; </script> ``` 在上面的代码中,我们使用 `props` 来接收传入的 `columns` 和 `rows`,然后在模板中使用 `v-for` 指令来渲染表格的头部和内容。由于 Vue3 中推荐使用 composition API 来管理组件状态,因此我们可以使用 `ref` 函数来创建响应式数据,例如在表格中添加一些状态,如当前选中的行等。 当然,这只是一个简单的示例,实际上封装 Table 还需要考虑更多的功能,例如分页、排序、筛选等,需要根据具体需求进行扩展。 ### 回答2: Vue3的封装table是指将table组件进行封装,方便在项目中的使用和维护。 首先,在vue3中,可以通过使用Composition API来进行封装。可以创建一个Table组件,在组件内部使用table标签来渲染表格,并通过props属性来接收父组件传入的数据。 在Table组件中,可以定义一些公共的属性,比如表格的样式、行高、列宽等。还可以定义一些公共的方法,比如排序功能、筛选功能、分页功能等。 在Table组件中,可以将表格的表头和表体分别封装成子组件,可以通过slots或者props将表头和表体的数据和样式传递给子组件。 在表头子组件中,可以定义一些公共的属性,比如列的宽度、对齐方式等。还可以定义一些公共的方法,比如排序功能、筛选功能等。 在表体子组件中,可以定义一些公共的属性,比如行的高度、行的样式等。还可以定义一些公共的方法,比如点击行事件等。 在Table组件中,可以通过使用v-for指令来循环渲染表格的数据,并将数据动态绑定到表格中。 在Table组件中,还可以通过使用watch属性来监听表格数据的改变,并及时更新显示。 在Table组件中,还可以通过使用emit方法来触发事件,比如点击表头排序、点击表体行等。 总之,Vue3的封装table可以使开发人员更加方便地使用和维护表格组件,提高开发效率。 ### 回答3: Vue3 封装表格Table)的原理可以通过组件的数据处理、模板渲染和事件处理实现。 首先,我们可以定义一个 `Table` 组件,接受两个属性 `columns` 和 `data`。`columns` 是一个数组,用于定义表格的列,每个对象包含列的名称和数据索引;`data` 是用来渲染表格内容的数据数组。 在 `Table` 组件的模板中,我们可以使用 `v-for` 指令来遍历 `columns` 数组,并在表头区域输出列的名称。然后,再使用嵌套的 `v-for` 指令遍历 `data` 数组,在表格内容区域输出每行数据的对应列值。 接下来,我们可以为 `Table` 组件添加一些交互功能。例如,可以为表头的列添加点击事件,实现按照该列的值进行排序。通过在 `Table` 组件中定义一个 `currentSort` 变量和一个 `sort` 方法,我们可以在点击事件中切换 `currentSort` 的值,并根据这个值对 `data` 数组进行排序。 除了排序功能,我们还可以在 `Table` 组件中添加其他交互功能,例如分页、列的隐藏、编辑等。通过在组件中定义相应的数据和方法,并在模板中添加对应的事件绑定和条件渲染,我们可以根据需求进行功能的扩展。 最后,我们可以将 `Table` 组件在其他组件中引用,并传递相应的属性和事件。这样,我们就可以在不同的页面或模块中实现灵活的表格功能。 总结来说,Vue3 封装表格的原理主要是通过组件的数据处理、模板渲染和事件处理来实现。我们可以定义一个 `Table` 组件,通过传递属性和事件来实现交互功能,并在其他组件中引用和定制。这样,我们可以根据项目的需求灵活地封装和使用表格组件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值