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
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
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、付费专栏及课程。

余额充值