js封装el-table组件并使用

js封装el-table 组件并使用

注:该项目是在html页面中引入vue.js 来使用vue的

需求:
(1)表头可点击
(2)表格样式
(3)合并单元格

组件代码如下:

Vue.component('datareport-component', {
  props: {
    title: "",  // 报表名称
    reportlistdata: [], // 表格数据
    tableid: "", // 表格id
    columns: [], // 表格列内容
    items: [],  // 表格可点击表头的列内容
    fontweight: [], // 字体加粗的行的索引号(从0开始)
    fontindent: []  // 缩进的行的索引号(从0开始)
  },

  template: `<div>
                <div class="title">{{title}}</div>
                <el-table :data="reportlistdata" border style="width: 100%" height="700" :row-style="rowStyle"
                        :header-cell-style="headerStyle" :cell-style="cellStyle" :span-method="objectSpanMethod"
                        :id="tableid">
                        <template v-for="(item,index) in columns">
                            <el-table-column :fixed="item.fixed" :width="item.width" :prop="item.prop" :label="item.label"
                                :align="item.align">
                            </el-table-column>
                        </template>
                        <template v-for="(item,index) in items">
                            <el-table-column :prop="item.prop" :width="item.width" :align="item.align">
                                <template slot="header" slot-scope="scope">
                                    <span @click="seeDetail(item.url)" class="header">
                                        <span>{{item.label}}</span>
                                        <i class="iconfont icon-dayuhao"></i>
                                    </span>
                                </template>
                            </el-table-column>
                        </template>
                    </el-table>
              </div>`,

  data: function () {
    return {
      headerStyle: {},
      rowStyle: {},
      mergeSpanArr: [], // 空数组,记录每一行的合并数
      mergeSpanArrIndex: '', // mergeSpanArr的索引
    }
  },
  methods: {
    // row,  每一行上的数据
    // column, 每一列上的数据
    // rowIndex,  行数的下标从0开始
    // columnIndex   列数下标从0开始
    cellStyle({ row, column, rowIndex, columnIndex }) {
      var styleStr = '';
      // 设置第一二列的样式(背景色)
      if (columnIndex == 0 || columnIndex == 1) {
        styleStr += 'background:#f7f8fc;'
      }
      // 设置除前三列以外没有border
      if (columnIndex != 0 && columnIndex != 1 && columnIndex != 2) {
        styleStr += 'border-left:none;border-right:none'
      }
      // 设置第二列单元格字体样式
      if (columnIndex == 1) {
        for (var i = 0; i < this.fontweight.length; i++) {
          if (rowIndex == this.fontweight[i]) {
            styleStr += 'font-weight:700;'
          }
        }
        this.fontindent.forEach(function (value) {
          for (val in value) {
            // console.log(value[val])
            for (var i = 0; i < value.value.length; i++) {
              if (rowIndex == value.value[i]) {
                if (value.key == "2") {
                  styleStr += 'text-indent:2em;'
                } if (value.key == "4") {
                  styleStr += 'text-indent:4em;'
                } if (value.key == "6") {
                  styleStr += 'text-indent:6em;'
                } if (value.key == "8") {
                  styleStr += 'text-indent:8em;'
                }
              }
            }
          }
        });
      }
      return styleStr;
    },
    // 合并单元格
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) { // 设置需要合并的列(索引)
        const _row = this.mergeSpanArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      }
    },
    // 生成一个与行数相同的数组,记录每一行设置的合并数
    // data 表格数据  str 合并的属性(数组中重复的属性)
    setMergeArr(data, str) {
      for (var i = 0; i < data.length; i++) {
        if (i === 0) {
          this.mergeSpanArr.push(1);
          this.mergeSpanArrIndex = 0
        } else {
          // 判断当前元素与上一个元素是否相同
          if (data[i][str] === data[i - 1][str]) {
            this.mergeSpanArr[this.mergeSpanArrIndex] += 1;
            this.mergeSpanArr.push(0);
          } else {
            this.mergeSpanArr.push(1);
            this.mergeSpanArrIndex = i;
          }
        }
      }
      // 如果第一条记录索引为0,向数组中push 1,设置索引值
      // 如果不是第一条记录,判断与前一条记录是否相等,相等则向mergeSpanArr添加元素0
      // 且将前一条记录+1,即需要合并的行数+1,直到得到所有需要合并的行数
    },
    // 点击表头事件
    seeDetail(url) {
      console.log("seeDetail" + url);
      if (url != undefined) {
        window.open(url)
      }
    }
  },
  created: function () {
    // 设置表头样式
    this.headerStyle = { background: '#EDF0F6', color: '#333' };
    // 设置行高
    this.rowStyle = { height: '38px' };
  },
  mounted() {
    this.setMergeArr(this.reportlistdata, "category")
  }
});

在html文件中引入该js即可使用组件

 <script type="text/javascript" src="../../components/dataReport-component.js"></script>

使用:

<datareport-component tableid="out_table" :title="title1" :reportlistdata="reportListData"
                        :columns="columns" :items="items" :fontweight="fontWeight" :fontindent="fontIndent">
</datareport-component>

最后在js文件中,将上面的变量赋值即可

### 回答1: Vue3封装el-table可以通过以下步骤进行: 1. 首先,我们需要创建一个自定义组件,可以命名为MyTable。 2. 在MyTable组件,我们需要导入el-tableel-table-column组件,可以使用import语句进行导入。 3. 在template标签,我们可以使用el-table来渲染表格。可以设置属性如:data、border、stripe等。 4. 在el-table标签内部,我们可以使用el-table-column来定义表格的列。可以设置属性如:prop(对应数据源)、label(列名)、width(列宽)等。 5. 在script标签,我们需要定义MyTable组件的props,用于接收父组件传递的数据。 6. 在script标签,我们可以定义一些方法或者计算属性,用于处理表格的点击事件、排序、筛选等。 7. 最后,我们需要在父组件使用MyTable组件,并传递数据和配置选项给MyTable组件的props,来渲染自定义的表格。 总结一下,Vue3封装el-table的关键步骤包括创建自定义组件、导入el-tableel-table-column组件、在MyTable组件使用el-tableel-table-column来渲染表格、定义props、定义方法和计算属性以及在父组件使用MyTable组件。通过封装el-table,我们可以更好地复用和管理表格组件,并实现更灵活的表格功能。 ### 回答2: Vue3是一个用于构建用户界面的渐进式JavaScript框架。它具有轻量级、高效、易用的特点,并且在Vue3可以灵活地封装el-table。 首先,为了封装el-table,我们可以创建一个自定义组件,命名为TableWrapper。在TableWrapper组件的模板使用el-table,并将el-table的相关属性、事件和插槽通过props进行传递和接收。 在TableWrapper组件的props,我们可以定义例如data、columns、pagination等与el-table相关的属性。这样,我们就可以通过在使用TableWrapper组件时传递这些属性来配置el-table的行为。 另外,我们还可以在TableWrapper组件定义一些需要自定义的功能,例如表格的样式、表头的固定、排序功能等。这些功能可以通过在TableWrapper组件添加相关的方法和事件来实现。 除了属性和方法外,我们还可以使用插槽在TableWrapper组件自定义表格的各个部分,例如表头、表尾、表格内容等。通过在TableWrapper组件的模板使用<slot>元素,并在使用TableWrapper组件时传递相应的内容,可以方便地自定义el-table的外观和布局。 总之,通过将el-table封装到自定义组件TableWrapper,我们可以更好地控制和定制el-table的行为和外观。这样,我们就能够根据实际需要快速构建出符合需求的数据表格。 ### 回答3: Vue3封装el-table的步骤如下: 1. 首先,创建一个名为el-table-wrapper的组件,该组件用于封装el-table。 2. 在el-table-wrapper组件,引入el-table组件,并在模板使用el-table进行数据展示。 3. 在el-table-wrapper组件,接收名为data的props属性,用于传递表格数据。 4. 在el-table-wrapper组件,通过v-for指令遍历data数据,并使用el-table-column组件进行表格列的定义。 5. 在el-table-wrapper组件使用slot插槽来支持自定义表格内容,例如添加操作按钮等。 6. 在el-table-wrapper组件,可以设置一些其他属性,如border、stripe等,以适应不同的需求。 7. 在el-table-wrapper组件,可以使用事件监听器来捕获el-table的一些事件,例如选择行、排序等。 8. 在el-table-wrapper组件,通过emit方法触发自定义事件,以便在父组件处理表格的交互逻辑。 总结:在Vue3封装el-table,需要通过创建一个包装组件,在其引入el-table组件并定义相应的列和属性,同时支持自定义内容和事件。这样可以提高代码的复用性和可维护性,方便在不同的项目使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值