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

Nuxt/Vue中@Click事件仅触发一次问题求助

问题解决方案

核心问题是Vue的单向数据流规则:子组件不能直接修改父组件传递的Prop,否则会导致父子组件状态不同步,出现无法重新唤起菜单的情况。以下是具体修复步骤:

1. 重构LoadItem.vue(子组件)

子组件仅负责接收状态、渲染菜单,关闭时通知父组件更新状态,不直接修改Prop:

<template>
  <div v-if="localShow" class="load-item-menu">
    <!-- 菜单内容 -->
    <button @click="handleClose">关闭菜单</button>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue'

// 接收父组件传递的show Prop
const props = defineProps({
  show: {
    type: Boolean,
    default: false
  }
})
// 定义关闭事件,通知父组件
const emit = defineEmits(['close'])

// 定义本地状态,同步父组件的show值
const localShow = ref(props.show)
// 监听父组件Prop变化,实时更新本地状态
watch(() => props.show, (newVal) => {
  localShow.value = newVal
})

// 关闭按钮点击逻辑:触发事件让父组件更新状态
const handleClose = () => {
  emit('close')
}
</script>

2. 调整ProductGrid.vue(父组件)

父组件统一维护菜单的显示状态,负责打开/关闭的状态控制:

<template>
  <div class="product-grid">
    <!-- 商品网格内容 -->
    <button @click="openLoadItem">打开侧边菜单</button>
    <!-- 绑定状态+监听关闭事件 -->
    <LoadItem :show="isLoadItemVisible" @close="isLoadItemVisible = false" />
  </div>
</template>

<script setup>
import { ref } from 'vue'
import LoadItem from './LoadItem.vue'

// 父组件维护菜单显示状态
const isLoadItemVisible = ref(false)

// 打开菜单:直接将状态设为true
const openLoadItem = () => {
  isLoadItemVisible.value = true
}
</script>

修复逻辑说明

  • 父组件完全掌控isLoadItemVisible状态,打开/关闭都由父组件主动更新
  • 子组件仅通过事件通知父组件"需要关闭",不修改任何外部状态
  • 通过watch监听父组件Prop变化,确保子组件本地状态始终和父组件同步,避免状态不同步导致的无法唤起问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:37:35