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 使用注意事项的更多相关文章

  1. vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9

    项目从vue2 升级vue3,VueI18n需要做适当的调整.主要是Vue I18n v8.x 到Vue I18n v9 or later 的变化,其中初始化: 具体可以参看:https://vue- ...

  2. vue2升级vue3指南(二)—— 语法warning&error篇

    本文总结了vue2升级vue3可能会遇到的语法警告和错误,如果想知道怎样升级,可以查看我的上一篇文章:vue2升级vue3指南(一)-- 环境准备和构建篇 Warning 1.deep /deep/和 ...

  3. vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件

    如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...

  4. vue2升级vue3:vue-i18n国际化异步按需加载

    vue2异步加载之前说过,vue3还是之前的方法,只是把 i18n.setLocaleMessage改为i18n.global.setLocaleMessage 但是本文还是详细说一遍: 为什么需要异 ...

  5. uniapp项目vue2升级vue3简单记录

    看到好多开源项目都升级了vue3,看文章说vue3性能升级很多,而且组合式api很香,遂把最近开发的自助洗车app升级下,在此记录下出现的问题. uniapp升级vue3官方指南 我是先去vue官网看 ...

  6. vue2升级vue3指南(一)—— 环境准备和构建篇

    1.nodejs和npm 注意二者的版本,版本过低需要升级,本人升级后的版本如下: $ node -v v16.15.1 $ npm -v 8.11.0 2.package.json 和依赖升级 由于 ...

  7. Vue3 中的组件 provide和inject 传值、获取组件实例的方法getCurrentInstance()

    一. provide和inject(依赖注入) 1:在父级组件中提供数据           语法:provide('提供给子组件的变量名',提供给子组件的数据) 2: 在子级组件中获取收据     ...

  8. vue2.0与3.0中的provide和inject 用法

    1.provide/inject有什么用? 常用的父子组件通信方式都是父组件绑定要传递给子组件的数据,子组件通过props属性接收,一旦组件层级变多时,采用这种方式一级一级传递值非常麻烦,而且代码可读 ...

  9. VUE3 之 ref、provide、inject 的使用 - 这个系列的教程通俗易懂,适合新手

    1. 概述 首因效应告诉我们: 在日常交往中,第一印象是非常重要的,好的第一印象能让我们在与人相处时事半功倍. 但也从另一面告诉我们,不能仅凭第一印象去判断一个人,有时虚假的第一印象,也有可能蒙蔽我们 ...

  10. vue 3 学习笔记 (八)——provide 和 inject 用法及原理

    在父子组件传递数据时,通常使用的是 props 和 emit,父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件再传给孙组件,如果多个子组件或多个孙组件使用时,就需要传 ...

随机推荐

  1. 实战攻防演练-Linux写入ssh密钥,利用密钥登录

    前言 密钥形式登录的原理是利用密钥生成器制作一对密钥,一只公钥和一只私钥.将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录.这样一来,没有私钥,任何人都无法通过 SSH 暴力破解 ...

  2. 数组操作 filter和find

    现在有个需求: 后端给一个list过来,1-4,有就显示,没有前面四个card就空着,从第五个开始,有数据就循环出来,区别他们的kind字段. 这里想了很久怎么写,最后决定,洗数据. 就是从给给的数据 ...

  3. 各种flex布局,拿来即用用过的都说好

    开发过程中,很多布局,用antd的栅格还是不灵活,flex弹性布局会更好用 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 注意 ...

  4. svn 分支的创建及合并

    http://blog.csdn.net/jixiuffff/article/details/5586858 http://zhidao.baidu.com/link?url=uiRk-4ZBkLPx ...

  5. IT运营与DevOps:有何不同?

    IT 运营和 DevOps 满足许多现代企业密切相关的需求.然而,尽管这两种角色之间有许多相似之处,但也有重要的区别,将 IT 运营与 DevOps 混为一谈是错误的. 本文通过解释每种类型的角色是做 ...

  6. 使用rancher rke快速安装k8s集群

    概述 Rancher Kubernetes Engine(RKE)是一个用于部署.管理和运行Kubernetes集群的开源工具.旨在简化Kubernetes集群的部署和操作. RKE具有以下特点和功能 ...

  7. re2-cpp-is-awesome

    没做出来,看题解得 攻防世界逆向高手题之re2-cpp-is-awesome_align 20h-CSDN博客 注意 汇编知识 align 8,align num是让后面的字节都对齐num,也就是这里 ...

  8. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-29-处理日历时间控件-中篇

    1.简介 上一篇的日历时间控件宏哥介绍的比较传统也是很常见的.宏哥不能说它很low,但是相比较一些高端.大气.上档次的日历时间控件,结果就一目了然了:确实很low. 2.被测网站 2.1高大上日历时间 ...

  9. P5318 查阅文献

    题意大概意思就是分别用dfs与bfs遍历一个图,特殊要求是从编号小的点开始遍历. 用邻接表存图,至今我也没想明白怎么才可以从编号小的点开始遍历,明白是排序,但是不知道如何排序,题解中的排序方法是:按照 ...

  10. 深入了解PBKDF2加密技术:原理与实践

    摘要:本文详细介绍了PBKDF2(Password-Based Key Derivation Function 2)加密技术,包括其原理.算法流程和实际应用,旨在帮助读者更好地理解这一重要的加密方法. ...