Vue2.x与bootsrap-table动态添加元素和绑定事件无效

 一、问题:

      最近在使用vue与bootstrap-table结合生成表格时,按以前的经验----每列数据可用formatter:function(value,row,index){}进行一些其他的操作,动态拼接的html元素和绑定的方法事件都可正常执行,但在vue内使用后,拼接的元素显示正常,其绑定的方法却失效了。F12查看元素时发现绑定的@click=""被解析成字符串。

 二、原因: 

    这是由于vue的生命周期导致的,vue在初始化时@click已编译,但此时boostrap-table动态添加的dom元素还未加载进来。导致@click并未绑定到dom元素上,被解析成字符串。

 

 三、解决方案:

    能不能在boostrap-table随vue一起初始化时,把动态添加dom元素同时挂载到vue实例,使得table和动态dom同时初始挂载

  使用Vue操作解决方案:

       ① 创建组件

  

var toolsComponent = Vue.extend({
          props:['id','isOpen','url','hostUrl'],
          template: `<div style="display:flex;" >
                             <button class="btn btn-danger btn-sm"  style="margin:0 0 0 auto" @click="remove(id,url)">删除</button>
                              <button :class="isOpen == true ? 'btn btn-success btn-sm': 'btn btn-warning btn-sm' "  style="margin:0 0"  @click="changeOpen(id,isOpen)" >{{isOpen == "true" ? "启用" : "停用"}}</button>
                             <a class="btn btn-primary btn-sm"  style="margin:0 auto 0  0"  :href="hostUrl + '/getNews/' +url "   target="_blank">查看</a>
                             </div>
                             `,
          methods:{
                  changeOpen(newsId,openParam){}
                  remove(id,url){}
            }
})    

  ② 在bootstrap-table 加载成功后动态的将组件注入到对应的dom节点。

    {
                  title : '操作',
                  align : 'center',
                  valign: 'middle',
                  width: '15%',
                  formatter : function(value, row, index) {
                  var openParam = "";
                  if(row.isOpen == false){
                    openParam = "true";
                    }else if(row.isOpen == true){
                    openParam = "false";
                    }
                    var url = row.newsUrl;
                    var id = "row"+row.id;
                    var buttonStr = "<div class='rowOperator' id="+id+" isOpen="+openParam+" newsUrl='"+url+"'></div>";
                    return buttonStr;
                  }
     }
 onLoadSuccess:function(){
            $(".rowOperator").each(function () {
                var idTemp = $(this).attr("id");// row+id
                var isOpen = $(this).attr("isOpen");
                var newsUrl = $(this).attr("newsUrl");
                new toolsComponent({propsData: {id : idTemp.substring(3),isOpen:isOpen,hostUrl:hostUrl,url:newsUrl}}).$mount('#'+$(this).attr("id"));
                });
}

①、构建组件时要传入值时,借助props:['id']。但是真正创建组件时是使用propsDate进行值传入。

②、组件挂载时,使用.$mount('#id')这种方式(现在使用的)时,是直接将挂载点替换了

③、onLoadSuccess:function(){}内可注入多个组件,且组件顺序要按照需要动态添加dom元素的列顺序对应

 

 

转载于:https://www.cnblogs.com/Joker-Face/p/11019888.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值