通过事件向父组件发送消息:
在我们开发 <blog-post>(博客贴子) 组件时,它的一些功能可能要求我们和父级组件进行沟通。
例如我们可能会引入一个可访问性的功能来放大博文的字号,同时让页面的其它部分保持默认的字号。
1.在其父组件中,我们可以通过添加一个 postFontSize 数据属性来支持这个功能:
new Vue({
el: '#blog-posts-events-demo',
data: {
posts: [/* ... */],//里面写自定义内容
postFontSize: 1
}
})
2.它可以在模板中用来控制所有博文的字号:
<div id="blog-posts-events-demo">
<div :style="{ fontSize: postFontSize + 'em' }">
<blog-post
v-for="post in posts"
v-bind:key="post.id"
v-bind:post="post"
></blog-post>
</div>
</div>
3.现在我们在每篇博文正文之前添加一个按钮来放大字号:
Vue.component('blog-post', {
props: ['post'],
template: `
<div class="blog-post">
<h3>{{ post.title }}</h3>
<button>
Enlarge text
</button>
<div v-html="post.content"></div>
</div>
`
})
4.问题是这个按钮
<button>
扩大 文本
</button>
5.当点击这个按钮时,我们需要告诉父级组件放大所有博文的文本。幸好 Vue 实例提供了一个自定义事件的系统来解决这个问题。我们可以调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件:
<button v-on:click="$emit('enlarge-text')">
扩大文本
</button>
6.然后可以用v-no在博文组件上监听这个事件,就像监听一个原生 DOM 事件一样:
<blog-post
...
v-on:enlarge-text="postFontSize += 0.1" 绑定事件
></blog-post>
7.我用这些知识例了一个小的案列:
案例代码如下:
html代码:
<div id="blog-posts-events-demo" class="demo">
<div :style="{ fontSize: postFontSize + 'em' }">
<blog-post v-for="post in posts" v-bind:key="post.id" v-bind:post="post"
v-on:enlarge-text="postFontSize += 0.1">
</blog-post>
</div>
</div>
js代码:
<script>
//子组件的写法
Vue.component('blog-post', {
props: ['post'],
template: '\
<div class="blog-post">\
<h3>{{ post.title }}</h3>\
<button v-on:click="$emit(\'enlarge-text\')">\
扩大 文本\
</button>\
<div v-html="post.content"></div>\
</div>\
'
})
new Vue({
el: '#blog-posts-events-demo',
data: {
posts: [
{ id: 1, title: '我是粗', content: '...我是细...' },
{ id: 2, title: '我是粗', content: '...我是细...' },
{ id: 3, title: '我是粗', content: '...我是细...' }
],
postFontSize: 1 //字体大小
}
})
</script>
案例的效果如下:

2.使用事件抛出一个值
1.有的时候用一个事件来抛出一个特定的值是非常有用的。例如我们可能想让 <blog-post>组件决定它的文本要放大多少。这时可以使用 $emit 的第二个参数来提供这个值:
<button v-on:click="$emit('enlarge-text', 0.1)">
扩大文本
</button>
2.然后当在父级组件监听这个事件的时候,我们可以通过 $event 访问到被抛出的这个值:
<blog-post
...
v-on:enlarge-text="postFontSize += $event">
</blog-post>
3.或者,如果这个事件处理函数是一个方法:
<blog-post
...
v-on:enlarge-text="onEnlargeText">
</blog-post>
4.那么这个值将会作为第一个参数传入这个方法:
methods: {
onEnlargeText: function (enlargeAmount) {
this.postFontSize += enlargeAmount
}
}
到目前为止我对vue组件之间的传值,和使用事件抛出一个值了解的就这么多。