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

Vue中如何从子组件修改父组件的Boolean变量?

解决子组件修改父组件布尔变量的问题

核心原因

Vue遵循单向数据流规则,props是父组件传递给子组件的只读数据,子组件直接修改props会触发只读错误,同时也不符合Vue的设计规范。

解决方案步骤

1. 父组件修改:将变量改为响应式并监听子组件事件

首先,父组件中的isFinished需要定义为响应式变量(否则变量更新后视图不会自动渲染),同时给子组件绑定自定义事件,用于接收子组件的修改请求:

<script setup>
import { ref } from 'vue';
// 定义响应式变量
const isFinished = ref(false);

// 处理子组件触发的事件,更新变量值
const handleFinish = (newValue) => {
  isFinished.value = newValue;
};
</script>

<template>
  <Child
    v-if="!isFinished"
    :isFinished="isFinished"
    @update-finish="handleFinish"
  />

  <Child2 v-if="isFinished" :isFinished="isFinished" />
</template>

2. 子组件修改:触发自定义事件传递新值

子组件中不再直接修改isFinished prop,而是通过$emit触发父组件绑定的自定义事件,将需要更新的值传递给父组件:

<script>
export default {
  props: {
    isFinished: Boolean
  },
  methods: {
    submit(e) {
      console.log('prop received:', this.isFinished);
      // 触发自定义事件,传递新值true
      this.$emit('update-finish', true);
    }
  }
}
</script>

额外说明

如果使用Vue3的<script setup>语法,子组件中可以用defineEmits来声明事件,写法更规范:

<script setup>
const props = defineProps(['isFinished']);
const emit = defineEmits(['update-finish']);

const submit = (e) => {
  console.log('prop received:', props.isFinished);
  emit('update-finish', true);
};
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:16:12