vue2升级vue3:provide与inject 使用注意事项
provide / inject 类似于消息的订阅和发布。provide 提供或发送数据, inject 接收数据。
VUE provide 和 inject 使用场景
当我们需要从父组件向子组件传递数据时,我们使用 props。
而一些深度嵌套的组件,深层的子组件只需要父组件的部分内容。
若仍然将 prop 沿着组件链逐级传递下去的话,可能会很麻烦。
VUE提供了provide 和 inject来解决了这个问题。
无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者。
父组件有一个 provide 选项来提供数据,子组件有一个 inject 选项来开始使用这些数据。


这个比 react 的 createContext 和 useContext 使用简单!也好理解些!当然熟悉react的,还可以参考:https://github.com/zephraph/vue-context-api
在vue2.x中使用provide 和 inject
父组件
export default {
name: "provide",
data() {return {host:'zhoulujun.cn'}},
components: {
inject,
},
provide: {
site: "zhoulujun.cn",
},
};
子组件使用
export default {
name: "inject",
inject: ["showName"],
};
如果 provide 需要使用 data 内的数据时,需要将 provide 转换为返回对象的函数。
export default {
name: "provide",
data() {return {host:'zhoulujun.cn'}},
components: {
inject,
},
provide(){return{site:this.host}},
};
具体参看:https://v2.vuejs.org/v2/api/#provide-inject
在vue3.x中使用provide 和 inject
vue3用方法太多,这里具体看官方案例
具体参看:https://vuejs.org/guide/components/provide-inject.html
需要注意的事项:
在组合式 API 中使用 provide/inject,两个只能在 setup 期间调用,使用之前,必须从 vue 显示导入 provide/inject 方法。
为了给 provide/inject 添加响应性,使用 ref 或 reactive 。
父组件
import { provide } from 'vue'
export default {
setup(){
let site = ref("zhoulujun.cn")
provide('site',site)
}
}
子组件
import { inject } from 'vue'
export default {
setup(){
const site = inject('site')
return{
site
}
}
}
上述示例,在父组件或子组件都会修改 info 的值。
provide / inject 类似于消息的订阅和发布,遵循 vue 当中的单项数据流,什么意思呢?就是数据在哪,修改只能在哪,不能在数据传递处修改数据,容易造成状态不可预测。
在订阅组件内修改值的时候,可以被正常修改,如果其他组件也使用该值的时候,状态容易造成混乱,所以需要在源头上规避问题。
readonly 只读函数,使用之前需要引入,如果给变量加上 readonly 属性,则该数据只能读取,无法改变,被修改时会发出警告,但不会改变值。
//发布
let info = ref("今天你学习了吗?")
const changeInfo = (val)=>{
info.value = val
}
provide('info',readonly(info))
provide('changeInfo',changeInfo) //订阅
const info = inject('info')
const chang = inject('changeInfo')
chang('冲向前端工程师')
所以我们就给provide发射出去的数据,添加一个只读属性,避免发射出去的数据被修改。
参考链接:
react的createContext及useContext 和 vue3的 provide 及 inject https://blog.csdn.net/skyblacktoday/article/details/124044886
vue 3 学习笔记 (八)——provide 和 inject 用法及原理 https://juejin.cn/post/7034679042540306440
转载本站文章《vue2升级vue3:provide与inject 使用注意事项》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/vue3/8871.html
vue2升级vue3:provide与inject 使用注意事项的更多相关文章
- vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9
项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...
- vue2升级vue3指南(二)—— 语法warning&error篇
本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...
- vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件
如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...
- vue2升级vue3:vue-i18n国际化异步按需加载
vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...
- uniapp项目vue2升级vue3简单记录
看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题. uniapp升级vue3官方指南 我是先去vue官网看 ...
- vue2升级vue3指南(一)—— 环境准备和构建篇
1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...
- Vue3 中的组件 provide和inject 传值、获取组件实例的方法getCurrentInstance()
一. provide和inject(依赖注入) 1:在父级组件中提供数据 语法:provide('提供给子组件的变量名',提供给子组件的数据) 2: 在子级组件中获取收据 ...
- vue2.0与3.0中的provide和inject 用法
1.provide/inject有什么用? 常用的父子组件通信方式都是父组件绑定要传递给子组件的数据,子组件通过props属性接收,一旦组件层级变多时,采用这种方式一级一级传递值非常麻烦,而且代码可读 ...
- VUE3 之 ref、provide、inject 的使用 - 这个系列的教程通俗易懂,适合新手
1. 概述 首因效应告诉我们: 在日常交往中,第一印象是非常重要的,好的第一印象能让我们在与人相处时事半功倍. 但也从另一面告诉我们,不能仅凭第一印象去判断一个人,有时虚假的第一印象,也有可能蒙蔽我们 ...
- vue 3 学习笔记 (八)——provide 和 inject 用法及原理
在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传 ...
随机推荐
- keycloak~为keycloak-services项目添加第三方模块(首创)
我们在对keycloak框架中的核心项目keycloak-services进行二次开发过程中,发现了一个问题,当时有这种需求,在keycloak-services中需要使用infinispan缓存,我 ...
- HarmonyOS 高级特性
引言 本章将探讨 HarmonyOS 的高级特性,包括分布式能力.安全机制和性能优化.这些特性可以帮助你构建更强大.更安全.更高效的应用. 目录 HarmonyOS 的分布式能力 HarmonyOS ...
- Kubernetes:kube-apiserver 之准入
kubernetes:kube-apiserver 系列文章: Kubernetes:kube-apiserver 之 scheme(一) Kubernetes:kube-apiserver 之 sc ...
- go基础-函数
概述 在任何语言中函数都是极其重要的内容,业务功能都是由一个或多个函数组合完成.go语言是函数式编程语言,函数是一等公民,可以被传递.有函数类型,go语言有三种类型的函数,普通函数.匿名函数(Lamb ...
- 【GIT】学习day01 | 内嵌git安装教程【外包杯】
Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理 第一步:下载Git 下载地址https://git-scm.com/downloads 如果出现下面这种情况无法 ...
- 一步解决Cannot resolve symbol 'WebServlet'(@WebServlet注解标红)
右键项目名(javaweb01)->Open Module Settings Modules->Dependencies->点击Export上面的,添加Tomcat即可
- word的实用操作技巧
1.基本使用操作 (1)文本删除: 退格键backspace:删除光标以左的内容 删除键delete:删除光标以右的内容 直接输入会增加字符,按insert键,会切换成改写模式,新字符代替旧字符,总字 ...
- jmeter编写java脚本
jmeter开发java脚本主要的依赖包有三个如下图 步骤1 :打开idea,创建一个project,导入上图依赖包 步骤2:创建一个类,继承AbstractJavaSamplerClient类,并实 ...
- EF Core助力信创国产数据库
前言 国产数据库作为国产化替代的重要环节,在我国信创产业政策的指引下实现加速发展,我们国产数据库已进入百花齐放的快速发展期,相信接触到涉及到政府类等项目的童鞋尤为了解,与此同时我们有一部分也在使用各种 ...
- C++ Qt开发:TabWidget实现多窗体功能
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TabWidg ...