Vue3 中使用 provide/inject 实现跨层级组件传值失败的原因及解决方案

1、基础用法

父组件:

javascript 复制代码
<script setup>
import { ref, provide } from 'vue';
import ChildComponent from './ChildComponent.vue';
const parentData = ref('初始数据');
// 提供数据
provide('parentData', parentData);
</script>

子组件:

javascript 复制代码
<script setup>
import { inject } from 'vue';
// 注入父组件提供的数据
const parentData = inject('parentData');
</script> 
2、实际应用
基础用法只能满足一般的父子传值,但在实际项目中一般是动态触发事件或通过接口请求到数据后再传递给子级,provide和inject如果直接再调用接口的方法内传值会报警告,而且值也传递不过去。就是说provide()必须在setup根节点处才能使用,直接在方法里面用是不行的
解决方法:

通过将需要传递的值封装在一个方法中,父组件使用 provide() 提供这个方法而非直接传递值本身。子组件或孙组件通过 inject() 获取这个方法后,在需要时调用该方法来获取最新值。

父组件:

javascript 复制代码
const provideData = () => {
  return {
    name: name.value,
    age: age.value,
    total: () => total.value,
    address: () => address.value
  }
}
provide('provideData',provideData);

子组件:

javascript 复制代码
const provideData = inject('provideData');
const name= provideData().name;
const age = provideData().age;
const total = computed(() => provideData().total());
const address = computed(() => provideData().address());
相关推荐
还是大剑师兰特8 分钟前
TypeScript 面试题及详细答案 100题 (91-100)-- 工程实践与框架集成
前端·javascript·typescript·1024程序员节
可触的未来,发芽的智生13 分钟前
触摸未来2025-10-25:蓝图绘制
javascript·python·神经网络·程序人生·自然语言处理
用户479492835691514 分钟前
typeof null === 'object':JavaScript 最古老的 bug 为何 30 年无法修复?
前端·javascript·面试
__WanG34 分钟前
如何编写标准StatefulWidget页面
前端·flutter
非凡ghost1 小时前
By Click Downloader(下载各种在线视频) 多语便携版
前端·javascript·后端
非凡ghost1 小时前
VisualBoyAdvance-M(GBA模拟器) 中文绿色版
前端·javascript·后端
非凡ghost1 小时前
K-Lite Mega/FULL Codec Pack(视频解码器)
前端·javascript·后端
麦麦大数据1 小时前
F034 vue+neo4j 体育知识图谱系统|体育文献知识图谱vue+flask知识图谱管理+d3.js可视化
javascript·vue.js·知识图谱·neo4j·文献·体育·知识图谱管理
LinXunFeng1 小时前
Flutter 多仓库本地 Monorepo 方案与体验优化
前端·flutter·架构
非凡ghost1 小时前
ProcessKO(查杀隐藏危险进程)多语便携版
前端·javascript·后端