详解VUE 对element-ui中的ElTableColumn扩展


Posted in Javascript onMarch 28, 2018

公司有一个新的需求,点击ElTableColumn的头部可以进行搜索,这个功能同事已经做出来了,但是使用有些不方便,自己就打算封装成一个组件,学习一下。

ElTableColumn本来是这个样子的:

详解VUE 对element-ui中的ElTableColumn扩展

要做成的是这个样子:

详解VUE 对element-ui中的ElTableColumn扩展

我直接就放代码了,挨着挨着说明太多了。

代码的结构:

详解VUE 对element-ui中的ElTableColumn扩展

组件

<!-- ElTableColumnPro.vue -->
<template>
   <el-table-column v-if="visible" :formatter="formatter" :align='align' :prop="prop" :header-align="headerAlign" :label="label" :width="width" :render-header="renderHeader" >
     <template slot-scope="scope">
      <slot :row="scope.row" :$index="scope.$index" >
       <span>{{fomatMethod(scope.row[prop])}}</span>
      </slot>
     </template>
   </el-table-column>
</template>

<script>
import moment from "moment";

export default {
 name: "el-table-column-pro",
 props: {
  prop: {
   type: String
  },
  label: {
   type: String
  },
  width: {
   type: Number
  },
  renderType: {
   type: String,
   validator: value => ["date", "input", "select"].includes(value)
  },
  placeholder: {
   type: String
  },
  rederWidth: {
   type: String,
   default: "230px"
  },
  param: {
   type: String,
   default: ""
  },
  startDate: {
   type: String
  },
  endDate: {
   type: String
  },
  selectList: {
   type: Array
  },
  isClear: {
   type: Boolean,
   default:true
  },
  visible: {
   type: Boolean,
   default: true
  },
  filterIcon: {
   type: String,
   default: "el-icon-search"
  },
  callback: {
   type: Function
  },
  formatter: {
   type: Function,
   default:(row, column, cellValue)=>cellValue
  },
  align:{
   type:String 
  },
  headerAlign:{
   type:String
  }
 },
 data() {
  return {
   formatD:this.filterIcon
  };
 },
 
 methods: {

  fomatMethod(value){
   return this.formatter('','',value)
  },
  
  renderHeader(createElement, { column, $index }) {
   switch (this.renderType) {
    case "date":
     return this.renderDate(createElement, { column, $index });

    case "input":
     return this.rederInput(createElement, { column, $index });
     
    case "select":
     return this.rederSelect(createElement, { column, $index });
    
    default:
     return column.label;
   }
  },

  rederInput(createElement, { column, $index }) {
   return createElement(
    "div",
    {
     class: "filters",
     style: {
      color: column.color
     }
    },
    [
     createElement(
      "el-popover",
      {
       props: {
        placement: "bottom",
        width: "200",
        trigger: "click"
       }
      },
      [
       createElement("el-input", {
        props: {
         placeholder: this.placeholder,
         value: this.param
        },
        nativeOn: {
         keyup: event => {
          if (event.keyCode === 13) {
           this.$emit("update:param", event.target.value);
           this.callback && this.callback();
          }
         }
        },
        on: {
         blur: event => {
          this.$emit("update:param", event.target.value);
          this.callback && this.callback();
         }
        }
       }),
       createElement(
        "span",
        {
         slot: "reference"
        },
        [
         column.label,
         createElement("i", {
          class: this.filterIcon,
          style: {
           marginLeft: "4px"
          }
         })
        ]
       )
      ]
     )
    ]
   );
  },

  rederSelect(createElement, { column, $index }) {
   return createElement(
    "div",
    {
     class: "filters",
     style: {
      color: column.color
     }
    },
    [
     createElement(
      "el-popover",
      {
       props: {
        placement: "bottom",
        width: "200",
        trigger: "click"
       }
      },
      [
       createElement(
        "el-select",
        {
         props: {
          placeholder: this.placeholder,
          value: this.param,
          clearable: this.isClear
         },
         on: {
          input: value => {
           this.$emit("update:param", value);
           this.callback && this.callback();
          }
         }
        },
        [
         this.selectList.map(item => {
          return createElement("el-option", {
           props: {
            value: item.value,
            label: item.label
           }
          });
         })
        ]
       ),
       createElement(
        "span",
        {
         slot: "reference"
        },
        [
         column.label,
         createElement("i", {
          class: this.filterIcon,
          style: {
           marginLeft: "4px"
          }
         })
        ]
       )
      ]
     )
    ]
   );
  },

  renderDate(createElement, { column, $index }) {
   return createElement(
    "div",
    {
     class: "filters"
    },
    [
     createElement(
      "el-popover",
      {
       props: {
        placement: "bottom",
        width: this.rederWidth,
        trigger: "click"
       }
      },
      [
       createElement("el-date-picker", {
        props: {
         placeholder: this.placeholder,
         value: this.value,
         type: "daterange",
         rangeSeparator:"至",
         startPlaceholder:"开始日期",
         endPlaceholder:"结束日期",
        },
        style: {
         width: this.rederWidth
        },
        on: {
         input: value => {
          if (value) {
           const startDate = moment(value[0]).format("YYYY-MM-DD");
           const endDate = moment(value[1]).format("YYYY-MM-DD");
           this.$emit("update:startDate", startDate);
           this.$emit("update:endDate", endDate);
           this.callback && this.callback();
          }
         }
        }
       }),
       createElement(
        "span",
        {
         slot: "reference"
        },
        [
         column.label,
         createElement("i", {
          class: this.filterIcon,
          style: {
           marginLeft: "4px"
          }
         })
        ]
       )
      ]
     )
    ]
   );
  }
 }
};
</script>
<!-- index.js -->
import ElTableColumnPro from './ElTableColumnPro'
ElTableColumnPro.install = function(Vue) {
 Vue.component(ElTableColumnPro.name, ElTableColumnPro);
};
export default ElTableColumnPro;

安装

import ElTableColumnPro from 'components/ElTableColumnPro/index' 
...
...
...

Vue.use(ElTableColumnPro)

使用

<el-table :data="bankFlow" style="width:100%" stripe>
    <el-table-column-pro :visible="showMore" prop="transactionId" label="流水号" :width="120"> </el-table-column-pro>
    <el-table-column-pro prop="clientCode" label="客户代码 " :width="120" placeholder="请输入客户代码" :callback="requestTransactionLogs" renderType="input" :param.sync="request_params.clientCode"> </el-table-column-pro>
    <el-table-column-pro prop="eventTypeName" label="事件 " placeholder="请选择事件"  :selectList="listEventEnum" :callback="requestTransactionLogs" renderType="select" :param.sync="request_params.event" :width="100"> </el-table-column-pro>
    <el-table-column-pro prop="createTime" :callback="requestTransactionLogs" :startDate.sync="request_params.startDate" :endDate.sync="request_params.endDate" :formatter="$timeformat" label="时间" renderType="date" :width="180" ></el-table-column-pro>
 </el-table>
<el-table :data="lists.content" v-loading="loading" @row-dblclick="detail" >
    <el-table-column-pro :width="120" prop="clientCode" label="客户代码 " align="center" header-align="center" placeholder="请输入客户代码" :callback="getLists" renderType="input" :param.sync="params.clientCode"></el-table-column-pro>      
    <el-table-column-pro label="内容 " placeholder="请输入内容" :callback="getLists" renderType="input" :param.sync="params.content">
        <template slot-scope="scope">
           <pre>{{scope.row.content}}</pre>
        </template>
    </el-table-column-pro>
    <el-table-column-pro prop="userName" :width="100" label="记录人 " align="center" header-align="center" placeholder="请输入记录人" :callback="getLists" renderType="input" :param.sync="params.userName"></el-table-column-pro>
    <el-table-column prop="createTime" width="150" label="记录时间" align="center" header-align="center" :formatter="$dateTimeFormat"></el-table-column>
 </el-table>

注释就不挨着打了....

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 阻止javascript事件冒泡,获取控件ID值
Jun 27 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
jQuery替换字符串(实例代码)
Nov 13 Javascript
jquery 取子节点及当前节点属性值的方法
Aug 24 Javascript
JavaScript中的Function函数
Aug 27 Javascript
Spring mvc 接收json对象
Dec 10 Javascript
轻松掌握JavaScript中介者模式
Aug 26 Javascript
WebPack基础知识详解
Jan 16 Javascript
详解Node.js开发中的express-session
May 19 Javascript
浅析Vue中method与computed的区别
Mar 06 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
Sep 28 Javascript
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
微信小程序之分享页面如何返回首页的示例
Mar 28 #Javascript
js中el表达式的使用和非空判断方法
Mar 28 #Javascript
JS实现左边列表移到到右边列表功能
Mar 28 #Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 #Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 #jQuery
vue渲染时闪烁{{}}的问题及解决方法
Mar 28 #Javascript
浅谈js获取ModelAndView值的问题
Mar 28 #Javascript
You might like
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
ThinkPHP框架实现数据增删改
2017/05/07 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
jQuery中empty()方法用法实例
2015/01/16 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
JavaScript时间戳与时间日期间相互转换
2017/12/11 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
Python3实现连接SQLite数据库的方法
2014/08/23 Python
举例介绍Python中的25个隐藏特性
2015/03/30 Python
Python科学画图代码分享
2017/11/29 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
python调用其他文件函数或类的示例
2019/07/16 Python
浅谈python3中input输入的使用
2019/08/02 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
PHP面试题大全
2015/10/16 面试题
卫校中专生个人自我评价
2013/09/19 职场文书
项目总经理岗位职责
2014/02/14 职场文书
读书演讲主持词
2014/03/18 职场文书
德生2P3收音机开箱评测
2022/04/30 无线电