iView表格二次封装

怼烎@ 2022-01-12 02:19 617阅读 0赞

在使用iview的过程中,很多时候需要处理大部分的表格,且操作是一样的时候,那么就可以抽出来,做成共公的一部分。方便偷懒~ 如图:

为了实现表格自带操作栏,且可以自定义覆盖,我们开始二次封装

原理

  1. 1.使用$attrs $listeners 全部传递iview Table组件默认的所有属性和事件
  2. 2.在自定义的组件中,修改columns的值,来实现我们想要的效果
  3. 复制代码

实现

a.定义TableRender组件

  1. <template>
  2. <Table v-bind="$attrs" v-on="$listeners"></Table>
  3. </template>
  4. <script type="text/jsx">
  5. import styles from './table-runder.module.less'
  6. export default {
  7. name: 'TableRender',
  8. props: {
  9. openAction: { // 是否开启操作列
  10. type: Boolean,
  11. default: true
  12. },
  13. action: { // 操作列附带的基础配置
  14. type: Object,
  15. default: () => {
  16. return {
  17. title: '操作',
  18. fixed: 'right',
  19. align: 'center',
  20. name: 'action'
  21. }
  22. }
  23. }
  24. },
  25. created () {
  26. },
  27. watch: {
  28. openAction: {
  29. handler (c) {
  30. c ? this.mergeColumns() : this.resetColumns()
  31. },
  32. immediate: true
  33. }
  34. },
  35. methods: {
  36. mergeColumns () {
  37. const { columns } = this.$attrs
  38. if (columns && columns[columns.length - 1].name === 'action') {
  39. return
  40. }
  41. const merge = this.getActions()
  42. columns.push(merge)
  43. this.$attrs.columns = columns
  44. },
  45. resetColumns () {
  46. const { columns } = this.$attrs
  47. if (columns && columns[columns.length - 1].name === 'action') {
  48. columns.pop()
  49. this.$attrs.columns = columns
  50. }
  51. },
  52. getActions () {
  53. const action = { ...this.action }
  54. let self = this
  55. return {
  56. ...action,
  57. render (h, params) {
  58. return (
  59. // 我也不晓得为啥 className={styles.tableBtn} 这样不生效,所以只能styles['table-btn'] :(
  60. <div class={styles['table-btn']}>
  61. <i-button type="success" size="small" nativeOnClick={self.viewHandle.bind(self, params)}>查看</i-button>
  62. <i-button nativeOnClick={self.editorHandle.bind(self, params)} type="primary"
  63. size="small">编辑
  64. </i-button>
  65. <i-button nativeOnClick={self.removeHandle.bind(self, params)} type="error"
  66. size="small">删除
  67. </i-button>
  68. </div>
  69. )
  70. }
  71. }
  72. },
  73. viewHandle (params) {
  74. this.$emit('on-view', params)
  75. },
  76. editorHandle (params) {
  77. this.$emit('on-editor', params)
  78. },
  79. removeHandle (params) {
  80. this.$emit('on-remove', params)
  81. }
  82. }
  83. }
  84. </script>
  85. <style scoped>
  86. </style>
  87. 复制代码

b.同级别的样式文件

ps: 因为在实现的过程中使用了jsx,所以要把css当成模块来引入。在vue中,默认是启用css modules了的,但要求是需要我们把要启用该特性的css文件以 .module.css文件结尾(预编译css一样)。

  1. // table-runder.module.less
  2. .table-btn {
  3. display: flex;
  4. flex-direction: row;
  5. justify-content: space-around;
  6. align-content: flex-start;
  7. }
  8. 复制代码

c.调用

  1. <template>
  2. <div class="container">
  3. <h2>tableRender</h2>
  4. <TableRender :open-action="true" :columns="tableTitle" :data="testList" @on-view="viewHandle"></TableRender>
  5. </div>
  6. </template>
  7. <script type="text/jsx">
  8. import TableRender from '@/common/TableRender'
  9. export default {
  10. name: 'test',
  11. components: {
  12. TableRender
  13. },
  14. data () {
  15. return {
  16. testList: [
  17. { name: '张三', status: true },
  18. { name: '李四', status: true },
  19. { name: '王五', status: false },
  20. { name: '钱六', status: true }
  21. ],
  22. tableTitle: [
  23. {
  24. title: '序号',
  25. fixed: 'left',
  26. align: 'center',
  27. width: 65,
  28. type: 'index'
  29. }, {
  30. title: '名称',
  31. key: 'name'
  32. }, {
  33. title: '状态',
  34. align: 'center',
  35. minWidth: 120,
  36. key: 'status',
  37. render: (h, params) => {
  38. const { row: { status } } = params
  39. return (
  40. <p>{status ? '是' : '否'}</p>
  41. )
  42. }
  43. }
  44. // 指定列属性name为action,可启用自定义的操作,可以覆盖默认的操作栏的设置: 注: open-action 设置为false后失效
  45. // {
  46. // title: 'Action',
  47. // name: 'action',
  48. // render: (h, params) => {
  49. // return (
  50. // <div>
  51. // <i-button type="primary">View</i-button>
  52. // <i-button type="primary">Del</i-button>
  53. // </div>
  54. // )
  55. // }
  56. // }
  57. ]
  58. }
  59. },
  60. mounted () {
  61. },
  62. methods: {
  63. viewHandle (params) {
  64. this.$Modal.info({
  65. content: JSON.stringify(params, null, '\t ')
  66. })
  67. }
  68. }
  69. }
  70. </script>
  71. <style scoped>
  72. .container {
  73. padding: 20px;
  74. }
  75. </style>
  76. 复制代码

参数
























属性 说明 类型 默认值
open-action 是否启用操作栏,关闭后table将不再支持操作栏 Boolean true
action 操作栏的属性 Object {title: ‘操作’, fixed: ‘right’, align:’center’, name: ‘action’, render: Function}

  1. 自定义的列参见调用列中注释的代码
  2. 复制代码

github代码

转载于:https://juejin.im/post/5d01b8ef6fb9a07eb94f85a6

发表评论

表情:
评论列表 (有 0 条评论,617人围观)

还没有评论,来说两句吧...

相关阅读

    相关 AFN封装

    前言 对于开发人员来说,学习网络层知识是必备的,任何一款`App`的开发,都需要到网络请求接口。很多朋友都还在使用原生的`NSURLConnection`一行一行地写,代

    相关 封装函数

    题目描述 已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件: 1、返回一个函数 result,该函数接受一个参数 2、执行

    相关 iView表格封装

    在使用iview的过程中,很多时候需要处理大部分的表格,且操作是一样的时候,那么就可以抽出来,做成共公的一部分。方便偷懒~ 如图: 为了实现表格自带操作栏,且可以自定义覆盖,