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

alo*_*ser 5 vue.js vuejs2

使用 Vue 2.1.10

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

v-on:click
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

     }

   }
})
Run Code Online (Sandbox Code Playgroud)

小智 9

我在处理旧项目时面临着同样的问题。

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

<!-- object syntax (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
Run Code Online (Sandbox Code Playgroud)

这适用于 Bootstrap 5.1.1 和 Vue 2.16.14:

<div class="modal" v-on="{ 'hide.bs.modal': handleModalClose }">
...
</div>
Run Code Online (Sandbox Code Playgroud)


AWo*_*olf 2

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

不确定是否有更简单的东西,但像下面的演示或这个小提琴应该可以工作。

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

仅当您使用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 = '';
      }
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)