Vue中如何给动态生成的元素绑定点击事件

  原生的JS中给元素绑定点击事件是通过操作DOM,获取到这个元素,然后通过addEventListener来绑定点击事件,在Vue中不推荐操作DOM的这种方式,由于是动态生成的元素通过@click是没有效果的,那么有什么方式可以实现相同效果呢?

/** 这里利用了事件总线,代码如下:*/

const install = function (Vue) {

         const Bus = new Vue({

         methods: {

                  emit (event, ...args) {

                  this.$emit(event, ...args);

          },

            on (event, callback) {

                   this.$on(event, callback);

            },

            off (event, callback) {

                  this.$off(event, callback);

            }

        }

    });

    Vue.prototype.$bus = Bus;

    window.window$BUS = (event, ...args) => {        //主要代码

            Bus.$emit(event, ...args);

    };

};

Date.prototype.Format = function (fmt) {

        var o = {

              "y+": this.getFullYear(),                //年

              "M+": this.getMonth() + 1,                 //月份

              "d+": this.getDate(),                    //日

              "h+": this.getHours(),                   //小时

             "m+": this.getMinutes(),                 //分

             "s+": this.getSeconds(),                 //秒

             "q+": Math.floor((this.getMonth() + 3) / 3), //季度

             "S": this.getMilliseconds()             //毫秒

       };

    if (/(y+)/.test(fmt)) {

        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));

    }

    for (var k in o) {

        if (new RegExp("(" + k + ")").test(fmt)) {

            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));

        }

    }

    return fmt;

};

String.prototype.splice = function(start, newStr) {

    return this.slice(0, start) + newStr + this.slice(start);

};

export default install;

在window 对象上定义了一个方法,名为window$BUS,这个方法接收两个参数,第一个就是事件对象,第二个是一个...args意思是允许我们传多个参数。

定义好后使用方法如下:

  let str = '<div class="layerInformation-title">事件详情</div>' +

          '<div style="width: calc(100% - 20px);height: 200px;padding: 10px;">' +

          '<img src="'+ url +'" style="width: 100%;height: 100%;cursor:pointer;" οnclick="window$BUS(\'enlargePicture\',\'' + dataStr + '\')" />' +

          '</div>' +

          '<div class="layerInformation" style="width:460px;">' +

          '<span style="width: 50%;float: left;">所属单位:' + data.deptName + '</span>' +

          '<span style="width: 50%;float: left;">处理人:' + (data.conductor || '') + '</span>' +

          '<span style="width: 50%;float: left;">事件状态:' + this.treatmentFormatter({}, {}, data.treatmentState) + '</span>' +

          '<span style="width: 50%;float: left;">事件名称:' + data.eventName + '</span>' +

          '<span style="width: 50%;float: left;">事件类型:' + this.eventTypeFormatter({}, {}, data.eventType) + '</span>' +

          '<span style="width: 50%;float: left;">事件等级:' + this.eventGradeFormatter({}, {}, data.eventGrade) + '</span>' +

          '<span style="width: 50%;float: left;">经度:' + data.longitude + '</span>' +

          '<span style="width: 50%;float: left;">纬度:' + data.latitude + '</span>' +

          '<span style="width: 50%;float: left;">采集地点:' + data.gatheringPlaceName + '</span>' +

          '<span style="width: 50%;float: left;">上报人员:' + data.reportPersonnel + '</span>' +

          '<span style="width: 50%;float: left;">上报时间:' + data.reportTime + '</span>' +

          '<span style="width: 100%;float: left;">事件描述:' + data.incidentDescription + '</span>'

          '</div>'

这里通过onclick点击事件来触发 window$BUS方法,并且抛出事件对象,最后执行Bus.$emit(event, ...args),所以我们需要通过 this.$bus.on('enlargePicture', (odata)=>{let data = JSON.parse(decodeURI(odata));})来监听抛出的数据;

/**注意事项*/

这里直接获取的odata 是通过utf-8编码后的数据,需要通过decodeURI来进行解析,得到的是一个字符串对象,使用JSON.parse转成对象;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,可以通过使用v-on指令来实现动态绑定点击事件。v-on指令可以监听DOM事件,并触发相应的方法。要动态绑定点击事件,可以在v-on指令后面使用对象语法,将事件名称作为对象的属性,并将对应的方法作为属性值。 例如,如果你想要动态绑定一个点击事件来调用一个名为handleClick的方法,可以使用以下代码: ```html <button v-on="{ click: handleClick }">点击我</button> ``` 在上述代码,v-on指令后面的对象字面量click事件名称,handleClick是方法名。这样,当按钮被点击时,Vue会自动调用handleClick方法。 另外,你也可以使用v-bind指令动态绑定事件类型。例如,如果你有一个变量eventType,你可以通过以下方式动态绑定点击事件类型: ```html <button v-on="{ [eventType]: handleClick }">点击我</button> ``` 上述代码,eventType是一个变量,它可以根据需要改变,从而动态绑定不同的事件类型。 总结起来,Vue可以通过v-on指令和v-bind指令来实现动态绑定点击事件。使用v-on指令时,可以通过对象语法将事件名称和对应的方法进行绑定;使用v-bind指令时,可以动态绑定事件类型。这样,就可以实现在Vue动态绑定点击事件了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue如何给动态生成元素绑定点击事件](https://blog.csdn.net/xzg199153/article/details/122730073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue动态生成dom并且自动绑定事件](https://download.csdn.net/download/weixin_38515270/14806994)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值