美文网首页
给组件绑定原生事件

给组件绑定原生事件

作者: 李浩然_6fd1 | 来源:发表于2019-03-17 00:48 被阅读0次
<body>
    <div id="root">
        <child @click="handleClick"></child>
    </div>

    <script>
        Vue.component('child',{
            template:'<div>Child</div>'
        })

        var vm = new Vue({
            el:"#root",
            methods:{
                handleClick:function(){
                    alert('click')
                }
            }
        })
    </script>
</body>

这个例子,最终页面上显示的是Child,上面这个代码的本意是想给一个点击事件,当点击Child的时候,页面会弹出来'click'这个弹窗。
但是用上面这个代码出来的页面,点击后是没有任何的反应的。
当给组件绑定事件的时候,实际上绑定的是一个自定义的事件,
下面是修改后的例子:

<body>
    <div id="root">
        <child @click="handleClick"></child>
    </div>

    <script>
        Vue.component('child',{
            template:'<div @click="handleChildClick">Child</div>',
            methods:{
                handleChildClick:function(){
                    alert('child click')
                    this.$emit('click')
                }
            }
        })

        var vm = new Vue({
            el:"#root",
            methods:{
                handleClick:function(){
                    alert('click')
                }
            }
        })
    </script>
</body>

在局部组件中,div上绑定的事件是监听的原始事件,而在child标签上绑定的事件是监听的自定义事件,自定义事件的触发,也就是子组件去触发父组件事件的监听,需要调用this.emit()去触发自定义事件. 这样再去网页中去点击查看的时候, 就会发现可以弹出弹窗。 整个事件的逻辑是:当点击的时候,子组件中的div标签觉察到被点击,然后向外触发一个自定义事件(this.emit('click')),在child标签中监听到了这个自定义事件,这时这个handleClick事件就会被执行。
过程需要两层的传递,整个过程很麻烦。
需要用到一个新的东西,事件的修饰符:native

<body>
    <div id="root">
        <child @click.native="handleClick"></child>
    </div>

    <script>
        Vue.component('child',{
            template:'<div>Child</div>',
        })

        var vm = new Vue({
            el:"#root",
            methods:{
                handleClick:function(){
                    alert('click')
                }
            }
        })
    </script>
</body>

这个时候,在组件上面做组件的监听,监听到的不是一个自定义的事件,而是原生的点击事件。这个时候监听的已经不是内部组件向外触发的自定义事件了,而是原生的点击事件。

相关文章

网友评论

      本文标题:给组件绑定原生事件

      本文链接:https://www.haomeiwen.com/subject/vefymqtx.html