Vue.js 绑定到名称中带有点的 DOM 自定义事件(如引导事件)

Posted

技术标签:

【中文标题】Vue.js 绑定到名称中带有点的 DOM 自定义事件(如引导事件)【英文标题】:Vue.js bind to DOM custom event with dots in name (like bootstrap events) 【发布时间】:2017-06-30 09:09:28 【问题描述】:

使用 Vue 2.1.10

我可以使用v-on 指令绑定到DOM 事件。例如:

v-on:click

绑定到 DOM 点击。 但我不知道如何绑定到名称中带有点的事件。例如引导程序中的“show.bs.modal”。

目前,我在 created 钩子中使用常规 DOM 方法的解决方法绑定,但我真的很想为此使用声明性语法。如何做到这一点?谢谢

编辑: 问题是关于允许的语法:我该怎么做:

Vue.component('comp',
  template:'<div v-on:show.bs.modal="sunrise"></div',
  methods:
    sunrise:function(e)

     

   
)

【问题讨论】:

你所说的点是类名吗? '.class.name' 你能在这个演示问题上抛出一个 jsfiddle 吗? @Austio 不是“小提琴”问题,是语法问题,请参阅编辑 看到这个:github.com/vuejs/vue/issues/201 所以,应该是这样的:v-on="show.bs.modal:..." 这个很老了,不知道还能不能用,试试看。 【参考方案1】:

我认为v-on 不支持点,但您可以创建自定义指令来为该事件创建事件侦听器。

不确定是否有更简单的方法,但在下面的演示中或者这个fiddle 应该可以工作。

该演示创建了一个名称中带有点的新事件,但它也应该适用于引导事件(未经测试)。如果它不适用于引导程序,请告诉我,我会看看。

只有在您使用v-if 时才能解除绑定。如果您直接使用 javascript 删除该元素。该活动仍将在那里。

var helloEvent = new Event('demo.event.hello');

document.addEventListener('demo.event.hello', function(e) 
  // this is just for testing event dispatching!
  console.log('main event listener');
, false);

const bindCustomEvent = 
  getName: function(binding) 
    return binding.arg + '.' +
      Object.keys(binding.modifiers).map(key => key).join('.');
  ,
  bind: function(el, binding, vnode) 
    const eventName = bindCustomEvent.getName(binding);

    console.log(el, eventName);
    document.addEventListener(eventName, binding.value);
  ,
  unbind: function(el, binding) 
    const eventName = bindCustomEvent.getName(binding);
    console.log('unbinding', eventName);
    document.removeEventListener(eventName, binding.value);
  
;

Vue.directive('bindCustomEvent', bindCustomEvent);

new Vue(
  el: '#app',
  data() 
    return 
      enabled: true,
      eventMsg: ''
    ;
  ,
  methods: 
    sunrise: function(e) 
      console.log('received event');
      this.eventMsg = 'received event';
    ,
    testEvent: function() 
      document.dispatchEvent(helloEvent);
    ,
    toggle: function() 
      console.log('toggle', this.enabled);
      this.enabled = !this.enabled;

      if (!this.enabled) 
        this.eventMsg = '';
      
    
  
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.js"></script>
<div id="app">
  <div v-bind-custom-event:demo.event.hello="sunrise" v-if="enabled">
    Hello, eventMsg
  </div>

  <!--
  The following markup is not working
  <div v-on="demo.event.hello:sunrise" v-if="enabled">
    Hello, eventMsg
  </div>-->
  <button @click="testEvent()">
    Change
  </button>
  <button @click="toggle">
    <span v-if="enabled">disable custom event</span>
    <span v-else>enable custom event</span>
  </button>
</div>

【讨论】:

【参考方案2】:

我在处理旧项目时遇到了同样的问题。

幸运的是我在这里找到了答案:vue2 doc

<!-- object syntax (2.4.0+) -->
<button v-on=" mousedown: doThis, mouseup: doThat "></button>

这适用于带有 Vue 2.16.14 的 Bootstrap 5.1.1:

<div class="modal" v-on=" 'hide.bs.modal': handleModalClose ">
...
</div>

【讨论】:

以上是关于Vue.js 绑定到名称中带有点的 DOM 自定义事件(如引导事件)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue.js 中保留自定义组件标签名称

什么是vue.js中的自定义指令?

Vue.js自定义指令的用法与实例

如何创建从 vue.js 实例到自定义原生 Web 组件的双向绑定?

Vue.js入门教程(三)双向绑定和数据渲染

Vue深度学习