vue.js reference div id on v-on:click vue.js reference div id on v-on:click vue.js vue.js

vue.js reference div id on v-on:click


You can extend your event handler with the event object $event. That should fit your needs:

<div id="foo" v-on:click="select($event)">...</div>

The event is passed on in javascript:

export default {    methods: {        select: function(event) {            targetId = event.currentTarget.id;            console.log(targetId); // returns 'foo'        }    }}


As mentioned in the comments, $event is not strictly necessary, when using it as the only parameter. It's a nice reminder that this property is passed on, when writing it explicitly.

However, nobody will stop you from writing the short notation:

<div id="foo" @click="select">...</div>


Beware that the method will not receive the $event object when you add another parameter. You need to explicitly add it at the position you will handle it in the listener. Any parameter order will work:

<div id="foo" @click="select(bar, $event)">...</div>

To find more options of the v-on directive, you can look through the corresponding entry in the vue documentation:

Vue API Documentation - v-on


Inspired by @nirazul's answer, to retrieve data attributes:

HTML:

<ul>    <li            v-for="style in styles"            :key="style.id"            @click="doFilter"            data-filter-section="data_1"            :data-filter-size="style.size"    >        {{style.name}}    </li></ul>

JS:

export default {    methods: {        doFilter(e) {            let curTarget = e.currentTarget;            let curTargetData = curTarget.dataset;            if (curTargetData) {                console.log("Section: " + curTargetData.filterSection);                console.log("Size: " + curTargetData.filterSize);            }        }    }}


Just to highlight another option than the selected answer for the same question, I have a delete button on a record and want to perform an action with the record's unique id (a number). I could do the selected answer as before:

<button :id="record.id" @click="del">×</button>

This leaves the unfortunate reality that my del function needs to pull the id attribute out of the javascript event, which is more about the API (the DOM) than my domain (my app). Also using a number as an element id isn't ideal and could cause a conflict if I do it more than once in a view. So here's something that's just as clear and avoids any future confusion:

<button @click="()=>del(record.id)">×</button>
methods: {  del(id) {    fetch(`/api/item/${id}`, {method:"DELETE"})  }}

You see, now my del function takes the record id instead of an event, simplifying things.


Note that if you do this wrong, you will invoke your delete function immediately, which is not what you want. Don't do this:~~

<button @click="del(record.id)">×</button>

If you end up doing that, Vue will call the del function every time this html fragment is rendered. Using the anonymous function ()=>del(record.id) will return a function that's ready to be executed when the click event happens.

Actually @nirazul proved this is fine. Not sure what my issue was.