vxe-table renderer 渲染器详解,render 渲染器使用方式

vxe-table renderer 渲染器详解,强大到没朋友的 render 渲染器使用方式

vxe-table 渲染器

  • 什么场景需要用到呢?
    1. 需要实现不同单元格编辑组件(比如:输入框、下拉框、日期选择等…)
    2. 需要定制高级筛选(比如:实现类似 Excel 筛选框或定制更加强大自定义筛选等…)
    3. 业务太多,构建可复用的渲染器
    4. 一键生成可配置化表格等

cell-render 单元格渲染

正常情况下,如果需要自定义一个单元格显示模板,通常是使用 formatter 来格式化为字符串内容,虽然基本可以满足需求;

<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name"></vxe-column>
  <vxe-column field="sex" title="Sex"></vxe-column>
  <vxe-column field="time" title="Time" :formatter="formatTime"></vxe-column>
</vxe-table>
export default {
  data () {
   return {
      tableData: []
    }
  },
  created () {
    this.tableData = [
		{ name: 'Name111', sex: '1', time: 1571323971250 },
		{ name: 'Name222', sex: '0', time: 1573940857260 },
		{ name: 'Name333', sex: '1', time: 1575121185280 }
	]
  },
  methods: {
    formatTime ({ cellValue, row, column }) {
      return XEUtils.toDateString(cellValue, 'yyyy-MM-dd HH:ss:mm')
    }
  }
}

但如果需要显示自定义的 html 内容就无法满足需求了;这时候就必须通过 slot 插槽模板来渲染;

<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name">
	  <template v-slot="{ row }">
	    <a class="my-link" :href="row.link">{{ row.time }}</a>
	  </template>
  </vxe-column>
  <vxe-column field="sex" title="Sex"></vxe-column>
  <vxe-column field="time" title="Time"></vxe-column>
</vxe-table>

但是通过插槽来渲染复用性太差,到处是冗余代码,这时就需要用 渲染器 + jsx 来抽象可复用的单元格渲染;

// 创建一个超链接渲染器
VXETable.renderer.add('MyLink', {
  // 默认显示模板
  renderDefault (h, cellRender, params) {
    let { row, column } = params
    return [
      <a class="my-link" href={ row.link }>{row[column.property]}</a>
    ]
  }
})
<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name" :cell-render="{name: 'MyLink'}"></vxe-column>
  <vxe-column field="sex" title="Sex"></vxe-column>
  <vxe-column field="time" title="Time"></vxe-column>
</vxe-table>

这样就抽象完成!一切渲染都可以配置化;

filter-render 筛选渲染

先来看一个最简单的筛选配置

<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name"></vxe-column>
  <vxe-column field="sex" title="Sex" :filters="selList"></vxe-column>
  <vxe-column field="time" title="Time"></vxe-column>
</vxe-table>
export default {
  data () {
   return {
      tableData: [],
      selList: [
      	{label: '1', value: '男'},
      	{label: '0', value: '女'}
      ]
    }
  },
  created () {
    this.tableData = [
		{ name: 'Name111', sex: '1', time: 1571323971250 },
		{ name: 'Name222', sex: '0', time: 1573940857260 },
		{ name: 'Name333', sex: '1', time: 1575121185280 }
	]
  }
}

但如果需要显示自定义的 html 内容就无法满足需求了;这时候就必须通过 slot 插槽模板来渲染;
上下文函数 context.changeOption(event, checked, option) 是在选项值发生改变是需要调用该方法,用于更新内部值

<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name"></vxe-column>
  <vxe-column field="sex" title="Sex">
	  <template v-slot="{ row }">
	  	<div v-for="(option, index) in column.filters" :key="index">
	  		<input type="type" v-model="option.data" @input="context.changeOption($event, !!option.data, option)">
	  	</div>
	  </template>
  </vxe-column>
  <vxe-column field="time" title="Time"></vxe-column>
</vxe-table>

通过插槽来渲染复用性太差,到处是冗余代码,这时使用 渲染器 + jsx 来抽象可复用的筛选渲染;

// 创建一个支持输入的筛选器(仅用于简单示例,实际开发中应该封装成一个组件,不应该把复杂的渲染逻辑写在渲染器中)
VXETable.renderer.add('MyFilter', {
  // 筛选模板
  renderFilter (h, filterRender, params, context) {
    let { column } = params
    return column.filters.map(option => {
      return <input type="text" v-modal={ option.data } onInput={ evnt => { context.changeOption(evnt, !!option.data, option) } }/>
    })
  },
  // 筛选方法
  filterMethod ({ option, row, column }) {
    let cellValue = XEUtils.get(row, column.property)
    return cellValue == option.data
  }
})
<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name"></vxe-column>
  <vxe-column field="sex" title="Sex" :filters="[{data: null}]" :filter-render="{name: 'MyFilter'}"></vxe-column>
  <vxe-column field="time" title="Time"></vxe-column>
</vxe-table>

edit-render 可编辑渲染

先来看一下简单可编辑表格使用

<vxe-table
  border
  :edit-config="{trigger: 'click', mode: 'cell'}"
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name" :edit-render="{name: 'input', attrs: { type: 'text' }}"></vxe-column>
  <vxe-column field="sex" title="Sex" :edit-render="{name: 'input', attrs: { type: 'text' }}"></vxe-column>
  <vxe-column field="time" title="Time" :edit-render="{name: 'input', attrs: { type: 'text' }}"></vxe-column>
</vxe-table>
export default {
  data () {
   return {
      tableData: []
    }
  },
  created () {
    this.tableData = [
		{ name: 'Name111', sex: '1', time: 1571323971250 },
		{ name: 'Name222', sex: '0', time: 1573940857260 },
		{ name: 'Name333', sex: '1', time: 1575121185280 }
	]
  }
}

还是老问题,如果需要显示自定义的 html 内容就无法满足需求了;这时候就必须通过 slot 插槽模板来渲染;

<vxe-table
  border
  :edit-config="{trigger: 'click', mode: 'cell'}"
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name" :edit-render="{name: 'input'}">
  	<template v-slot:edit="{ row }">
      <input type="text" v-model="row.name" class="custom-input">
    </template>
  </vxe-column>
  <vxe-column field="sex" title="Sex" :edit-render="{name: 'input'}">
  	<template v-slot:edit="{ row }">
      <input type="text" v-model="row.sex" class="custom-input">
    </template>
  </vxe-column>
  <vxe-column field="time" title="Time" :edit-render="{name: 'input'}">
  	<template v-slot:edit="{ row }">
      <input type="text" v-model="row.time" class="custom-input">
    </template>
  </vxe-column>
</vxe-table>

通过插槽来渲染复用性太差,再来看下 渲染器 + jsx 来抽象可复用的筛选渲染;

// 创建一个简单输入框渲染器
VXETable.renderer.add('MyInput', {
  // 可编辑激活模板
  renderEdit (h, editRender, { row, column }) {
    return [
      <input class="my-cell" text="text" v-modal={ row[column.property] }/>
    ]
  },
  // 可编辑显示模板
  renderCell (h, editRender, { row, column }) {
    return [
      <span>{ row[column.property] }</span>
    ]
  }
})
<vxe-table
  border
  :data="tableData">
  <vxe-column type="seq" width="60"></vxe-column>
  <vxe-column field="name" title="Name" :edit-render="{name: 'MyInput'}"></vxe-column>
  <vxe-column field="sex" title="Sex" :edit-render="{name: 'MyInput'}"></vxe-column>
  <vxe-column field="time" title="Time" :edit-render="{name: 'MyInput'}"></vxe-column>
</vxe-table>

到此结束,由于渲染器的参数及高级用法就比较复杂了,这里仅仅只是介绍了简单的用法,更多进阶用于可以看官方文档哈!

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
vxe-table是一个基于vue的表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、模态窗口、自定义模板、灵活的配置项、丰富的扩展插件等... 设计理念: 面向现代浏览器,高效的简洁 API 设计 模块化表格、按需加载、插件化扩展 为单行编辑表格而设计,支持增删改查及更多扩展,强大的功能的同时兼具性能 功能: Basic table (基础表格) Grid (高级表格) Size (尺寸) Striped (斑马线条纹) Table with border (带边框) Cell style (单元格样式) Column resizable (列宽拖动) Maximum table height (最大高度) Resize height and width (响应式宽高) Fixed column (固定列) Grouping table head (表头分组) Highlight row and column (高亮行、列) Table sequence (序号) Radio (单选) Checkbox (多选) Sorting (排序) Filter (筛选) Rowspan and colspan (合并行或列) Footer summary (表尾合计) Import (导入) Export (导出) Print (打印) Show/Hide column (显示/隐藏列) Loading (加载中) Formatted content (格式化内容) Custom template (自定义模板) Context menu(快捷菜单) Virtual Scroller(虚拟滚动) Expandable row (展开行) Pager(分页) Form(表单) Toolbar(工具栏) Tree table (树形表格) Editable CRUD(增删改查) Validate(数据校验) Data Proxy(数据代理) Keyboard navigation(键盘导航) Modal window(模态窗口) Charts(图表工具) 更新日志: v4.0.20 table 修改单选框、复选框获取值错误问题 grid 修复 KeepAlive 中报错问题
vxe-table是一个基于Vue.js的表格组件库,可以用于渲染和展示数据。它提供了丰富的功能和灵活的配置选项,可以满足各种表格需求。 要使用vxe-table进行渲染,首先需要安装vxe-tablevxe-table-plugin-renderer插件。可以通过npm命令进行安装: ```shell npm install vxe-table vxe-table-plugin-renderer ``` 然后,在Vue项目中引入vxe-tablevxe-table-plugin-renderer,并注册它们: ```javascript import Vue from 'vue' import VXETable from 'vxe-table' import VXETablePluginRenderer from 'vxe-table-plugin-renderer' import 'vxe-table/lib/style.css' import 'vxe-table-plugin-renderer/dist/style.css' VXETable.use(VXETablePluginRenderer) Vue.use(VXETable) ``` 接下来,可以在Vue组件中使用vxe-table进行渲染。例如,可以创建一个简单的表格,并在单元格中渲染饼图: ```html <template> <vxe-table :data="tableData"> <vxe-column type="index" title="序号"></vxe-column> <vxe-column field="name" title="姓名"></vxe-column> <vxe-column field="age" title="年龄"></vxe-column> <vxe-column field="gender" title="性别"></vxe-column> <vxe-column field="chart" title="饼图" :render="renderChart"></vxe-column> </vxe-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20, gender: '男', chart: { type: 'pie', data: [30, 70] } }, { name: '李四', age: 25, gender: '女', chart: { type: 'pie', data: [40, 60] } }, { name: '王五', age: 30, gender: '男', chart: { type: 'pie', data: [50, 50] } } ] } }, methods: { renderChart({ row }) { return `<div class="chart">${row.chart.type}: ${row.chart.data.join(', ')}</div>` } } } </script> <style> .chart { width: 100px; height: 100px; background-color: #f0f0f0; border-radius: 50%; display: flex; align-items: center; justify-content: center; } </style> ``` 在上面的例子中,我们使用了`<vxe-column>`组件来定义表格的列,其中`render`属性指定了渲染函数`renderChart`,该函数会在每个单元格中渲染饼图。 通过以上步骤,就可以使用vxe-table进行渲染了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值