click-counter.vue的代码
<template>
<div class="click-counter">
<div class="counter-num">次数:{{num}}</div>
<button class="counter-btn" @click="handleClick">点我呀!</button>
<button class="counter-reset-btn" @click="handleResetClick">清零</button>
</div>
</template>
<script>
export default {
// 增加一个可从外部传入的属性initNum
props: {
initNum: {
type: Number,
default: 0
}
},
data() {
return {
num: this.initNum //使用传入的initNum值作为初始的点击数
};
},
methods: {
handleClick() {
this.num += 1;
this.notifyNum();
},
handleResetClick() {
this.num = 0;
this.notifyNum();
},
notifyNum() {
//触发自定义事件 clicknum
this.$emit("clicknum", {
num: this.num
});
}
}
};
</script>
<style scoped>
.click-counter {
display: flex;
align-items: center;
justify-content: center;
border: 1px solid red;
background-color: #ffffff;
padding: 10px;
}
.counter-num,
.counter-btn,
.counter-reset-btn {
flex: 1;
margin: 3px;
}
</style>
index.vue的代码:
<template>
<div class="container" @click="clickHandle">
<div class="message">{{msg}}</div>
<!-- 使用 click-counter 组件 -->
<click-counter :init-num="10" @clicknum="handleClickNum" />
</div>
</template>
<script>
// 导入 click-counter 组件
import ClickCounter from "@/components/click-counter";
export default {
// 声明在当前组件下使用 counter-click 组件
components: { ClickCounter },
data() {
return {
msg: "Hello"
};
},
methods: {
clickHandle() {
this.msg = "Clicked!!!!!!";
},
handleClickNum(data) {
console.log(">>>>>>", data.num);
}
}
};
</script>
<style scoped>
.message {
color: red;
padding: 10px;
text-align: center;
}
</style>
观察以上修改后的代码可以发现,在click-couter.vue中的主要变化是:
使用props定义了一个名为initNum的数字型组件属性(且初始值为0)。它可用于接收使用组件外部传入的值。然后,这个initNum值被赋值到data中的属性num上作为它的初始值。
在两个按钮的click事件处理方法中,额外调用了一个notifyNum()方法,它向组件触发了一个自定义事件clicknum并携带了当前点击次数值。
而在index.vue中的主要变化是实例化click-counter组件的这行代码:
<click-counter :init-num="10" @clicknum="handleClickNum" />
实例化组件的时候,为组件传入了initNum属性值10;并且添加了一个对自定义事件clicknum的监听方法。
这样一个结构实现了数据进入组件/数据传出组件的机制,父子组件之间就能实现数据通信。通过有限的通信点进行数据互换,而不是直接进行函数调用,可以使得代码结构更优雅、更易维护。

作者:一斤代码
链接:https://www.jianshu.com/p/32997f74c828
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论