当前位置: 首页 > article >正文

vue2组件跨层级数据共享provide 和 inject

在 Vue 2 中,provideinject 的功能也是可以使用的,虽然在 Vue 3 中它们成为了组合式 API 的一部分。在 Vue 2 中,provideinject 主要是用于祖先组件和后代组件之间的数据共享,而不是通过 propsemit 逐层传递。

Vue 2 中的 provideinject

在 Vue 2 中,provideinject 是 Vue 实例的一部分,可以在选项对象中的 datamethodscomputedcreated 等生命周期钩子中使用。

1. 祖先组件(提供数据)

在 Vue 2 中,祖先组件可以使用 provide 来提供数据。

// Parent.vue
export default {
  provide() {
    return {
      sharedData: 'Hello from parent' // 提供数据
    };
  },
  created() {
    console.log('Parent created');
  }
};
  • provide 返回一个对象,其中包含需要共享的数据。
  • 可以通过 provide 共享任意数据,后代组件可以通过 inject 访问。
2. 后代组件(注入数据)

后代组件可以使用 inject 来接收祖先组件提供的数据。

// Child.vue
export default {
  inject: ['sharedData'], // 接收数据
  created() {
    console.log(this.sharedData); // 输出 "Hello from parent"
  }
};
  • inject 是一个数组,列出所有要接收的属性的名称。
  • 通过 this.sharedData 可以访问从父组件提供的数据。

响应式数据

与 Vue 3 中的 provideinject 类似,Vue 2 也支持响应式数据。如果需要响应式的数据共享,可以在祖先组件中使用 datacomputed 来实现。

// Parent.vue
export default {
  provide() {
    return {
      sharedData: this.sharedData // 提供响应式数据
    };
  },
  data() {
    return {
      sharedData: 'Hello from parent'
    };
  }
};

后代组件中直接注入响应式数据:

// Child.vue
export default {
  inject: ['sharedData'],
  created() {
    console.log(this.sharedData); // 输出响应式数据 "Hello from parent"
  }
};
  • 如果你在 data 中使用响应式数据(如 data()),provide 提供的是响应式的引用。
  • 后代组件访问后,数据是响应式的,任何修改都会反映在祖先和后代组件中。

使用默认值

如果在 inject 时,指定的键在祖先组件中没有提供,可以给 inject 设置默认值。默认值可以是一个普通的值或一个函数:

// Parent.vue
export default {
  provide() {
    return {
      sharedData: 'Hello from parent'
    };
  }
};

// Child.vue
export default {
  inject: {
    sharedData: {
      default: 'Default Value' // 默认值
    }
  },
  created() {
    console.log(this.sharedData); // 如果没有找到父组件提供的数据,使用默认值
  }
};
  • 如果父组件没有提供 sharedData,则会使用默认值 'Default Value'

注意事项

  • provideinject 主要用于父子或跨层级组件之间的通信,适合跨多个层级的数据共享,但不适合跨组件间的复杂数据管理。
  • provideinject 不能替代 Vuex(用于跨组件和全局状态管理的方案),它们更适合用于深层组件之间的简单数据共享。
  • inject 会查找最近的祖先组件提供的数据,因此如果在多个组件中使用 provide,后代组件会接收到最近的祖先提供的数据。

总结

  • provide:在父组件中定义共享的数据。
  • inject:在子组件中接收父组件提供的数据。
  • 默认情况下,数据是非响应式的。如果需要响应式,应该在 data() 中定义数据。
  • provideinject 适合处理不需要通过 propsemit 逐层传递的跨层级数据共享。

http://www.kler.cn/a/420462.html

相关文章:

  • #JAVA-常用API-爬虫
  • 新手学习:网页前端、后端、服务器Tomcat和数据库的基本介绍
  • Java八股文(11-29start)
  • Springboot入门教程系列HelloWorld
  • 大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
  • PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换
  • Unity类银河战士恶魔城学习总结(P156 Audio Settings音频设置)
  • 聚观早报 | 戴尔发布第三财季财报;REDMI K80屏幕细节
  • Android 车载虚拟化底层技术-Kernel4.19-Android10(双card)技术实现
  • 瀚高创库建表pgsql
  • linux的挂卸载
  • 【docker】多阶段构建与单阶段构建
  • leetcode每日一题(20241202)
  • BERT的中文问答系统36-2
  • Java GET请求 请求参数在Body中使用Json格式传参
  • 简单介绍下 VitePress 中的 vp-doc 和 vp-raw
  • Git:分支管理
  • 面试小札:JVM虚拟机
  • LeetCode Hot100 21~30
  • 数仓3.0与大模型(如大型语言模型和其他深度学习模型)之间的关系
  • 机器学习(3)朴素贝叶斯算法
  • 数据库日志
  • HTML前端开发-- Flex布局详解及实战
  • 4k4d 学习安装笔记
  • CS144(七)
  • Linux - selinux