Conditional event binding – vuejs

Update (February 2021)

Several solutions seem to be accepted on Github, whereas my original answer is not. I’m rounding them up here for convenience:

Solution 1a (see Engin Yapici’s answer below):

v-on="enableClick ? { click: clickHandler } : {}"

Solution 1b (see Heals Legodi’s answer below):

v-on="enableClick ? { click: () => clickHandler(params) } : {}"

Solution 2a (see rvy’s answer below and this working demo)

@[eventName]="clickHandler"

Solution 2b (from coyotte508’s comment; 2a without the computed property):

@[isClickable&&`click`]="clickHandler"

Solution 3 (mentioned here; seems to be compatible with event modifiers):

@click="enableClick && clickHandler"

Original answer

This works as of Vue 2.6:

<div
  @mouseover="enableMouseover ? mouseoverHandler : null"
  @click="enableClick ? clickHandler : null"
  ...
>

While an event resolves to null, the binding will be removed.

https://github.com/vuejs/vue/issues/7349#issuecomment-458405684

Comments on original answer

It seems to be something I came up with accidentally by misunderstanding that Github thread. But I know from my own testing that it definitely worked back when I posted it. And people continued to upvote it right up to when I made this edit, implying the solution still had some merit. So give it a try if you like.

But after a downvote and a couple of negative comments, I felt the need to improve my answer to save future readers potential headaches. Note that pretty much all the answers to this question refer to the same Github thread, so if you’ve got time, you might want to go right to the source to learn more. There are many options discussed there, and I suspect more will continue to be posted over time.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)