百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Vue3数据传递provide和inject(三)

ztj100 2024-11-12 14:21 17 浏览 0 评论

简介:

上两篇文章我们记录了部分组件的数据传递的方式,今天我们在记录一下另外的一种数据传递方式,使用provide和inject来传递数据。

使用背景

他的使用背景跟上一篇讲过的$attrs有点类似,是为了跨组件(上下级关系)的数据传递,相比较而言两者在使用中的不同。

  • $attrs在使用中如果是跨组件传递数据中,即使中间组件中不使用这些属性也需要在中间组件中传递中转一下。
  • provide和inject的使用可能更方便一点,他只需要在父组件中提供数据,然后在下面的子组件(不论多少层)中都能够获取到数据,减少了多层组件之间的耦合。

使用规则

  • provide():提供一个数据,可以被后代子组件使用。

provide(key, value) 有两个参数,

其中key:表示的是一个唯一识别的key标识,推荐使用Symbol也可以用一个String字符串;

value:是真实需要共享传递的数据;

注意:provide()必须需要在组件的setup()中使用;

使用实例

Bash
<script setup>
  import { ref, provide  } from "vue"

  provide('nameAge', "100")

  //需注意该Symbol必须是全局变量,提供数据和获取数据都引用相同的Symbol
  const ageSymbol = Symbol('user age symbol');
  provide(ageSymbol, "80")

</script>
  • inject()获取provide()提供的数据

inject(key, defaultValue,treatDefaultAsFactory) 有两个参数,

key:表示的是一个唯一识别的key标识,用来标识获取provide()提供的值,需要跟provide()的相同;

defaultValue:表示如果获取不到值的情况下的默认值,如果不写获取到的将会是是undefinded。

treatDefaultAsFactory:boolean类型,如果第二个参数为一个工厂函数(用来构造一个比较复杂的值)的话,需要设置成true,如果设置成false的话获取到的将是第二个函数本身不是函数构造的值(注意)。

注意:如果第二个是工厂函数的话需要第二个和第三个参数需要搭配使用。

使用实例

Bash
<!-- 父组件 -->
<template>
  <div class="greetings">
    <h1 class="green">我是父组件</h1>
    <!-- <div>父组件姓名:{{ userName }}</div> -->

    <div class="child-view">
      <ChildView5 ref="child" />
    </div>

  </div>
</template>

<script setup>

import ChildView5 from './ChildView5.vue'

import { ageSymbol, sexSymbol  } from "./symbolData"

import { ref, provide  } from "vue"


let provideData = ref("初始化姓名")
provide('name', provideData)

provide(ageSymbol, "80")

provide(sexSymbol, "男")



</script>
<!-- 子组件 -->
<template>
  <div class="container">
    <h1 class="green">我是子组件</h1>
    <div>姓名:{{ name }}</div>
    <div>用户年龄:{{ userAge }}</div>
    <div>用户性别:{{ userSex }}</div>
    <div>自定义数据:{{ userCustom }}</div>
  </div>
</template>

<script setup>
import { reactive, ref, inject  } from "vue"

import { ageSymbol, sexSymbol,customSymbol  } from "./symbolData"

let name = inject('name',"")
let userAge = inject(ageSymbol,"")
let userSex = inject(sexSymbol,"")
let userCustom = inject(customSymbol,()=>{
  return "我是张三"+"今年三岁了"
},true)

</script>
<!-- symbolData.js -->
export const ageSymbol = Symbol('user age symbol');

export const sexSymbol = Symbol('user sex symbol');

export const customSymbol = Symbol('user custom symbol');

执行结果

总结:

从上面的实例中我们可以看到provide和inject是可以实现数据的传递,并且在保证是上下级关系的情况下是可以实现跨多层级数据传递共享。

注意:这种方式优点在于可以更方便的解耦了组件的关联。但是需要我们开发注意的不要泛滥的使用,产生不必要的维护成本,他适合做全局数据的传递。

上面的观点仅限于本人自己的使用学习中遇到的问题,上面的解析也仅限于本人的简单理解,如果有哪里不对的地方欢迎大家提出来。

相关推荐

Sublime Text 4 稳定版 Build 4113 发布

IT之家7月18日消息知名编辑器SublimeText4近日发布了Build4113版本,是SublimeText4的第二个稳定版。IT之家了解到,SublimeTe...

【小白课程】openKylin便签贴的设计与实现

openKylin便签贴作为侧边栏的一个小插件,提供便捷的文本记录和灵活的页面展示。openKylin便签贴分为两个部分:便签列表...

“告别 Neovim!为什么我投奔了刚开源的 Zed 编辑器?”

...

壹啦罐罐 Android 手机里的 Xposed 都装了啥

这是少数派推出的系列专题,叫做「我的手机里都装了啥」。这个系列将邀请到不同的玩家,从他们各自的角度介绍手机中最爱的或是日常使用最频繁的App。文章将以「每周一篇」的频率更新,内容范围会包括iOS、...

电气自动化专业词汇中英文对照表(电气自动化专业英语单词)

专业词汇中英文对照表...

Python界面设计Tkinter模块的核心组件

我们使用一个模块,我们要熟悉这个模块的主要元件。如我们设计一个窗口,我们可以用Tk()来完成创建;一些交互元素,按钮、标签、编辑框用到控件;怎么去布局你的界面,我们可以用到pack()、grid()...

以色列发现“死海古卷”新残片(死海古卷是真的吗)

编译|陈家琦据艺术新闻网(artnews.com)报道,3月16日,以色列考古学家发现了死海古卷(DeadSeaScrolls)新残片。新出土的羊皮纸残片中包括以希腊文书写的《十二先知书》段落,这...

鸿蒙Next仓颉语言开发实战教程:订单列表

大家上午好,最近不断有友友反馈仓颉语言和ArkTs很像,所以要注意不要混淆。今天要分享的是仓颉语言开发商城应用的订单列表页。首先来分析一下这个页面,它分为三大部分,分别是导航栏、订单类型和订单列表部分...

哪些模块可以用在 Xposed for Lollipop 上?Xposed 模块兼容性解答

虽然已经有了XposedforLollipop的安装教程,但由于其还处在alpha阶段,一些Xposed模块能不能依赖其正常工作还未可知。为了解决大家对于模块兼容性的疑惑,笔者尽可能多...

利用 Fluid 自制 Mac 版 Overcast 应用

我喜爱收听播客,健身、上/下班途中,工作中,甚至是忙着做家务时。大多数情况下我会用MarcoArment开发的Overcast(Freemium)在iPhone上收听,这是我目前最喜爱的Po...

Avalonia日志组件实现与优化指南(ar日志表扣)

...

浅色Al云食堂APP代码(三)(手机云食堂)

以下是进一步优化完善后的浅色AI云食堂APP完整代码,新增了数据可视化、用户反馈、智能推荐等功能,并优化了代码结构和性能。项目结构...

实战PyQt5: 121-使用QImage实现一个看图应用

QImage简介QImage类提供了独立于硬件的图像表示形式,该图像表示形式可以直接访问像素数据,并且可以用作绘制设备。QImage是QPaintDevice子类,因此可以使用QPainter直接在图...

滚动条隐藏及美化(滚动条隐藏但是可以滚动)

1、滚动条隐藏背景/场景:在移动端,滑动的时候,会显示默认滚动条,如图1://隐藏代码:/*隐藏滚轮*/.ul-scrool-box::-webkit-scrollbar,.ul-scrool...

浅色AI云食堂APP完整代码(二)(ai 食堂)

以下是整合后的浅色AI云食堂APP完整代码,包含后端核心功能、前端界面以及优化增强功能。项目采用Django框架开发,支持库存管理、订单处理、财务管理等核心功能,并包含库存预警、数据导出、权限管理等增...

取消回复欢迎 发表评论: