Vue 教程

浏览29561
更新时间2025-08-22

接收发出事件

自定义发出事件"toggle-favorite"现在从 FoodItem.vue 组件发出,但我们需要侦听 App.vue 父组件中的事件并调用执行某些操作的方法,以便我们可以看到事件发生。

我们在创建组件的 App.vue 中使用简写 @ 而不是 v-on: 来监听事件:

示例

监听 App.vue 中的"toggle-favorite"事件:

<food-item
  v-for="x in foods"
  :key="x.name"
  :food-name="x.name"
  :food-desc="x.desc"
  :is-favorite="x.favorite"
  @toggle-favorite="receiveEmit"
/>

当我们的自定义"toggle-favorite"事件发生时,我们需要在 App.vue 中创建"testEmit"方法,以便我们可以看到事件发生:

methods: {
  receiveEmit() {
    alert('Hello World!');
  }
}
运行示例 »

更改父项中食物项的"收藏夹"状态

我们现在有一个事件,当从子组件中单击"收藏夹"按钮时,该事件会通知 App.vue

我们希望在单击"收藏夹"按钮时更改 App.vue 中"食物"数组中的"收藏夹"属性,以获取正确的食物项。 为此,我们将食品名称从 FoodItem.vue 发送到 App.vue,因为每个食品名称都是唯一的:

FoodItem.vue:

methods: {
  toggleFavorite() {
    this.$emit('toggle-favorite', this.foodName);
  }
}

我们现在可以在 App.vue 中接收食物名称,作为"toggle-favorite"事件发生时调用的方法的参数,如下所示:

示例

App.vue:

methods: {
  receiveEmit(foodId) {  
    alert( 'You clicked: ' + foodId );
  }
}
运行示例 »

现在我们知道点击了哪些食物项,我们可以更新"foods"数组中正确食物项的"favorite"状态:

App.vue:

methods: {
  receiveEmit(foodId) {
    const foundFood = this.foods.find(
      food => food.name === foodId
    );
    foundFood.favorite = !foundFood.favorite;
  }
}

在上面的代码中,数组方法"find"遍历"foods"数组,查找 name 属性等于我们单击的食物项的对象,并将该对象作为"foundFood"返回。 之后,我们可以将 'foundFood.health' 设置为与之前相反,以便它在 truefalse 之间切换。

在此处了解有关 JavaScript 数组方法"find"的更多信息。

在此处了解有关 JavaScript 箭头函数的更多信息。

'foods' 食物数组中的正确食物现在会更新其"收藏夹的"状态。 剩下的唯一一件事就是更新指示收藏夹的食物的图像。

因为食物项组件已经使用"foods"数组中的"favorite"状态创建,并作为 App.vue 中的"is-favorite"属性发送,所以我们只需要在 FoodItem.vue 中引用此"isFavorite"属性即可 v-show 其中 <img> 元素是更新图像:

<img src="/img_quality.svg" v-show="isFavorite">

我们还可以删除 FoodItem.vue 中的"foodIsFavorite"数据属性,因为它不再使用。

示例

在最后的示例代码中,可以按照与以前类似的方式切换食物的收藏夹状态,但现在收藏夹状态已在 App.vue 内的正确位置进行了修改。

运行示例 »

'emits'选项

与我们在 FoodItem.vue 组件中声明 props 的方式相同,我们也可以使用 Vue 'emits' 选项来记录组件发出的内容。

Props 必须在组件中声明,而emits 则建议记录下来。

这就是我们在 FoodItem.vue 组件中记录 emit 的方式:

<script>
export default {  
  props: ['foodName','foodDesc','isFavorite'],
  emits: ['toggle-favorite'],
  methods: {
    toggleFavorite() {
      this.$emit('toggle-favorite', this.foodName);
    }
  }
};
</script>

当 emits 被记录下来时,该组件将变得更容易被其他人使用。


Vue 练习

通过练习测试自己

练习题:

props 用于将数据从父元素发送到子组件,
 用于将信息从子组件传递到父组件。

相关视频

更多

免费

前端入门_HTML5
初级前端入门_HTML5

64.8万次学习

收藏

免费

30分钟学会网站布局
初级30分钟学会网站布局

24.6万次学习

收藏

免费

CSS视频教程-玉女心经版
初级CSS视频教程-玉女心经版

41.1万次学习

收藏

免费

JavaScript极速入门_玉女心经系列
初级JavaScript极速入门_玉女心经系列

76.4万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

64.9万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.2万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.6万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.1万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.3万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.2万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.1万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载