vue click.capture
by ysuper
HTML
<script src="https://unpkg.com/vue@next"></script>
<div id="app">
<div class="p" v-show="msg.length > 0">
<div v-for="m in msg">{{ m }}</div>
</div>
<div class="wrap">
click without event capture
<div class="outer" @click="alert('Outer')">
<span>Outer</span>
<div class="inner" @click="alert('Inner')">Inner</div>
</div>
</div>
<div class="wrap">
click with event capture
<div class="outer" @click.capture="alert('Outer')">
<span>Outer</span>
<div class="inner" @click="alert('Inner')">Inner</div>
</div>
</div>
</div>
SCSS
body {
padding: 1rem;
}
.p {
margin-bottom: 1rem;
padding: 10px;
background-color: yellow;
div {
margin-bottom: 5px;
}
}
.app {
overflow: hidden;
}
.wrap {
float: left;
margin-right: 3rem;
margin-bottom: 2rem;
}
.outer {
cursor: pointer;
position: relative;
width: 150px;
height: 150px;
padding: 25px;
background-color: #ccc;
text-align: center;
margin-top: 1rem;
&:hover{
background-color: darken(#ccc, 10%);
}
}
.inner {
cursor: pointer;
position: relative;
top: 50%;
left: 50%;
margin-left: -45px;
margin-top: -55px;
width: 90px;
height: 90px;
text-align: center;
line-height: 70px;
background-color: #f00;
color: #fff;
&:hover{
background-color: darken(#f00, 10%);
}
}
JavaScript
const vm = Vue.createApp({
data(){
return {
msg: []
}
},
methods: {
alert(val){
this.msg.push(val);
window.setTimeout(() => {
this.msg = [];
}, 3000);
}
}
}).mount('#app');