You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3子组件通信问题:通过按钮emit实现购物车显示/隐藏

Vue3 + Inertia.js + Laravel 实现购物车显隐控制(子组件通信)

你当前的问题是两个子组件(菜单、购物车)无法直接通信,解决思路是利用父组件作为中间层,统一管理状态并转发事件,具体修改如下:

父组件

需要同时引入菜单组件并监听它的toggleCart事件;同时调整购物车组件的事件监听,让它触发状态切换而非直接隐藏:

<!-- 引入菜单组件并监听toggleCart事件 -->
<Menu @toggleCart="toggleCart" />
<!-- 购物车组件:监听toggleCart事件,传递showCart状态 -->
<Cart :isVisible="showCart" @toggleCart="toggleCart" />

<script>
export default { 
  data() {
    return {
      showCart: false,
    }
  },
  methods: {
    toggleCart() {
      this.showCart = !this.showCart    
    },
  }
}
</script>

菜单组件

当前代码逻辑没问题,保持点击按钮时向父组件emittoggleCart事件即可:

<button @click="$emit('toggleCart')"><Icon name="bag" class="w-4" /></button>

购物车组件

调整关闭按钮的emit事件为toggleCart,和父组件的监听逻辑统一;同时确保props和emits定义正确:

<template>
<div v-if="isVisible">
    <h3 class="flex justify-between">
        <span class="font-bold">My cart</span>
        <!-- 触发toggleCart事件切换状态 -->
        <button @click="$emit('toggleCart')" class="text-xl">&times;</button>
   </h3>
  ...html code for cart
</div>
</template>
<script setup>
import { Link } from "@inertiajs/inertia-vue3";
const props = defineProps(["isVisible", "cart"]);
// 定义toggleCart事件
const emit = defineEmits(["toggleCart"]);
</script>

核心逻辑说明

  • 父组件维护showCart状态,负责接收两个子组件的toggleCart事件并切换状态
  • 菜单组件点击时向父组件发送切换请求
  • 购物车组件根据父组件传递的isVisible控制显示,关闭按钮同样向父组件发送切换请求

内容的提问来源于stack exchange,提问作者Farid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:01:54