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

Vue.js中如何在两个组件间共享ref实现数据同步?

组件共享Ref状态未同步的排查与解决

问题描述

我有Title和Input两个组件,希望它们共享同一个title ref,一方修改时另一方同步变化。尝试用组合式函数实现但未成功,请问问题出在哪?

相关代码

Home.vue

<template>
  <Title></Title>
  <Input></Input>
</template>

<script setup>
import Input from '../Components/Input.vue';
import Title from '../Components/Title.vue';
</script>

Title.vue

<template>
  <h1 class="text-4xl font-bold">{{ title }}</h1>
</template>

<script setup>
import useTitles from '../composables/titles';

const { title } = useTitles();
</script>

Input.vue

<template>
  <input type="text" v-model="title">
  <button @click="change">submit</button>
</template>

<script setup>
import useTitles from '../composables/titles';

const { title } = useTitles();

const change = () => {
  title.value = 'title changed'
}
</script>

titles.js

import { ref } from 'vue'

export default function useTitles() {
  const title = ref('Home')

  return { title }
}

问题根源

当前的组合式函数useTitles每次调用都会创建一个全新的ref实例,Title和Input组件各自调用该函数,拿到的是两个完全独立的ref,自然无法同步状态。

解决方法

要实现状态共享,需要让组合式函数返回同一个ref实例,而非每次调用都新建。只需将ref提升到函数外部,作为单例存在:

修改titles.js:

import { ref } from 'vue'

// 将ref提升到函数外部,确保所有调用共享同一个实例
const title = ref('Home')

export default function useTitles() {
  // 直接返回已创建的ref,不再每次新建
  return { title }
}

这样无论Title还是Input组件调用useTitles,拿到的都是同一个ref对象,修改其中一方的title.value时,另一方的视图会自动同步更新。

补充说明

如果需要更复杂的状态管理(比如多实例隔离、模块化状态),可以使用Vue官方的Pinia状态管理库,它能更优雅地处理组件间的状态共享逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:32:34