扩展el-table-column添加字典转换功能[使用Mixins]

需求

el-table-column上添加一个code属性就可以实现字典值显示

实现

通过mixins混入el-table-column, 再修改其中的renderCell方法, 实现目标;
文中项目使用webpack打包, 通过定义别名在开发环境import elementui/TableColumn, 在生成环境使用window.ELEMENT.TableColumn 避免生成的文件过大

自定义组件

<script>
/*
引入需要混入的TableColumn
*/
import TableColumnMixin from '@mixin/TableColumnMixin';

export default {
  mixins: TableColumnMixin,
  name: "su-table-column",
  props: {
    code: String // 定义code
  },
  data: () => {
    return {
      dicts: null // 缓存的字典
    };
  },
  created() {
    // 不是字典, 不处理
    if (!this.code) return;
    // 加载字典
    this.$LocalUtil.loadDic(this.code).then((res) => {
      res.reduce((pv, cv) => {
        pv[cv.key] = cv.label;
        return pv;
      }, (this.dicts = {}));
    });
    // 代理原有的render
    let orignRrenderCell = this.columnConfig.renderCell;
    this.columnConfig.renderCell = (h, data) => {
      /* 
      返回的值外面还包了一层, 如果使用原包裹代码, 需要引入额外的编译器,
      这里偷懒, 先按照原方法渲染, 然后把值替换掉
      */
      let ort = orignRrenderCell(h, data);
      if (this.dicts && ort && ort.children && ort.children[0]) {
        // 转换字典值
        ort.children[0].text = this.dicts[data.row[data.column.property]];
      }
      return ort;
    };
  },
};
</script>

<style scoped>
</style>
使用
<template>
  <div>
    <el-table :data="data">
      <su-table-column label="su-plain" prop="sex" width="80"></su-table-column>
      <el-table-column label="el-plain" prop="sex" width="80"></el-table-column>

      <su-table-column label="su-code" prop="sex" code="SEX" width="80"></su-table-column>
      <su-table-column label="su-formatter" prop="sex" :formatter="afmt" width="120"></su-table-column>
      <el-table-column label="el-formatter" prop="sex" :formatter="afmt" width="120"></el-table-column>

      <su-table-column label="su-formatter-slot" prop="sex" :formatter="afmt"  width="130">
        <template slot-scope="scope">
          val:{{(scope.row||{}).sex}}; id:{{(scope.column||{}).id}}; idx:{{scope.$index}}
        </template>
      </su-table-column>
      <el-table-column label="el-formatter-slot" prop="sex" :formatter="afmt"  width="130">
        <template slot-scope="scope">
          val:{{(scope.row||{}).sex}}; id:{{(scope.column||{}).id}}; idx:{{scope.$index}}
        </template>
      </el-table-column>

      <su-table-column label="su-slot" prop="sex" width="80">
        <template slot-scope="scope">
          val:{{(scope.row||{}).sex}}
        </template>
      </su-table-column>
      <el-table-column label="el-slot" prop="sex" width="80">
        <template slot-scope="scope">
          val:{{(scope.row||{}).sex}}
        </template>
      </el-table-column> 

      
      <su-table-column label="su-slot" prop="sex" width="80" code="SEX">
        <template slot-scope="scope">
          val:{{(scope.row||{}).sex}}
        </template>
      </su-table-column>
    </el-table>
  </div>
</template>

<script>
import { Table } from "element-ui";
import { TableColumn as SuTableColumn } from "../index";

export default {
  name: "test-su-select",
  components: {
    SuTableColumn,
    Table,
  },
  data() {
    return {
      data: [
        {
          sex: "1",
        },
        {
          sex: "2",
        },
      ],
    };
  },
  watch: {},
  methods: {
    afmt(row) {
      return row.sex + ":with formatter";
    },
  },
  mounted() {
  },
};
</script>

在这里插入图片描述

开发环境下的TableColumnMixin
import { TableColumn } from "element-ui";
export default [TableColumn]
生成环境下的TableColumnMixin
export default [window.ELEMENT.TableColumn] // 页面已预先引入element-ui.js
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 封装 el-upload 组件可以方便地在多个地方复用它,而不必在每个使用它的地方都编写一遍相同的代码。下面是一个简单的封装示例: ``` <template> <el-upload class="upload-demo" :action="action" :accept="accept" :before-upload="beforeUpload" :on-success="onSuccess" :on-error="onError" > <slot></slot> </el-upload> </template> <script> export default { name: 'MyUpload', props: { action: { type: String, required: true }, accept: { type: String, default: '' } }, methods: { beforeUpload(file) { // 在上传之前进行一些处理,例如限制文件大小等 // 如果返回 false 或 Promise.reject(),则取消上传 }, onSuccess(response, file, fileList) { // 上传成功后的回调函数 }, onError(error, file, fileList) { // 上传失败后的回调函数 } } } </script> ``` 在上面的示例中,我们使用了一个名为 `MyUpload` 的组件来封装 el-upload 组件。这个组件的 props 包括 `action` 和 `accept` 两个属性,分别代表上传文件的接口地址和可接受的文件类型。 在组件的方法中,我们实现了 `beforeUpload`、`onSuccess` 和 `onError` 三个回调函数,分别代表上传之前的处理、上传成功后的处理和上传失败后的处理。这些回调函数可以根据实际需求来编写。 在模板中,我们使用了一个 `slot` 来插入 el-upload 组件的上传按钮和提示信息,这样可以使组件更加灵活。在使用这个组件时,只需像下面这样调用: ``` <my-upload action="/upload" accept="image/*" v-on:success="handleSuccess" v-on:error="handleError" > <el-button>点击上传</el-button> <div slot="tip">只能上传图片</div> </my-upload> ``` 在上面的示例中,我们将 `MyUpload` 组件用 `my-upload` 标签来调用。在组件中,我们使用了 `v-on` 指令来监听上传成功和失败事件,并分别调用了 `handleSuccess` 和 `handleError` 方法来处理这些事件。在组件的插槽中,我们自定义了上传按钮和提示信息。 ### 回答2: el-upload是element-ui中的一个上传组件,用于实现文件上传功能。封装el-upload组件的目的是为了方便在项目中重复使用它,并且可以根据项目的特殊需求进行个性化配置和定制。 在封装el-upload组件时,可以使用mixin混入的方式来实现。首先,我们可以定义一个uploadMixin对象,其中包含一些常用的配置项和方法,如上传文件的接口地址、上传文件的类型限制、上传成功后的回调函数等。 然后,在需要使用el-upload组件的地方,引入uploadMixin,并在组件的mixins选项中将uploadMixin添加进去。这样,就可以继承uploadMixin中的配置和方法,实现el-upload的定制化使用。 在具体使用el-upload组件时,可以根据具体需求,配置一些参数,比如是否支持多文件上传、是否显示文件列表、是否自动上传等。同时,也可以通过监听el-upload的事件来实现一些额外的逻辑操作,比如文件上传前的校验、进度条的展示等。 通过封装el-upload组件,可以抽象出一些通用的上传行为和样式,减少重复代码的编写,提高开发效率。同时,也方便后续对上传功能扩展和维护,在项目的后续需求变更时,只需要对封装好的组件进行相应的配置和调整,而不需要对每个使用el-upload组件的地方进行修改。 总之,封装el-upload组件能够提升代码的复用性和可维护性,减少开发成本,提高开发效率。 ### 回答3: el-upload是基于element-ui封装的文件上传组件,使用它可以方便地实现文件的上传和管理。在进行封装时,可以根据实际需求添加一些额外的功能,以增强其功能性和便利性。 在封装el-upload组件时,可以考虑以下几个要点: 1. 文件类型限制:可以设置允许上传的文件类型,如限制只能上传图片、文档、压缩包等特定类型的文件。 2. 文件大小限制:可以限制上传文件的最大大小,以防止用户上传过大的文件。 3. 上传进度条:可以添加一个上传进度条,用于显示文件上传的进度,提升用户体验。 4. 文件预览功能:可以在上传文件后,提供文件预览的功能,例如图片可以直接显示预览,文档可以提供下载链接等。 5. 多文件上传:可以支持多个文件同时上传,并正确处理每个文件的上传结果。 6. 文件删除功能:在文件上传后,提供删除已上传文件的功能,以方便用户删除不需要的文件。 7. 自定义样式:可以设置上传按钮的样式、进度条的颜色等,以适应项目的整体风格。 8. 错误处理:对于上传过程中的错误,可以提供友好的错误提示,同时对异常情况进行处理和回馈给用户。 通过封装el-upload组件,可以减少重复的代码编写工作,提高代码的复用性和可维护性。同时,组件的封装可以使得开发人员更加专注于实际业务逻辑的实现,提升开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值