我有我的APP。js
import { createApp } from 'vue';
import ProductsGrid from './components/ProductsGrid.vue';
import Cart from './components/Cart.vue';
import NavLink from './components/NavLink.vue';
import Navbar from './components/Navbar.vue';
const app = createApp({
components: {
'products-grid': ProductsGrid,
'cart': Cart,
}
});
app.mount('#app');
我的产品网格组件只是列出了从API获取的项。每个项目具有“购买”按钮。当你按下一个按钮时,它会发出这个buy事件:
buy(product) {
this.$emit('buy', product);
console.log("buy event triggered on produt "+product.id);
},
文本和给定产品显示在控制台日志中。
但是我想把它们加到购物车里,这是一个单独的组件。我该怎么做?我知道你可以用v-on
(或@
smth)监听同一个组件中的事件,但这在我的情况下不起作用。
cart组件就是这样的:
addProductToCart(product) {
console.log(product+" product received by products grid component");
},
我应该如何从另一个组件侦听事件?还是我做错了?
我在一个laravel项目中使用这些,所以这些vue组件被用在刀片模板中。
2条答案
按热度按时间pcww981p1#
您可以使用事件总线来处理这种情况
在main中创建事件总线。js
在组分A中。vue(通过事件总线发出事件)
在组分B中。vue(listen event emitted from event bus)
h5qlskok2#
Vue 3 -事件总线
从我所看到的,你正在使用最新版本的
Vue.js
(3.x
)。如这里所述https://v3-migration.vuejs.org/breaking-changes/events-api.html#migration-strategy,全局事件总线在Vue 3中被移除(this.$emit
仍然可用于child -〉parent通信。为了在app中为不同的组件实现一个全局事件总线来与事件进行通信,你需要一个外部包,比如mitt。如果您按照这些示例进行操作,那么实现就很容易了。希望这能帮上忙。