学习vue3第十一节(依赖注入:provide/inject)

news2024/12/28 4:24:26

本机介绍:provide/inject
注意:大家在看此小节时候,默认大家已经了解一些组件的使用方法

1、依赖注入的用途:

当嵌套层级多的时候,某个子组件需要较远层级的父组件数据时候,如果我们依然使用props 传递数据,那么父组件的层级会越来越深,代码也会越来越复杂,这个传输的链路太长,如果中间出现差错,不容易排查。这时候就可以使用provide 和 inject 来解决这个问题。
如图:
请添加图片描述

而当我们使用provide 和 inject 的时候,就可以像下面这样使用:
一个父组件可以为所有的后代组件提供数据依赖,任何后代无论层级多么深,都可以注入由父组件提供给链路的依赖。
请添加图片描述

2、依赖注入固定值及响应数据

如下代码实现:vue2中

固定值的时候是非响应式的
如图:
在这里插入图片描述

注意:vue2中provide和inject 注入依赖孙子组件中的数据是非响应式的;
如果响应实现响应式,需要使用

<template>
<div class="par">
  <h3>provide--inject</h3>
  父组件--pName:{{ msg }}
  <h3>provide--inject</h3>
 
  <Provide></Provide>
  <button @click="handleChangeName">change name</button>
  </div>
</template>
<script>
import Provide from './components/provide1.vue'
import { computed } from 'vue'
export default {
  name: 'App',
  components: {
    Provide
  },
  provide(){
    return {
      // pName: 'Andy' // 固定值;此时的pName是非响应式的
      pName: computed(() => this.msg) // 传入计算属性,再次更改msg的值,会发现孙子组件里面的值同步更新了,此时的pName是响应式的
    }
  },
  data() {
    return {
      msg: 'Welcome Andy'
    }
  },
  created() {
    console.log('app created')
  },
  methods: {
    handleChangeName() {
      this.msg = 'Andy1'
      console.log('==handleChangeName==', this.msg)
    }
  }
}

// 子组件:

<template>
  <div class="provide1">
    <div>provide1</div>
    <ProvideS></ProvideS>
  </div>
</template>
<script>
import ProvideS from './provide11.vue'
export default {
  name: 'ProvideM',
  components: {
    ProvideS
  }
}
</script>

// 孙子组件

<template>
<div class="provide11">
  pName:{{pName}}
</div>
</template>
<script>
export default {
  name: 'ProvideMy',
  components: {},
  props: {},
  inject: ['pName'],
}
</script>

如图:
请添加图片描述
3、注入别名以及默认值
当后代组件中有注入时候,父级组件中需要有同名的属性名依赖,否则运行会报错;如果父级组件中不想依赖该属性名,那么后代组件中就需要有默认值,否则运行会报错

为什么要使用依赖别名呢?
因为当我们需要依赖多个属性,或者页面结构复杂时候,我们要避免依赖的属性名与data的属性名冲突,或者是(vue3 setup 中声明的变量重名)此时就可以使用依赖别名。

<template>
<div class="provide11">
  pName:{{pName}}<br>
  name: {{ name }}
</div>
</template>
<script>
export default {
  name: 'ProvideMy',
  components: {},
  props: {},
  // inject: ['pName'],
  inject: {
    name: { // name 代表的是 pName 的别名
      from: 'pName', // from代表父组件依赖的属性名称
      default: 'pName 的默认值'
    }
  },
  computed: {},
  data() {
    return {
    }
  }
}
</script>

如图:
在这里插入图片描述

4、孙子组件响应式更改依赖属性值

当我们想在孙子组件中更改父组件的属性是,可以在注入属性的值的同时,注入一个回调函数如下:

vue3中

父组件

<template>
<div class="par">
  <h3>provide--inject</h3>
  父组件--pName:{{ msg }}
  <h3>provide--inject</h3>
 
  <Provide></Provide>
  <button @click="handleChangeName">父组件change name</button>
  </div>
</template>
<script setup>
import Provide from './components/provide1.vue'
import { ref, provide, inject } from 'vue'
let msg = ref('Andy start')

const handleChangeName = () => {
  msg.value = 'Andy change'
}
const sChangeName = () => {
  msg.value = 'Andy sChangeName'
}
provide('pName', {msg, sChangeName})
</script>

子组件

<template>
  <div class="provide1">
    <div>provide1</div>
    <ProvideS></ProvideS>
  </div>
</template>
<script setup>
import ProvideS from './provide11.vue'

</script>

孙子组件

<template>
<div class="provide11">
  msg---:{{msg}}<br>
  <br>
  <button @click="sChangeName">孙子组件事件</button>
</div>
</template>
<script setup>
import { computed, provide, ref, inject } from 'vue'
const { msg, sChangeName } = inject('pName')
</script>

如图:
初始值:
请添加图片描述
父组件点击更新
请添加图片描述
孙子组件点击更新
请添加图片描述

5、使用Symbol做唯一的键名

在大型应用中,为了避免属性名的冲突,我们可以使用Symbol类型来作为注入的的键名

比如 const myProvide = Symbol()

使用如下

<template>
<div class="par">
  <h3>provide--inject</h3>
  父组件--pName:{{ msg }}
  <h3>provide--inject</h3>
 
  <Provide></Provide>
  <button @click="handleChangeName">父组件change name</button>
  </div>
</template>
<script setup>
import Provide from './components/provide1.vue'
import { ref, provide, inject } from 'vue'
const myProvide = Symbol()
let msg = ref('Andy start')
provide(myProvide, {msg}) // 此处依赖的键名更改为myProvide
</script>

6、我们还可以在应用的最外层注入,比如在main.js | main.ts中

这样在应用的任何一个组件中都可以使用myProvide依赖
以vue3为例:

<script setup>
import { createApp, povide } from 'vue'
import App from './App.vue' // 引入App.vue
const app = createApp(App)

app.provide('myProvide', '测试')
app.mount('#app')
</script>

最后:
1、vue2中的注入依赖是默认是非响应式的,若想要实现响应式,需要结合computed回调函数使用;
2、vue3中的注入依赖是默认是响应式的,即使通过解构 const { msg, sChangeName } = inject('pName'),由ref创建的对象,依然是响应式的,相比较而言,大家可以直接使用vue3 setup语法糖的写法,若要使用setup() {} 回调函数的写法,需要同步更新依赖provide的属性值,否则依赖的属性值不会更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1544042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

virtualbox导入vdi

新建虚拟机 点击新建 输入新建属性 配置cpu和内存 虚拟硬盘 这里选择已有的vdi文件 摘要 这里点击完成 虚拟机添加成功 点击启动&#xff0c;启动虚拟机 注意 这个时候的ip&#xff0c;还是以前镜像的ip&#xff0c;如果两个镜像一起启动&#xff0c;则需要修 改ip地…

802.1X网络访问控制协议

802.1X是一种由IEEE&#xff08;电气和电子工程师协会&#xff09;制定的网络访问控制协议&#xff0c;主要用于以太网和无线局域网&#xff08;WLAN&#xff09;中基于端口的网络接入控制。802.1X协议通过认证和授权机制&#xff0c;确保只有合法的用户和设备才能够接入网络&a…

Java中static、final关键字【详解】

文章目录 一、static关键字1.1 成员变量1.1.1 静态变量及其访问1.1.2 实例变量及其访问 1.2 成员方法1.2.1 静态方法及其访问1.2.2 实例方法及其访问 1.3 小结1.4 static应用知识 二、final关键字2.1 修饰类&#xff1a;不能被继承2.2 修饰方法2.3 修饰变量-局部变量2.3.1 局部…

背景减除(1)--bgslibrary Windows编译和使用

入侵监控领域中&#xff0c;在固定场景下&#xff0c;需要检测和监控的入侵物体种类繁多&#xff0c;无法具体穷尽。传统的CV算法提取的特征应用场景有限&#xff0c;无法完成大量物体的监控&#xff1b;深度学习目标检测方法没法收集到无穷无尽的物体种类&#xff0c;因此监督…

水牛社五大赚钱栏目概览:轻松了解项目核心与赚钱原理

很多新用户首次访问水牛社官网时&#xff0c;可能会感到有些迷茫。由于软件介绍相对较长&#xff0c;部分朋友可能缺乏耐心细读。然而&#xff0c;若您真心希望在网络上找到赚钱的机会&#xff0c;深入了解我们的发展历程将大有裨益。简而言之&#xff0c;本文旨在快速带您领略…

大数据基础:Linux基础详解

课程介绍 本课程主要通过对linux基础课程的详细讲解&#xff0c;让大家熟练虚拟机的安装使用&#xff0c;Linux系统的安装配置&#xff0c;学习掌握linux系统常用命令的使用&#xff0c;常用的软件安装方法&#xff0c;制作快照&#xff0c;克隆&#xff0c;完成免密登录&…

深度学习图像处理02:Tensor数据类型

上一讲深度学习图像处理01&#xff1a;图像的本质&#xff0c;我们了解到图像处理的本质是对矩阵的操作。这一讲&#xff0c;我们讲介绍深度学习图像处理的基本数据类型&#xff1a;Tensor类型。 在深度学习领域&#xff0c;Tensor是一种核心的数据结构&#xff0c;用于表示和…

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上&#xff0c;通过I/O模式编写代码&#xff0c;实现以下功能&#xff1a; 系统上电后&#xff0c;关闭蜂鸣器、继电器和全部指示灯&#xff0c;数码管显示初始值为28&#xff0c;仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

代码随想录第20天| 654.最大二叉树 617.合并二叉树

654.最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 又是构造二叉树&#xff0c;又有很多坑&#xff01;| LeetCode&#xff1a;654.最大二叉树_哔哩哔哩_bilibili 给定一个不重复的整数数组 nums 。 最大二叉树 可以…

基于java+springboot+vue实现的医院门诊信息管理系统(文末源码+Lw+ppt)23-325

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对医院门诊信息的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而…

不敢想象吧!Anzo Capital发现不仅经济事件影响汇率天气也是

在投资交易中弄懂汇率的走势方向&#xff0c;对各位投资者的交易盈利那还不是小菜一碟&#xff0c;但各位投资者你们想象不到吧&#xff01;Anzo Capital发现不仅经济事件能影响汇率&#xff0c;就连天气也能轻易影响汇率。 就用2015年1月15日的经济事件来说&#xff0c;当瑞…

pandas读写excel,csv

1.读excel 1.to_dict() 函数基本语法 DataFrame.to_dict (self, orientdict , into ) --- 官方文档 函数种只需要填写一个参数&#xff1a;orient 即可 &#xff0c;但对于写入orient的不同&#xff0c;字典的构造方式也不同&#xff0c;官网一共给出了6种&#xff0c…

基于springboot+vue的流浪动物管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据&#xff08;环保词频统计&#xff09; 1、时间&#xff1a;2002-2023年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a; 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

快速熟悉ElasticSearch的基本概念

1.全文检索 全文检索是通过文本内容进行全面搜索的技术。通过全文检索可以快速地在大量文本数据中查找包含特定关键词或者短语的文档&#xff0c;并且返回相关的搜索结果。 检索和查询的区别 检索没有搜索条件边界&#xff0c;检索的结果取决于相关性&#xff0c;相关性计算…

ssm004新生报到系统+jsp

新生报到系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率…

JS运行时大盘点,出新JS运行时了!

大家好&#xff0c;我是奇兵&#xff0c; 在前端技术日新月异的今天&#xff0c;新的 JavaScript 运行时环境不断涌现&#xff0c;它们为开发者提供了更多的选择和可能性。近期&#xff0c;诸如 LLRT 和 WinterJS 等新运行时环境的发布&#xff0c;进一步丰富了 JavaScript 运…

实战 | 任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处&#xff0c;输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面&#xff0c;点击发送验证码&#xff0c;然后用BURP发包 更改手机号传参&#xff0c;这里手机号传参没有进行加密&#xff0c;直接用手机号的位置进行爆破 正确的…

cad怎么画洗菜盆平面图?

CAD绘制住宅平面布置图的时候&#xff0c;特别是对厨房区域的绘制时&#xff0c;需要使用到洗菜盆图块该怎么绘制洗菜盆平面图呢&#xff1f;下面我们就来看看详细的教程。 1、打开AutoCAD 2013软件&#xff0c;点击【图层特性管理器】&#xff0c;点击【新建图层】&#xff0…

maya打开bvh脚本

目录 maya打开脚本编辑器 运行打开bvh脚本 maya导出bvh脚本 maya打开脚本编辑器 打开Maya软件&#xff0c;点击右下角 “脚本编辑器” 运行打开bvh脚本 https://github.com/jhoolmans/mayaImporterBVH/blob/master/bvh_importer.py import os import re from typing impo…