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. JUC并发编程学习笔记(十七)彻底玩转单例模式

    彻底玩转单例模式 单例中最重要的思想------->构造器私有! 恶汉式.懒汉式(DCL懒汉式!) 恶汉式 package single; //饿汉式单例(问题:因为一上来就把对象加载了,所以可 ...

  2. Java SPI机制学习之开发实例

    原创/朱季谦 在该文章正式开始前,先对 Java SPI是什么做一个简单的介绍. SPI,是Service Provider Interface的缩写,即服务提供者接口,它允许开发人员定义一组接口,并 ...

  3. inget

    万能密码考点 payload ?id=1' or 1=1--+

  4. C语言假设今天是星期日,编写一个程序,求2019天后是星期几。

    #include<stdio.h> void main() { int n = 2019, d;//定义变量和常量 d = n % 7;//计算余数 switch (d)//选择星期 { ...

  5. 小米二面:Redis 如何保证数据不丢失?

    前段时间表妹收到了小米秋招补录的面试邀请,一面还算顺利,很快就通过了,但在看二面面试录屏的时候,我发现了一个问题,回答的不是很好,也就是我们今天要聊的这个问题:Redis 如何保证数据不丢失? 很多人 ...

  6. 阿里云服务器docker系统 BUG

    阿里云服务器docker系统 BUG购买了阿里云新加坡区的轻量服务器,安装的是docker专用系统,故障现象:docker镜像下载后,docker网络不通,docker端口不通,网络一直不通,通过防火 ...

  7. IDEA的两个实用插件“汉化”和“翻译”

    1.汉化包插件 Chinese (Simplified) Language Pack EAP 2.翻译插件 translation 3.效果图 这两个不局限这一软件,IntelliJ这一公司旗下都可以 ...

  8. 终结篇:==和equals有什么区别?

    == 和 equals 有什么区别?这个问题本身不难,但是被问到的频率很高,且大部分人的回答都不够全面,让人听了有种"恨铁不成钢"的感觉,所以今天咱们就来好好聊聊这个问题. 1.典 ...

  9. Tensorflow2.0实战之GAN

    本文主要带领读者了解生成对抗神经网络(GAN),并使用提供的face数据集训练网络 GAN 入门 自 2014 年 Ian Goodfellow 的<生成对抗网络(Generative Adve ...

  10. oracle12c静默安装

    oracle12c 静默安装 先决条件 ● 至少 1 GB RAM 用于 Oracle 数据库安装.建议使用 2 GB 内存. ● 至少 8 GB RAM 用于 Oracle Grid Infrast ...