VueJS - 防止默认链接点击但也捕获对象

Posted

技术标签:

【中文标题】VueJS - 防止默认链接点击但也捕获对象【英文标题】:VueJS - Prevent Default on link click but also capture object 【发布时间】:2015-08-12 17:35:20 【问题描述】:

我正在学习 Vue.JS,但遇到了一些问题。我希望用户能够单击<a href="#"></a> 标签e.preventDefault(),并获取与链接关联的对象。这是我的代码(注意我在 之前有@,因为我使用的是Blade):

<a href="#"
   class="list-group-item"
   v-repeat="responder: responders"
   v-on="click: showResponder(responder)">
    <div class="media">
        <div class="media-left">
            <img src="" v-attr="src: responder.avatar"  class="media-object"/>
        </div>
        <div class="media-body">
            <h4 class="media-heading">@ responder.first_name  @ responder.last_name </h4>
            <p>
                <strong><i class="fa fa-phone"></i> Phone:</strong> @ responder.phone 
            </p>
        </div>
    </div>
</a>

还有 javascript

var vm = new Vue(
    el: "#responderContainer",
    data: 
        activeResponder: null,
        responders: []
    ,
    methods: 
        showResponder: function(responder)
        
            // Here is where I wish to prevent the 
            // link from actually firing its default action
            responder.preventDefault();
            this.activeResponder = responder;
        
    
);

这可以抓取responder 对象但会触发链接 - 我需要能够同时获得e.preventDefault() 和获取对象。

谢谢!

【问题讨论】:

【参考方案1】:

或者,在 Vue 1.x 中,您也可以使用 event modifier .prevent

html

<a v-on:click.prevent="showResponder(responder)">...</a>

你也可以停止传播:

<a v-on:click.prevent.stop="showResponder(responder)">...</a>

JS:

...
            showResponder: function(responder)
            
                // No need to prevent any more
                this.activeResponder = responder;
            
...

【讨论】:

其实应该是v-on:click.prevent 当没有方法可以调用时如何防止事件传播,例如一个简单的&lt;a href="mailto:someone@example.org"&gt; 链接? 就@MladenDanic 而言,prevent 将阻止默认行为,prevent.stop停止传播。例如:如果您从下拉导航中的锚点单击触发自定义方法,prevent.stop 还将阻止“单击”事件,并保持下拉菜单打开。 prevent 将停止锚链接,但允许事件冒泡以实现“点击”行为【参考方案2】:

documentation 表明你可以通过 $event 来获取事件对象

http://vuejs.org/guide/events.html

<button v-on="click: submit('hello!', $event)">Submit</button>

/* ... */

  methods: 
    submit: function (msg, e) 
      e.stopPropagation()
    
  

/* ... */

所以你希望 v-on 属性是

v-on="click: showResponder(responder,$event)"

和函数定义为

showResponder: function(responder,e)

【讨论】:

【参考方案3】:

使用

@click.stop

如果您想使用 href 而不是自定义点击事件,则在父元素上停止事件冒泡。

<div @click.stop>
  <a href="//google.ca">Google</a>
</div>

【讨论】:

以上是关于VueJS - 防止默认链接点击但也捕获对象的主要内容,如果未能解决你的问题,请参考以下文章

使用jQuery防止元素“捕获”鼠标?

VUEJS - 为啥我得到:未捕获的类型错误:'instanceof' 的右侧?

VueJS:如何防止 textarea 默认行为

如何在 vuejs 中防止/停止点击传播

带有可点击链接的 Android TextView:如何捕获点击?

Vuejs中关于computedmethodswatch,mounted的区别