ElementUI自定义Table支持render

ElementUI中的Table组件可以通过render-header属性通过render函数渲染表头,对于数据单元格并没有相关支持,虽然可以通过<template slot-scope="scope"></template >自定义列,但是在某些操作中直接用·render·形式进行渲染会更加有效,我一般喜欢通过数据的形式配置表格的内容,所以对ElementUI中的Table组件进行二次封装。

首先编写用于表头和数据单元格的部分:

TableHeaderCell.js

export default {
  name: 'TableHeadCell',
  functional: true,
  props: {
    render: Function,
    index: Number,
    column: Object,
    scopeColumn: Object,
    columns: Array,
    data: Array
  },
  render: (h, ctx) => {
    if (typeof ctx.props.render === 'function') {
      const params = {
        index: ctx.props.index,
        column: ctx.props.column,
        scopeColumn: ctx.props.scopeColumn,
        columns: ctx.props.columns,
        data: ctx.props.data,
        _self: ctx
      }
      return ctx.props.render.call(ctx.parent.$parent, h, params)
    } else {
      return h('span', ctx.props.column.label || ctx.props.column.prop || ctx.props.scopeColumn.property)
    }
  }
}

TableCell.js

export default {
  name: 'TableCell',
  functional: true,
  props: {
    row: Object,
    render: Function,
    index: Number,
    column: Object,
    scopeColumn: Object,
    columns: Array,
    data: Array
  },
  render: (h, ctx) => {
    if (typeof ctx.props.render === 'function') {
      const params = {
        row: ctx.props.row,
        index: ctx.props.index,
        column: ctx.props.column,
        scopeColumn: ctx.props.scopeColumn,
        columns: ctx.props.columns,
        data: ctx.props.data,
        _self: ctx
      }
      return ctx.props.render.call(ctx.parent.$parent, h, params)
    } else {
      if (typeof ctx.props.column.formatter === 'function') {
        return h('span', 
          ctx.props.column.formatter(
            ctx.props.row, ctx.props.scopeColumn,
            ctx.props.row[ctx.props.column.prop],
            ctx.props.index
          )
        )
      }
      return h('span', ctx.props.row[ctx.props.column.prop])
    }
  }
}

最后编写表格主要部分:index.vue

<template>
  <el-table
    ref="targetTable"
    :data="data"
    v-bind="$attrs"
    v-on="$listeners"
  >
    <slot slot="empty" name="empty" />
    <slot slot="append" name="append" />
    <slot name="columns">
      <el-table-column
        v-for="column in computedColumns"
        :key="column.prop"
        v-bind="column"
      >
        <template slot="header" slot-scope="scope">
          <tabel-head-cell :column="column" :scope-column="scope.column"
            :index="scope.$index" :render="column.headerRender" :columns="columns" :data="data" />
        </template>
        <template slot-scope="scope">
          <tabel-cell :row="scope.row" :column="column" :scope-column="scope.column"
            :index="scope.$index" :render="column.render" :columns="columns" :data="data" />
        </template>
      </el-table-column>
    </slot>
  </el-table>
</template>
<script>
import TabelCell from './TableCell'
import TabelHeadCell from './TableHeadCell'
const TATGET_TABLE_REF = 'targetTable'
export default {
  name: 'RenderTable',
  components: { TabelHeadCell, TabelCell },
  props: {
    columns: { type: Array, default: () => {} },
    data: { type: Array, default: () => {} }
  },
  computed: {
    computedColumns() {
      return this.columns && this.columns.filter(column => column.visible === undefined
        || column.visible === null || !!column.visible)
    }
  },
  methods: {
    // 表格原始方法
    clearSelection() {
      this.$refs[TATGET_TABLE_REF].clearSelection()
    },
    toggleRowSelection(row, selected) {
      this.$refs[TATGET_TABLE_REF].toggleRowSelection(row, selected)
    },
    toggleAllSelection() {
      this.$refs[TATGET_TABLE_REF].toggleAllSelection()
    },
    toggleRowExpansion(row, expanded) {
      this.$refs[TATGET_TABLE_REF].toggleRowExpansion(row, expanded)
    },
    setCurrentRow(row) {
      this.$refs[TATGET_TABLE_REF].setCurrentRow(row)
    },
    clearSort() {
      this.$refs[TATGET_TABLE_REF].clearSort()
    },
    clearFilter(columnKey) {
      this.$refs[TATGET_TABLE_REF].clearFilter(columnKey)
    },
    doLayout() {
      this.$refs[TATGET_TABLE_REF].doLayout()
    },
    sort(prop, order) {
      this.$refs[TATGET_TABLE_REF].sort(prop, order)
    }
  }
}
</script>

使用示例:

<template>
    <render-table
      :columns="columns"
      :data="list"
    />
</template>
<script>
import RenderTable from '_c/RenderTable'
export default {
  name: 'RenderTableTest',
  components: { RenderTable},
  data() {
    return {
      columns: [
        {
          prop: 'appId',
          label: '应用编号',
          fixed: true,
          align: 'center'
        },
        {
          prop: 'appName',
          label: '应用名称',
          align: 'center'
        },
        {
          prop: 'enabled',
          label: '是否启用',
          align: 'center',
          formatter(row, column, cellValue, index) {
            return cellValue ? '是' : '否'
          }
        },
        {
          fixed: 'right',
          label: '操作',
          align: 'center',
          render(h, { row }) {
            const _this = this
            return h('el-button-group', [
              h('el-button', {
                props: {
                  size: 'mini',
                  type: 'primary'
                },
                on: {
                  'click'() {
                    _this.handleEdit(row)
                  }
                }
              }, '编辑')
            ])
          }
        }
      ],
      list: []
    }
  },
  methods: {
    handleEdit(row) {
    }
  }
}
</script>

ElementUI-Table表头排序

ElementUI-Table表头自带排序功能,和排序事件,但是目前只是对当前界面的数据进行排序。

  • 项目需求:点击表头排序的时候,对所有数据进行排序。
  • 初步方案:在点击排序按钮的时,在排序事件sort-change 中,进行数据请求,此时会先重拍一次当前页面的数据,再渲染接口返回数据。用户体验不是很好。
  • 优化方案:使用render-header自定义tableHeader,此时要使用render函数来创建表头。
getheaderTime(h) {
      const This = this
      return h('div', {
      },
        ['告警时间',
          h('span', {
            class: 'iline-table-sort'
          },
            [
              h('i', {
                'class': {
                  'el-icon-caret-bottom': This.orderByType === 'desc',
                  'el-icon-caret-top': This.orderByType === 'asc',
                  'active': This.orderBy === 'daqTime'
                },
                attrs: {
                  'orderByType': 'desc',
                  'orderType': 'daqTime'
                },
                on: {
                  click: This.clickHandler
                },
                style: {
                  fontSize: '22px'
                }
              })
            ]
          )
        ])
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

关于ElementUI自定义Table支持render的更多相关文章

  1. 第七章:table单元格的选择和UIAlertController

    运行app,自己试试选择cell更多关于UIAlertController再继续研究之前,我们需要更多的了解一下UIAlertController。UIAlertController是在iOS8引入用来替代UIAlertView和UIActionSheet的。参照上面的代码片段,我们可以指定UIAlertController的preferredStyle。创建好动作后可以使用addAction将动作和UIAlertController连接起来。这就是使用UIAlertController的方法。

  2. tableview使用自定义类,页面跳转,本地存储

    如图,添加下面的三行代码2下面创建自己的cell,新建一个swift文件,命名为TableViewCell3因为还要考虑到界面的跳转,需要新建swift文件PushTest

  3. Swift UITableView相关功能八

    但是,我们发现当我们点击右侧索引的时候好像和table的关系不明确。其实我们少了一个代理方法,他是专门用来关联索引和table分区的这里我们简单设置了一下,将字母顺序和table的分区对应上了。

  4. Swift设置Table View的Cell中Lable自适应内容高度的

    Swift设置TableView的Cell中Lable自适应内容高度的最后修改在TableCell中Label的lines属性,将其设置为0。

  5. 更加 Swift 化的 Collection View 和 Table View Cells

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 制作一个可以滑动操作的 Table View Cell

    本教程将会向你展示如何制作一个这样的TableViewCell,而不用因嵌套的ScrollView陷入困境。如果你还不知道一个可滑动的TableViewCell意味着什么,那么看看Apple的邮件应用:可能你会想,既然Apple展示了这种方案,那它应该已将其开放给开发者使用了。这会要求你深入研究iOS7UITableViewCell的结构,以便复制出我们需要的行为。打开MasterViewController.m并找到viewDidLoad。这个循环添加了一些字符串到_objects数组,应用运行时,这些

  7. 如何实现可收起和展开的Table Section

    如何实现可收起和展开的TableSection这是一个简单的iOSswift项目,旨在介绍如何实现可收起和展开的tablesection,并且,项目不需要mainstoryboard,XIB,注册nib等,只需要纯的Swfit代码!切换收起和展开的函数如下:注意到我们不是简单的重绘整个section,实际上我们只需要重绘section里的所有cell就好,这样做的好处是避免了sectionheader因重绘时闪烁的效果,最重要是的可以让我们更平滑地处理我们想要的动画效果,例如旋转那个箭头,改变背景颜色等等

  8. Swift iOS: UITableView的使用

    Table继承于UITableView,并实现UITableViewDataSource,UITableViewDelegate,在配合代码:就指明了UITableView的数据源对象为Table,委托对象也是Table。前者指明此对象是UITableView的数据提供者,后者指明此对象是UITableView的外观和行为的提供者。添加删除修改类UITableView不但可以显示内容,还可以配合很多操作。标记类UITableView支持对每个行做标记和取消标记,标记可以有多种。可以通过官方手册查询UITa

  9. android – SQLiteDatabase – 如何使用where子句?

    例如,如果我想要TIMetaBLE_MODULECODE=123.我将如何做到这一点,我已经读过它的第一个null.我在下面尝试了这个,但仍然无法正常工作解决方法TABLE_ROW_ID“=”rowID,这里“=”是where子句

  10. android – 为什么我们需要onUpgrade(); SQLiteOpenHelper类中的方法

    我正在遵循这个教程可以任何身体请让我清楚这段代码.问题onUpgrade()的目的是什么;方法?重要为什么我们在这个方法中删除表并重新创建?提前致谢.解决方法onUpgrade基本上用于处理任何新版本应用程序的新数据库更改.在onUpgrade中并不总是需要删除表,这取决于您的用例.如果要求不要保留旧版本应用程序中的数据,那么drop应该会有所帮助,但是如果它更改架构那么它应该只有更改脚本.

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部