vue+element-ui表格自定义列模版的实现
前言
日前vue3项目中用element-ui表格封装一个组件,有自定义表列格式的需求,做完后顺手总结一下
一、为什么要自定义表列模版?
后端返回的数据往往比较原始,比如状态是数值,而我们要给它转成中文并用不同颜色标记,这种场景很常见
二、实现步骤
1.封装表格组件
代码如下(示例):
通过插槽v-slots实现
// data-table/index.tsx import { ElPagination, ElTable, ElTableColumn } from "element-plus"; import { PropType, defineComponent } from "vue"; const props = { tableStyle: { type: String as PropType<string>, default: 'height: 150px;overflow-y: auto' }, showHeader: { type: Boolean as PropType<boolean>, default: true }, tableData: { type: Array }, columns: { type: [Array, Object] }, pagination: { type: Object, default: () => ({ total: 0, page: 1, limit: 20, background: true, pageSizes: [10, 20, 30, 50], pagerCount: document.body.clientWidth < 992 ? 5 : 7, layout: '->, total, sizes, prev, pager, next, jumper', }) } } export default defineComponent({ name: 'data-table', props, setup(props) { const defaultBackground = true const defaultPageSizes = [10, 20, 30, 50] const defaultPagerCount = document.body.clientWidth < 992 ? 5 : 7 const defaultLayout = '->, total, sizes, prev, pager, next, jumper' return () => ( <> <div style={ props.tableStyle }> <ElTable v-show={ props.tableData?.length>0 } showHeader={ props.showHeader } v-model:data={ props.tableData } style={{width: '100%'}}> {props.columns?.map((item) => ( <ElTableColumn key={ item.key? item.key:item } prop={ item.prop? item.prop:item } label={ item.label? item.label:item } sortable={ item.sortable } v-slots={{ default: (scope) => item.render? item.render(scope.row):undefined }} /> ))} </ElTable> <ElPagination v-show={ props.pagination.total>0 } small total={ props.pagination.total } background={ props.pagination.background || defaultBackground } pageSizes={ props.pagination.pageSizes || defaultPageSizes } pagerCount={ props.pagination.pagerCount || defaultPagerCount} layout={ props.pagination.layout || defaultLayout }/> </div> </> ) } })
2.父组件引用
代码如下(示例):
在columns中提供render
// parentComponent export default defineComponent({ name: 'parent', setup() { const columns = [ {key: 'type', prop: 'type', label: 'type', render: (row) => <ElTag>{ row.type }</ElTag>}, {key: 'parseTrue', prop: 'parseTrue', label: 'parseTrue', render: (row) => { return row.parseTrue? <ElTag type='success'>语法正确</ElTag> : <ElTag type='danger'>语法错误</ElTag> }}, {key: 'explainTrue',prop: 'explainTrue', label: 'explainTrue', render: (row) => { return row.explainTrue? <ElTag type='success'>逻辑正确</ElTag> : <ElTag type='danger'>逻辑错误</ElTag> }}, {key: 'explainTime', prop: 'explainTime', label: 'explainTime'}, {key: 'sql', prop: 'sql', label: 'sql'} ] const tableData = ref([]) const total = ref(0) return () => ( <> <DataTable tableStyle='height: 500px;overflow-y: auto' showHeader={ false } columns={ columns } tableData={ tableData.value } pagination={{ total: total.value }} /> </> ) } })
两步就好,不多不少。
总结
通过插槽完美解决了element-ui表格自定义列模版的问题,可能还会有更复杂的场景,待遇到时再具体分析。
到此这篇关于vue+element-ui表格自定义列模版的实现的文章就介绍到这了,更多相关element表格自定义列模版内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决Vue3报错:Property “xxx“ was accessed during render but
这篇文章主要给大家介绍了关于解决Vue3报错:Property “xxx“ was accessed during render but is not defined on instance.的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下2023-01-01使用 Vue 3 的 createApp方法初始化应用的基本步骤
createApp 是 Vue 3 引入的全局 API,用于创建一个应用实例,这篇文章主要介绍了如何使用 Vue 3 的 createApp方法初始化应用,通过 createApp 方法,我们从 Vue 3 的基本初始化开始,扩展到插件的应用、多个应用实例的创建等,需要的朋友可以参考下2024-05-05解决VUE3 keep-alive页面切换报错parentComponent.ctx.deactivate
这篇文章主要介绍了解决VUE3 keep-alive页面切换报错parentComponent.ctx.deactivate is not a function的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-10-10
最新评论