使用vue自定义指令合并iview表格单元格

使用vue自定义指令合并iview表格单元格,

我们在开发过程中发现iview表格组件,官网只提供了合并表头的demo,并没有合并表格中的单元格。

ivew表头分组:https://www.iviewui.com/components/table#BTFZ

效果图如下:

具体实现思路,通过vue自定义属性来操作dom,达到我们想要的效果:

代码如下: demo.vue  表格页面

<template>

    <div class="demo"><Table :columns="columns1" :data="data1" border ></Table>
<!--        <input v-focus=‘666‘ />-->

    </div>
</template>

<script>
    export default {
        name: ‘demo‘,
/*
        // 说明:我在写这个demo的时候发现  render 函数中 使用指令时 使用局部指令 没有效果,使用全家指令有效果
        //使用指令操作 dom
        directives: {

            focus: {
                // 指令的定义
                bind: function(el, bind){
                    console.dir(el);
                    console.log(el, bind, ‘bind‘);
                },
                inserted: function (el, bind) {
                    //el.focus()
                    console.dir(el);
                    console.log(el, bind, ‘dom元素‘);
                }
            }
        },

*/
        data () {
            return {
                columns1: [

                    {
                        title: ‘Name‘,
                        key: ‘name‘,
                        // align: ‘center‘,
                        render: (h, params)=>{
                            return h(‘div‘, {
                                style: {
                                    color: ‘green‘,
                                    textAlign: ‘center‘,
                                },
                                // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
                                // 赋值,因为 Vue 已经自动为你进行了同步。

                                directives: [
                                    {
                                        name: ‘cell‘,
                                        arg: ‘colSpan‘,
                                        value: 2,
                                        //value: ‘2‘
                                        //expression: ‘1 + 1‘,
                                        //modifiers: {
                                        //bar: true
                                        //}
                                    },{
                                        name: ‘rmcell‘,
                                        arg: ‘colSpan‘,
                                        value: 2,
                                    }
                                ],

                            }, params.row.name);
                        }

                    },

                    {
                        title: ‘演示合并列‘,
                        key: ‘‘
                    },

                    {
                        title: ‘Age‘,
                        key: ‘age‘
                    },
                    {
                        title: ‘Address‘,
                        key: ‘address‘
                    },
                    {
                        title: ‘爱好‘,
                        key: ‘hobby‘,
                        className: ‘no-hover‘,  //加在 td 上
                        render: (h, params)=>{

                            let dir = null;
                            //第一个tr 元素 中的 td 合并,其他tr 多出的 td删除
                            if(params.index === 0){
                                dir = [
                                    {
                                        name: ‘cell‘,
                                        arg: ‘rowSpan‘,
                                        value: this.data1.length,
                                        //value: ‘2‘
                                        //expression: ‘1 + 1‘,
                                        //modifiers: {
                                        //bar: true
                                        //}
                                    }
                                ];
                            }else{
                                dir = [
                                    {
                                        name: ‘rmcell‘,
                                        // arg: ‘‘,
                                        // value: ‘‘,
                                        //value: ‘2‘
                                        //expression: ‘1 + 1‘,
                                        //modifiers: {
                                        //bar: true
                                        //}
                                    }
                                ];

                            }

                            return h(‘span‘, {
                                style: {
                                    color: ‘red‘
                                },
                                // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
                                // 赋值,因为 Vue 已经自动为你进行了同步。

                                directives: dir,

                            }, params.row.hobby);
                        }
                    },

                ],
                data1: [
                    {
                        name: ‘John Brown‘,
                        age: 18,
                        address: ‘New York No. 1 Lake Park‘,
                        date: ‘2016-10-03‘,
                        hobby: ‘编码‘,
                    },
                    {
                        name: ‘Jim Green‘,
                        age: 24,
                        address: ‘London No. 1 Lake Park‘,
                        date: ‘2016-10-01‘,
                        hobby: ‘编码‘,
                    },
                    {
                        name: ‘Joe Black‘,
                        age: 30,
                        address: ‘Sydney No. 1 Lake Park‘,
                        date: ‘2016-10-02‘,
                        hobby: ‘编码‘,
                    },
                    {
                        name: ‘Jon Snow‘,
                        age: 26,
                        address: ‘Ottawa No. 2 Lake Park‘,
                        date: ‘2016-10-04‘,
                        hobby: ‘编码‘,
                    }
                ]
            }
        },

    }

</script>

<style scoped>
    .demo>>> div.ivu-table-wrapper tr:hover td.no-hover {
        background: #fff;
    }
</style>

在main.js里注册全局指令(或你把指令抽离出去最后引入main.js即可):

/**
 * // 注册一个全局自定义指令 `v-cell` 动态指令
 * /动态内容 rowSpan  合并行
 *           colSpan  合并列
 *  详见:https://cn.vuejs.org/v2/guide/custom-directive.html
 *  render 函数中 动态内容 传递参数 给  arg
 *          {
              name: ‘my-custom-directive‘,
              arg: ‘foo‘,   //动态 rowSpan或colSpan
              value: ‘2‘,
              expression: ‘1 + 1‘,
              modifiers: {
                bar: true
              }
            }
    详见:https://cn.vuejs.org/v2/guide/render-function.html
 */

Vue.directive(‘cell‘, {
    // bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
    bind: function(el, binding){
        console.dir(el);
        console.log(el, binding, ‘指令绑定‘);
    },
    // 当被绑定的元素插入到 DOM 中时……
    inserted: function (el, binding) {
        console.dir(el);
        console.log(el, binding, ‘指令插入‘);
        //找到td 元素 添加 更改 合并   rowSpan 或 colSpan
        el.parentNode.parentNode[binding.arg] = binding.value;
        console.dir(el.parentNode.parentNode.rowSpan);
    }
});
/**
 * rmcell  指令移除 表格单元格
 * /动态内容 rowSpan  合并行
 *           colSpan  合并列
 *           当动态内容为 rowSpan  移除的是当前元素
 *                     为 colSpan  移除的是紧跟其后的 td元素
 *
 * */
Vue.directive(‘rmcell‘, {
    // bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
    bind: function(el, binding){
        console.dir(el);
        console.log(el, binding, ‘指令绑定‘);
    },
    // 当被绑定的元素插入到 DOM 中时……
    inserted: function (el, binding) {
        console.dir(el.parentNode.parentNode);
        console.log(el, binding, ‘移除指令插入‘);
        //找到td 元素 移除
        if(binding.arg === ‘rowSpan‘){
            el.parentNode.parentNode.remove();
        }else {
            let parent = null;
            //合并n列 删除 n-1 次 单元格 的 下一个元素
            for(let i = 0; i < binding.value - 1; i++){
                el.parentNode.parentNode.nextSibling.remove();
                console.log(‘执行次数‘);
            }
        }

    }
});

代码中用到了动态指令:

详见:https://cn.vuejs.org/v2/guide/custom-directive.html

render函数中使用指令:

详见:https://cn.vuejs.org/v2/guide/render-function.html

原文地址:https://www.cnblogs.com/taohuaya/p/11581989.html

时间: 2024-10-06 23:32:51

使用vue自定义指令合并iview表格单元格的相关文章

vue自定义指令(Directive中的clickoutside.js)的理解

.array p { counter-increment: longen; margin-left: 10px } .array p::before { content: counter(longen) "." } .alink { font-size: 16px; color: blue } 阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DO

自定义表格单元格,及格式化日期字符串的示例

该实例演示在表格单元格中展示格式化的日期,并且使用UIDatePicker控件编辑日期. 实例使用分组风格的UITableViewController,用两种不同的UITableViewCell分别显示主要标题和NSDate数值,通过一个内建的名为UITableViewCellStyleValue1的单元格类型实现左右显示文本. 作为表格的委托,实例使用didSelectRowAtIndexPath方法打开UIDatePicker控件.UIDatePicker的动作方法将直接修改自定义表格单元格

vue自定义指令

什么是指令? 指令 (Directives) 是带有 v- 前缀的特殊属性. 它可以写在DOM元素上,对html进行操作.常用的指令比如有:v-if,v-else,v-show,v-for等.这些都是官方直接给定的,另外Vue也允许注册自定义指令,有时这很有用. 自定义指令方法 自定义一个指令很简单,官网给出一个简单的例子,自定义一个聚焦指令v-focus: // 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中

vue自定义指令clickoutside使用以及扩展用法

vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如要求选择器的弹出框中,增加搜索过滤(跟目前element的输入建议不太一样).于是想说说之前修改element组件,并定制为业务组件过程中遇到的问题. ps:因为对某些组件改动很大,所以是直接拷贝了一份源码,然后再进行修改,但是这样会遇到挺多问题,建议对于vue组件如果改动不大,只是简单功能扩展,就

关于html表格单元格宽度的计算规则

* { margin: 0; padding: 0 } body { background: #fafafa } ul,li { list-style: none } h1 { margin: 20px 0 } h2 { margin: 15px 0 } h3 { margin: 10px 0 } p { margin: 5px 0; border-left: 5px solid #ddd; padding-left: 10px } .table-wrap { } .tb-fixed { tab

如何实现可编辑表格单元格效果

如何实现可编辑表格单元格效果:在不少的网页都有这样的效果,可以编辑表格中的内容,非常的方便,在本站特效下载和网络上有一个可编辑单元格的实例,但是通过分析发现有诸多问题,最大一个问题就是浏览器不具有浏览器兼容性,所以本站写了一个简单的能偶兼容所有主流浏览器的效果,下面就通过实例简单介绍一下如何实现可以编辑单元格的效果,代码实例如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q

IOS 取消表格单元格 TableViewCell 去掉高亮状态 点击Cell取消选择状态

以下是两种实现效果 1. 自定义cell 继承UITableViewCell 重写 -(void)setSelected:(BOOL)selected animated:(BOOL)animated { } -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { } 里面不写任何东西 注意重写的时候一定要有带animated 方法,不然还是无效 2.点击单元格 取消选中单元格 //  点击单元格的时候取消选中单元格 -(

javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

jsp页面表格布局Html代码 <body > <center> <input type="text" value="111" id="mytext"> <table border="1" width="60%" id="mytable"> <tr> <td id="td1">第一行第一列<

table表格单元格中的内容如何强制换行

table表格单元格中的内容如何强制换行:有时候表格单元格中的内容不会换行,那么这个就会严重影响到用户体验,下面就简单介绍一下如何实现单元格中的内容换行.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.51texiao.cn/" />