2019.12.14周六,天气晴,看vue官方广告链接的视频学习一会

主要讲解@click系列事件

目录

v-cloak

@click.stop与@click.prevent

@click.capture(捕获)

.self

@click.prevent.self和@click.self.prevent区别

.once


====以后还是写点东西吧,流水账都行,主要是变懒了,记录关键词百度搜一下就行了,或者链接到别人写的好的博客====


v-cloak

vue实例中...data:{msg:"hello"}...

css中

<style>

[v-cloak] {

display:none;

}

</style>

v-cloak属性(解决插值表达式闪烁的问题,可在network设置为slow 3G),没使用v-cloak刷新发现没加载出来的时候{{msg}},加载出来后就是表达式的值hello,如果用了v-cloak,没加载出来的时候不会显示{{msg}},加载完成后才会显示hello,体验好一点

比如别人博客讲解:说说 Vue.js 中的 v-cloak 指令

(别人博客写得好好的,不用重复啰嗦了,直接看就好了)


@click.stop与@click.prevent

@click.stop 阻止事件冒泡

@click.prevent 阻止事件的默认行为

<a href="http://www.baidu.com" @click.prevent="test4">百度一下</a>   //阻止a标签跳转,仅执行函数test4

<a href="tel:10086" @click.prevent>10086</a> // 阻止拨打电话,这是个坑,在移动端需要注意
另外,href="tel:10086"在ios端点击一次是无法拨打的,很容易被忽略,ios必须长按这里这个链接才会提示是否拨打电话,而在android点一下就可以跳转到拨号页面

<form  action="/xxx"   @submit.prevent="test5">   //阻止表单提交,仅执行函数test5

<input type="submit" value="注册">
</form>

@click.capture(捕获)

<div v-on:click.capture="doThis">...</div>
意思就是不加.capture是事件冒泡(默认就是冒泡),加上.capture就是事件捕获(写在外层就先捕获外层的),若有多个该修饰符,则由外而内触发。
就是谁有该事件修饰符,就先触发谁。

<div @click="console.log('==1')" style="width:500px;height:500px;background-color:red">
    <div @click.capture="console.log('-----2')" style="width:300px;height:300px;background-color:green">
        <div @click="console.log('===3')" style="width:100px;height:100px;background-color:blue">
			<div @click="console.log('===4')" style="width:50px;height:50px;background-color:pink"></div>
        </div>
    </div>
</div>

最外层500*500px->red

次外层300*300px->green

中层100*100px->blue

最内层50*50px->pink

这里capture次外层,最内层,所以点击内层触发依次为

-----2
===4
===3
==1

说明:先触发的都是capture(都有capture的情况下从外到内依次触发),其次再是默认冒泡的

这里优先capture由外到内触发2、4,接着由内到外冒泡 3、1

盗取一张图


.self

使用.self实现只有点击当前元素的时候,才会触发事件处理函数。

本来想在网上弄一段代码,发现不是太啰嗦就是冗余太多,没贴关键代码,看的脑阔疼,还是自己敲一下

<div class="inner" @click.self="div1Handler">
    <input type="button" value="戳我试试" @click="btnHandler">
</div>

这段代码看到@click.self,也就是说,我点击button的时候,不会去执行div1Handler,咦??这怎么看起来是阻止了冒泡,确实从现象上来看是这样,但是这个应该解释为,点击子元素仍然会冒泡,但是我不接,你只有点击我的时候我才执行div1Handler。

看一下下面代码:

<div id="app" v-on:click.self="close">
    <button>点击</button>
</div>

不管你怎么点击按钮,都不会去执行close方法,因为你的self会忽略冒泡,除非这里的div是@click="close"才会收到子元素的冒泡去执行close方法


@click.prevent.self和@click.self.prevent区别

<div @click="alert">
      <a href="/#" @click.prevent.self="alert">
        <div @click="alert"></div>
      </a>
    </div>
// 点击div3,会alert3,alert1。不但阻止了alert(2),还阻止了a的默认跳转。

// 因为点击的时候会先prevent,阻止默认事件,阻止了跳转;然后判断是否是self,因为点击到的是div3,所以不是self,阻止了alert(2)。

    <div @click="alert">
      <a href="/#" @click.self.prevent="alert">
        <div @click="alert"></div>
      </a>
    </div>
// 点击div3,会alert3,alert1,跳转到/#。只阻止了alert(2)。

// 因为会先判断self,点击到div3,不是self,所以不会执行click事件,就不会执行 阻止默认事件和alert(2) ,所以可以跳转

这里self忽略冒泡没得说,也就是子元素不会触发我的click方法,继续可以冒泡,反正我这里忽略了。

prevent在前后的问题-->prevent在前,阻止默认跳转,prevent在后,那跳转就阻止不了

很简单记的呀

.once

once:事件仅生效一次,一般与点击事件配合使用,比如@click.once。使得只可以点击一次。

比如:

<button @click.once='alert("我就第一次出现")'>点击</button>

又比如

<a href="https://www.baidu.com" @click.prevent.once> 第一次点击被阻止</a>

这个链接点击第二次及以后都可以跳转,第一次被阻止



===============Talk is cheap, show me the code================