Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

onclick

vue.js

Using v-on:click I'd like to set a variable with the id of the div in Vue.JS - how do I reference this?

<div id="foo" v-on:click="select">...</div>

<script>
    new Vue({
        el: '#app',
        data: {
        },
        methods: {
            select: function(){
                divID = this.id // ??
                alert(divID)
            }
        }
    })
</script>
like image 827
Mike Thrussell Avatar asked May 01 '16 15:05

Mike Thrussell


People also ask

What is V$ in Vue?

$v is an object that calls vuelidate (at the time of writing the comment, supported in version Vue.

Can I use getElementById in Vue?

The use of JavaScript's getElementById is not encouraged in Vue, as it creates performance issues. Vue's ref helps you “reference” DOM elements in a more efficient way.

What is V cloak?

The v-cloak directive is a Vue. js directive that will remain on the element until the associated Vue instance finishes compilation. Combined with CSS rules such as [v-cloak] { display: none }, this directive can be used to hide uncompiled mustache bindings until the Vue instance is ready.

What is the shorthand way to invoke a function when a click event is fired?

v-on will trigger the expression or the method specified when the click event in triggered on the button element.


2 Answers

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

like image 71
nirazul Avatar answered Oct 23 '22 19:10

nirazul


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);
            }
        }
    }
}
like image 2
Maroun Melhem Avatar answered Oct 23 '22 21:10

Maroun Melhem