深入浅析深入浅析vue组件间事件传递组件间事件传递
由于新工作需要用vue,所以最近接触最多的也是vue,因为之前一直在用react,所以对于vue上手还是很快的。
我也尽量找一些他们两个的异同点,除了多了一些辅助用的方法以外,最大的不同应该是对于组件间的通信,不仅有props,
还有一种事件监听,也是可以通过组件间传递的。
但是,在vue2.+中,vue引入了diff算法和虚拟dom来提升效率。我们知道这些事为了处理频繁更新dom元素所提出的一种优化
方案,可频繁变动更新以及事件监听的初始化之间是否会有矛盾,当组件需要变动时,有没有对注册过的事件进行解绑? 我
们来写一些简单的代码印证一下。
我们写两个div做的按钮,一个是写的html代码,一个是通过组件的形式插入,两个按钮完全一样,但我们加一个disabled的属
性在外层,并通过if-else来判断disabled从而显示不同的按钮(当然正常场景下我们不会这么去写代码,这里只是通过这种方
式模拟一种特殊场景,我们自行考虑在我们的业务中是否存在这种场景)。
<template>
<div class="test">
<div class="btn" v-if="disabled" @click="handleClick">可点击</div>
<div class="btn" v-else >不可点击</div>
<Button v-if="disabled" @clickTest="handleClick">可点击</Button>
<Button v-else>不可点击</Button>
</div>
</template>
<script>
import Button from './Button'
export default {
data () {
return {
disabled: true
}
},
methods: {
handleClick() {
alert('可点击')
}
},
components: {
Button,
},
mounted() {
setTimeout(() => {
this.disabled = false
}, 1000)
}
}
</script>
<style>
.btn{
margin: 100px auto;
width: 200px;
line-height: 50px;
border: 1px solid #42b983;
border-radius: 5px;
color: #42b983;
}
</style>
我们加一点样式,让他尽量好看一点,看着很简单,两个按钮,可点击时为他绑定一个点击事件,不可点击时不为他绑定。不
同点是一个是直接写的html代码,一个是组件。组件的代码如下:
<template>
<div class="btn" @click="handleClick"><slot></slot></div>
</template>
<script>
export default {
methods: {
handleClick() {
this.$emit('clickTest')