vue+element+table+render+slot

2023-10-29

前言:

        最新又回忆并且整理下之前的资料,在这里共享下把,主要是element-ui框架里面对table的使用,因为element-ui不可以像我们iview框架一样可以直接的在表头里面写render函数,我这里把element-uitable进行二次封装,这里展示他的封装文件和调用方法

实现效果图:

 

准备工作:

1.安装element-ui

cnpm i element-ui -s

2.main.js中配置

// 引入封装的element样式
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

实现代码:

1.封装的组件 iTable.vue , 可以直接使用

<template>
 <div class="table">
    <el-table id="iTable" :class="tableClass"
      v-loading.iTable="options.loading"
      :data="list"
      :stripe="options.stripe"
      :border="options.border"
      :highlight-current-row="options.highlightCurrentRow"
      :lazy="options.lazy"
      :height="options.height"
      :load='loadGetData'
      ref="mutipleTable"
      style='width:100%;'
      @row-click='clickRow'
      @row-dblclick='dblclickRow'
      @row-contextmenu='contextmenu'
      @header-click='headClick'
      @header-contextmenu='headcontextmenu'
      @select='select'
      @select-all='selectAll'
      @current-change='rowChange'
      @selection-change="handleSelectionChange">
      <!--region 数据列-->
      <template v-for="(column, index) in columns">

        <!--复选框(START)-->
        <el-table-column
          v-if="column.type=='selection'"
          type="selection"
          :width="column.width?column.width:60"
          :align="column.align?column.align:'center'">
        </el-table-column>
        <!--复选框(END)-->

        <!--序号(START)-->
        <el-table-column
          v-else-if="column.type=='index'"
          type="index"
          :label="column.title?column.title:'序号'"
          :width="column.width?column.width:80"
          :align="column.align?column.align:'center'">
        </el-table-column>
        <!--序号(END)-->

        <!-- slot 添加自定义配置项 -->
        <slot v-else-if="column.slot" :name="column.slot" :tit='index'></slot>

        <!-- 默认渲染列-渲染每一列的汉字 -->
        <el-table-column v-else
            :prop="column.prop"
            :label="column.title"
            :align="column.align"
            :width="column.width"
            :show-overflow-tooltip="true">
            <template slot-scope="scope">
                <!--正常渲染-->
                <template v-if="!column.render">
                  <template v-if="column.formatter">
                    <span v-html="column.formatter(scope.row, column)"></span>
                  </template>
                  <template v-else>
                    <span>{{scope.row[column.prop]}}</span>
                  </template>
                </template>
                <!--render函数-->
                <template v-else>
                  <expandDom :column="column" :row="scope.row" :render="column.render" :index="index"></expandDom>
                </template>
            </template>
        </el-table-column>

      </template>
      <!--endregion-->

    </el-table>

 </div>
</template>
<script>
 export default {
    props: {
        list: {
          type:Array,
          default:()=>[]
        }, // 数据列表
        columns: {
          type:Array,
          default:()=>[]
        }, // 需要展示的列 === prop:列数据对应的属性,label:列名,align:对齐方式,width:列宽
        options: {
          type: Object,
          default: function () {
            return {
              height:400,//默认高度-为了表头固定
              stripe: false, // 是否为斑马纹 table
              highlightCurrentRow: false, // 是否要高亮当前行
              border:false,//是否有纵向边框
              lazy:false,//是否需要懒加载
              loading:false,//是否需要等待效果
            }
          }
        }, // table 表格的控制参数
        tableClass:{
          type: String,
          default: 'hxTable'
        },
    },
    components: {
      /**
       * render函数渲染组件
       * */
      expandDom: {
        functional: true,
        props: {
          row: Object,
          render: Function,
          index: Number,
          column: {
            type: Object,
            default: null
          }
        },
        render: (h, ctx) => {
          const params = {
                            row: ctx.props.row,
                            index: ctx.props.index
                         }
          if (ctx.props.column) params.column = ctx.props.column
            return ctx.props.render(h, params)
          }
      }
    },
    data () {
      return {
        multipleSelection: [], // 多行选中
      }
    },
    mounted () {},

    computed: {},

    methods: {
        /**
         * 列表懒加载,必须先开启懒加载
         * */
        loadGetData(row,treeNode,resolve){//懒加载事件数据
          let data = {
            'row':row,
            'treeNode':treeNode,
            'resolve':resolve,
          }
          this.$emit('loadGetData',data);
        },
        /**
         * 多行选中
         * */
        handleSelectionChange (val) {// 多行选中
          debugger
          this.multipleSelection = val
          this.$emit('handleSelectionChange', val)
        },
        /**
         * 单击行事件
         * */
        clickRow(row, column, event){
          let data = {
            'row':row,
            'column':column,
            'event':event,
          }
          this.$emit('clickRow',data);
        },
        /**
         * 双击行事件
         * */
        dblclickRow(row, column, event){
          let data = {
            'row':row,
            'column':column,
            'event':event,
          }
          this.$emit('dblclickRow',data);
        },
        /**
         * 右键行事件-没去掉页面默认的
         * */
        contextmenu(row, column, event){
          let data = {
            'row':row,
            'column':column,
            'event':event,
          }
          this.$emit('contextmenu',data);
        },
        /**
         * 头部列点击事件
         * */
        headClick(column, event){
          let data = {
            'column':column,
            'event':event,
          }
          this.$emit('headClick',data);
        },
        /**
         * 头部列右键点击事件
         * */
        headcontextmenu(column, event){
           let data = {
            'column':column,
            'event':event,
          }
          this.$emit('headcontextmenu',data);
        },
        /**
         * 当前行发生改变时的事件
         * */
        rowChange(currentRow, oldCurrentRow){
           let data = {
            'currentRow':currentRow,
            'oldCurrentRow':oldCurrentRow,
          }
          this.$emit('rowChange',data);
        },
        /**
         * 用户手动勾选复选框触发
         * */
        select(sel,row){
           let data = {
            'sel':sel,
            'row':row,
          }
          this.$emit('select',data)
        },
        /**
         * 用户点击全选触发
         * */
        selectAll(sel){
           let data = {
            'sel':sel,
          }
          this.$emit('selectAll',data)
        }

    }
  }
</script>

2.调用方法:

(1)引入我们封装的组件

import eleTable from '@/components/com_ele/iTable'//table表格

(2)注册我们的组件

components: {
  eleTable
},

(3)在页面调用

   <eleTable :columns="columns" :list="list">
      <!-- 内容部分-操作 -->
      <el-table-column slot="operateT" label="操作" align='center'>
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="edit(scope.row)">修改</el-button>
        </template>
      </el-table-column>

      <!-- header部分-操作 -->
      <el-table-column prop="address" slot="headerClick"  align='center'>
        <template slot-scope="scope" slot="header">

          <el-popover
            popper-class="tablepopover"
            trigger="click">
            我是显示内容
            <span slot="reference">地址-点我试试</span>
          </el-popover>

        </template>
      </el-table-column>
    </eleTable>

(4)在data里面注册表头数据

columns:[
          {
            type: 'selection',
          },
          {
            title: '序号',
            type: 'index',
          },
          {
            title: '姓名',
            prop: 'name',
            align:'center',
          },
          {
            title: '时间',
            prop: 'date',
            align:'center',
          },
          {//头部slot
            slot:'headerClick',
          },
          {
            title: '性别',
            prop: 'sex',
            align:'center',
            render:(h, params)=> {
              let sex = params.row.sex;//params.row.type==获取到的值
              let nowText = '';
              if(sex == '1'){
                nowText='男'
              }else{
                nowText='女'
              }
              return h('div',{},nowText)
            }
          },
          {//内容slot
            slot: 'operateT',
          },
        ],

(5)在data里面定义table表格数据list

list:[
          {
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            sex:'1'
          }, {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄',
            sex:'2'
          }, {
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            sex:'2'
          }, {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄',
            sex:'1'
          },{
            date: '2016-05-02',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1518 弄',
            sex:'1'
          }, {
            date: '2016-05-04',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1517 弄',
            sex:'2'
          }, {
            date: '2016-05-01',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1519 弄',
            sex:'2'
          }, {
            date: '2016-05-03',
            name: '王小虎',
            address: '上海市普陀区金沙江路 1516 弄',
            sex:'1'
          }
        ],

好了,到这里就结束了,有什么问题欢迎留言来讨论

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+element+table+render+slot 的相关文章

  • 页面在 Google Adwords 转化跟踪上重定向

    我有一个表单 人们可以在其中提交数据 然后使用 ajax 将数据发送到服务器 我已将其设置为 Google Adwords 中的转化 下面是我使用过的代码 问题是 当用户提交表单时 在收到响应后 它会重定向回我给出的 URL 我不想重定向
  • 如何设置vite.config.js基本公共路径?

    我正在尝试设置一个base url对于我的开发和生产环境 但是vitejs配置未解决 根据vitejs https vitejs dev config 您可以在配置选项中设置在开发或生产中提供服务时的基本公共路径 当从命令行运行 vite
  • 构建 Vue 微前端应用程序(带有路由和 vuex 存储)

    我需要帮助配置使用 Vuex Vue Router 和 Vue i18n 的微前端应用程序的构建 分发 TL DR 我在构建将导入到现有系统中的微前端应用程序时遇到问题 我们的团队尝试通过 vue cli service 和 vue web
  • 如何在Vue.js中格式化当前日期格式

    我需要获取当前日期Vue js 为此 我使用了以下方法 today date new Date toJSON slice 0 10 replace g today date将给出日期2019 09 11格式 有什么方法可以自定义这种格式吗
  • VueJS 精确活动类

    我有一个使用 Router link 的菜单 当 Router link 被激活时 我想将类 Active 放在 li 上 ul class nav nav second level li li ul
  • 通过 declarativeNetRequest + extensionPath 重定向时获取原始 URL

    我需要在导航时但在用户从使用设置的规则重定向之前获取 chrome 选项卡的 urldeclarativeNetRequest 目前 用户可以使用上下文菜单添加规则 当尝试访问过滤的主机时 它将被重定向到内部扩展页面 chrome cont
  • Nuxt 3动态组件中根据路由参数进行API调用

    我正在尝试创建一个简单的 Nuxt 3 应用程序用于学习目的 它使用动态路线 https v3 nuxtjs org docs directory structure pages dynamic routes加载页面时从 API 加载数据
  • 如何将Vue包装的对象转换为普通对象

    我需要将对象类型的数据变量分配给普通变量 const myVue new Vue el myVue data vars show Form methods assign vars const new vars this vars html
  • 无法通过 Vue.js 从 Laravel 后端下载文件 (pdf)(Axios 帖子)

    我在 Vue 中有一个多步骤表单 一旦收集到所有信息 我就会将结果发布到 Laravel 控制器 这是网站的经过验证的区域 我正在使用护照 所以本质上我有一个 Vue SPA 它是在 Laravel 5 7 框架内构建的网站的管理区域 Vu
  • 在 Vue.js 2 中将 props 作为初始数据传递的正确方法是什么?

    所以我想将 props 传递给 Vue 组件 但我希望这些 props 将来会从该组件内部发生变化 例如当我使用 AJAX 从内部更新该 Vue 组件时 所以它们仅用于组件的初始化 My cars listVue 组件元素 我将具有初始属性
  • 在可组合项 vue3 中使用 props

    我正在将应用程序从 vue 2 升级到 vue 3 但在可组合项方面遇到了一些问题 我想在可组合项中使用道具 但它似乎不起作用 代码示例是从工作组件中提取的 当我将其留在组件中时 它可以正常工作 我假设defineProps不受可组合项支持
  • 如何在没有模块的情况下在 vue 中使用 TypeScript

    In package json I have devDependencies vue 2 5 16 这给了我index d ts vue d ts and so on https github com vuejs vue tree v2 5
  • 实现npm包自定义组件VueJS

    我正在尝试使用以下 npm package 来绕过 X frame 选项 https www npmjs com package x frame bypass https www npmjs com package x frame bypa
  • 如何在 NuxtJs 路由中使用 *(星号)?

    在 vue cli 生成的普通 Vue 不是 Nuxt 项目中 使用 在 vue router 中这样工作 export default new Router routes path about name about component A
  • Vue: vue-i18n: 无法翻译 keypath 的值,使用 keypath 的值作为默认值

    我正在使用 Vue 我想展示三种语言 英语 他加禄语和宿务语 现在我有错误 无法转换键路径 NavbarMobile home 的值 使用 keypath 的值作为默认值 我通过 console log this i18n locale 检
  • Cytoscape 布局 - 处理锁定节点

    我正在使用 vue cytoscape 渲染图形并浏览树状数据结构 我的目标是扩展父节点并保持它们在图中的位置 我想简单地添加新的子节点 我的方法是锁定当前节点 添加子节点并解锁节点 this cy nodes lock for let d
  • 将变量从调用它的父页面传递给 Vue 组件

    我有一个简单的表格 显示了我的所有数据 主文件 php table class table table bordered table hover thead tr th Job Name th th Job Description th t
  • Vue - 调度完成后调用 store getter?

    我正在使用 Laravel 5 7 Vue2 Vuex 我在调度调用完成后让 Vue 返回存储值时遇到一些困难 我的申请流程如下 我单击一个提交按钮 该按钮调用组件上的 validate Validate 分派到我的 addLease 操作
  • 如何减少 WEBPACK + VUEJS 中的包大小

    我遵循了很多有关如何减小捆绑包大小的教程 但没有任何内容对捆绑包大小产生任何影响 我不知道为什么 每次当我向 webpack 添加一些新代码时 我的包大小都保持与以前相同 我的应用程序是使用 vue cli 3 pwa 插件 webpack
  • 使用 jquery-chosen 插件更新 vuejs 模型值

    尝试使用jquery 选择 http harvesthq github io chosen 使用 vue 问题是这个插件隐藏了我应用的实际选择v model 所以当我选择一个值时 vue 不会将其识别为选择更改事件 并且模型值不会更新 当我

随机推荐

  • Open3D 点云DBSCAN密度聚类并保存聚类结果

    目录 一 算法原理 1 密度聚类 2 主要函数 3 参考文献 二 代码实现 三 结果展示 1 保存聚类 2 可视化 一 算法原理 1 密度聚类 密度聚类是将簇定义为密度相连的点的最大集合 能够把具有足够高密度的区域划分为簇 并可在噪声的空间
  • 并行编程OpenCL-矩阵相加

    并行编程OpenCL 矩阵相加 1 host端代码 include
  • springboot之mybatis进阶

    springboot之mybatis进阶 简介 CRUD标签 select insert update delete resultMap sql片段 动态sql if choose when otherwise where 和set for
  • 关于使用SSM框架搭建的项目的运行方法

    目录 运行环境配置 1 安装 IDEA 开发工具 中文版设置 JDK直接下载 2 安装 MYSQL 数据库 2 1 下载安装 2 2 配置环境变量 2 4 安装 MySQL 2 4 进入 MySQL 2 5 常见问题 3 安装Tomcat
  • java日期之间的比较【项目日常】

    一 String类中提供了compareTo方法 原理是将字符串转成char 从char 0 开始进行比较 如果两值不相等 则返回相减的结果 一般将结果与0相比 进行判断 并不关心返回的具体值 String s1 2022 09 22 St
  • 蓝桥杯每日练习2

    文章目录 一 Fibonacci斐波那契数列 1 题目 2 样例 3 解析 4 Python代码 二 求圆的面积 1 题目 2 样例 3 解析 4 Python代码 三 N以内累加求和 1 题目 2 样例 3 解析 4 Python代码 四
  • 分布式文件系统 - FastDFS 在UBUNTU下安装

    分布式文件系统 FastDFS 在 CentOS 下配置安装部署 按照该博主的介绍 大部分安装操作正常 只是在创建软连接的时候报错 所以只好用笨办法启动和关闭 启动tracker usr bin fdfs trackerd etc fdfs
  • Python 实现不平衡采样

    本文将基于不平衡数据 使用Python进行反欺诈模型数据分析实战 模拟分类预测模型中因变量分类出现不平衡时该如何解决 具体的案例应用场景除反欺诈外 还有客户违约和疾病检测等 只要是因变量中各分类占比悬殊 就可对其使用一定的采样方法 以达到除
  • python命令行操作:Click包

    0 前言 在Python开发和测试过程中主要有两种模式可以选择 脚本模式 命令行模式 在代码的开发和调试过程中使用脚本模式还是很方便的 尤其接触pycharm eclipse这类强大的IDE 或者配合vs code这种综合的文本编辑器 但是
  • 【MySQL】——数据库的基本查询练习

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 基本查询 基本查询只在一张数据表中进行查询 接下来的题目都会在下面这张表进行
  • Java多线程——线程池

    一 ThreadPoolExecutor接口 之前提到过Executors所提供的四种线程池 即 Scheduled Single Fixed Cached 如果这几种线程池不能完全满足你的需求 那么通过ThreadPoolExecutor
  • [4G&5G专题-97]:MAC层- 调度 - 上行调度的原理、过程与算法

    目录 第1章 调度概述 1 1 调度概述 1 2 无线资源调度的分类 第2章 上行调度的整体架构与过程 2 1 上行需要调度的信道 2 2 上行数据发送过程 2 3 上行调度架构 2 4 上行调度的输入信息 2 5 上行调度的步骤与过程 2
  • 【客户案例】云联壹云帮助华北电力大学搭建 AI 训练平台

    客户介绍 华北电力大学是教育部直属全国重点大学 是国家 211 工程 和 985 工程优势学科创新平台 重点建设大学 2017 年 学校进入国家 双一流 建设高校行列 重点建设能源电力科学与工程学科群 全面开启了建设世界一流学科和高水平研究
  • 如何制作属于自己的图片马

    前言 图片马是指代码写入后不破坏图片为前提 图片仍可正常打开 详细过程 自定义一个新的文件夹 文件夹里放入三个文件 一张自己喜欢的图片 自定义php代码文件 批处理文件 super png 用文本编辑器打开也没php代码
  • 深度学习基础知识

    深度学习入门者必看 25个你一定要知道的概念如果你还不了解深度学习有多么强大 不妨就从这篇文章开始 https mp weixin qq com s biz MzIzNjc1NzUzMw mid 2247485927 idx 1 sn 60
  • vue diff 双端比较算法

    文章目录 双端指针 比较策略 命中策略四 命中策略二 命中策略三 命中策略一 未命中四种策略 遍历旧节点列表 新增情况一 新增情况二 删除节点 双端比较的优势 双端指针 使用四个变量 oldStartIdx oldEndIdx newSta
  • 微信小程序页面跳转三种方式

    为了不让用户在使用小程序时造成困扰 微信小程序规定页面路径只能是五层 请尽量避免多层级的交互方式 页面跳转的话就涉及到了多个页面层级 第一种 wx navigateTo OBJECT 保留当前页面 跳转到应用内的某个页面 使用wx navi
  • powershell 自动补全

    我在zsh中使用智能提示 zsh autosuggestions已经习惯了 而在windows中的终端默认没有智能提示 很起来不舒服 那么有没有什么替代呢 安装powershell 7 3 我的windows 10默认安装的是powersh
  • CSDN 改变字体颜色

    将字体改变为红色 font color 900 我是编程ID font 设置字体颜色和字号 font face 华文行楷 color red size 5 本字体是华文行楷 红色 5号大小 font 更多字体参见 https blog cs
  • vue+element+table+render+slot

    前言 最新又回忆并且整理下之前的资料 在这里共享下把 主要是element ui框架里面对table的使用 因为element ui不可以像我们iview框架一样可以直接的在表头里面写render函数 我这里把element ui的tabl