当前位置: 首页 > news >正文

Vue3.0 provide与inject依赖注入:VCA

简介

provide 与 inject 是一种跨层级组件(祖孙)通信方式。当组件多层嵌套时,不需要将数据一层一层的向下传递,通过它俩可以实现跨层级组件通信。


provide:提供者

注入一个值,可以被后代组件接收。

provide它接受两个参数:

  1. 第一个参数是要注入的 key,可以是一个字符串或者一个 symbol。
  2. 第二个参数是要注入的值。

inject:接收者

接收一个由祖先组件或整个应用 (通过 app.provide()) 注入的值。

inject它接受两个参数:

  1. 第一个参数是注入的 key,找不到对应的 key,则返回 undefined 或默认值。
    1. Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会 "覆盖" 链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject 将返回 undefined,除非提供了一个默认值。
  2. 第二个参数是默认值,非必填,也可以是一个工厂函数。

如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。

const fn = inject('function', () => {}, false)

案列

App.vue组件

<template><div><Child></Child><div v-if="isShow">{{user.name}}--{{user.age}}--{{user.email}}</div><div>{{}}</div></div>
</template>
<script>
import { ref, provide, toRef, reactive } from 'vue';import Child from "./components/Child.vue" //导入Child组件模板
export default {components: {Child: Child //注册Child子组件},setup(props, context) {const isShow = ref(true);const email = ref("123@qq.com");const user = ref({name: "张三",age: 18,email,})const data = reactive({baseUrl: "http://localhost/",port: "8080",action: "login"})const myFun=()=>{email.value="999@qq.com";}provide("user", user);  //向后代组件提供一个user对象provide("email", email) //向后代组件提供一个email对象provide("data", data);provide("myFun",myFun,true); //向后代组件提供一个函数,如果提供的是一个函数,第三个参数必须为true  在注入的时候用法:const myfun=inject("myFun"); 然后可以直接执行函数:myfun()return {isShow,user,}}
}
</script>

Child.vue子组件

<template><div><button>返回</button><button @click="myClick">点我改名</button></div>
</template>
<script>
import {inject, ref } from 'vue';export default {setup() {const user=inject("user");console.log(user.value.email);console.log(user.value.name);console.log(user.value.age);const emial=inject("email");console.log(emial.value);const data=inject("data");console.log(data.baseUrl);console.log(data.port);console.log(data.action);const myfun=inject("myFun"); //注入一个函数const myClick=()=>{//在VOA模式中,我们的案例在provide向后代组件提供了一个this 即:provide(){ return{app:this}}目的是为了再后代组件中可以修改祖组件中的对象值。//在VCA模式中,因为user在app.vue中user是用ref包装的,它是响应式的:所以这里修改后就直接修改了父组件app.vue中的user.value.name值了。不需要依赖this了user.value.name="李四";myfun();}return {myClick,}}
}
</script>

相关文章:

  • 线程同步——互斥量解锁、解锁
  • Python教程---Python交互界面
  • idea 配置checkstyle全过程
  • 在PyCharm中直接启动mitmproxy并自动打开关闭系统代理
  • 采用XML作为GUI描述语言
  • 本地idea远程调试服务器程序
  • 隐私安全|隐私安全已从国家法律法规转向商业企业应用,如何理解以及落地建设,相信大家正在经历隐私安全的困扰
  • 性能优于BERT的FLAIR:一篇文章入门Flair模型
  • MapReduce WordCount程序实践(IDEA版)
  • 使用vscode开发uniapp项目常用的辅助插件,提升开发效率
  • github使用教程
  • 【Redis】Redis实现分布式锁
  • COCOS2DX3.17.2 Android升级targetSDK30问题解决方案
  • 【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用
  • c++类和对象
  • (三)从jvm层面了解线程的启动和停止
  • [译]如何构建服务器端web组件,为何要构建?
  • CentOS 7 防火墙操作
  • JavaScript 基础知识 - 入门篇(一)
  • Netty 4.1 源代码学习:线程模型
  • orm2 中文文档 3.1 模型属性
  • XML已死 ?
  • 关于for循环的简单归纳
  • 解析 Webpack中import、require、按需加载的执行过程
  • 力扣(LeetCode)965
  • 强力优化Rancher k8s中国区的使用体验
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用 @font-face
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生JS动态加载JS、CSS文件及代码脚本
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (1)虚拟机的安装与使用,linux系统安装
  • (备忘)Java Map 遍历
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET企业级应用架构设计系列之技术选型
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RequestBody与@ResponseBody的使用
  • [145] 二叉树的后序遍历 js
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Angularjs]ng-select和ng-options
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [ComfyUI进阶教程] animatediff视频提示词书写要点
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [hihocoder1395] 最大权闭合子图
  • [Linux] day07——查看及过滤文本