Vue依赖注入之Provide/Inject

在这里插入图片描述

1. 使用<script setup>
父组件

<template><div>这里是父组件的message值:{{ message }}</div><br /><div>这里是父组件的count值:{{ count }}</div><br /><classtest />
</template>
<script setup>
import classtest from "./components/classtest.vue";import { ref, provide,readonly } from "vue";let message = ref("我是message的值");let count = ref(1);
function addcount() {count.value++;
}let nocount = ref(1);//这里只提供一个值给与其下所有子组件使用
//provide("注入名", 值);
//如果想让其下子组件修改注入名为message的值,那么值必须为响应式
provide("message", message);//这里只提供一个对象给与其下所有子组件使用
//provide("注入名", {以对象形式输出多个值});
provide("obj", {count,addcount,
});//提供一个值给与其下所有子控件使用,但是这个是只读的
//如果进行修改会提示Set operation on key "value" failed: target is readonly. 
provide('nocount',readonly(nocount))
</script>
<style scoped>
</style>

子组件classtest

<template><classtest2 />
</template><script setup>
import classtest2 from "./classtest2.vue";
</script><style>
</style>

子组件classtest2

<template><div>这里是classtest2接收到父组件的messages值{{ messages }}</div><br><!--这里是接收到的父组件定义的穿透值count--><div>这里是classtest2接收到父组件的count值{{ count }}</div><br><!--此处使用click方法可以直接修改父控件count的值,也可以修改此组件调用的count的值--><button @click="addcount">执行父组件的addcount方法</button><br><!--此处使用click方法可以直接修改父控件count的值,也可以修改此组件调用的count的值--><button @click="addcount1">执行此组件的addcount1方法</button><br><!--这里是接收到的父组件定义的穿透值nocount,但其设置了只读属性--><div>这里是classtest2接收到父组件不允许修改的nocount值{{ nocount }}</div><br><!--此处使用click方法不可以修改nocount的值,因为其设置了只读--><button @click="addnocount">执行父组件的addcount方法</button>
</template><script setup>
import { inject } from "vue";//使用inject接收父组件定义的注入名
//let 变量名 = inject(父组件的provide注入值);
let messages = inject("message");//使用inject接收父组件provide的住入值,其注入值为一个对象
let { count, addcount } = inject("obj");
function addcount1()
{count.value++
}let nocount = inject("nocount");
function addnocount()
{nocount.value++
}
</script><style>
</style>

2. 不使用<script setup>
父组件

<template><div>这里是父组件的message值:{{ message }}</div><br /><div>这里是父组件的count值:{{ count }}</div><br /><classtest />
</template>
<script>
import classtest from "./components/classtest.vue";
import { ref,provide,readonly } from "vue";export default {components:{classtest},setup() {let message = ref("我是message的值");let count = ref(1);function addcount() {count.value++;}let nocount = ref(1);//这里只提供一个值给与其下所有子组件使用//provide("注入名", 值);provide("message", message);//这里只提供一个对象给与其下所有子组件使用//provide("注入名", {以对象形式输出多个值});provide("obj", {count,addcount,});//提供一个值给与其下所有子控件使用,但是这个是只读的//如果进行修改会提示Set operation on key "value" failed: target is readonly.provide("nocount", readonly(nocount));return{message,count,nocount}},
};
</script>
<style scoped>
</style>

子组件classtest

<template><classtest2 />
</template><script setup>
import classtest2 from "./classtest2.vue";
</script><style>
</style>

子组件classtest2

<template><div>这里是classtest2接收到父组件的messages值{{ messages }}</div><br /><!--这里是接收到的父组件定义的穿透值count--><div>这里是classtest2接收到父组件的count值{{ count }}</div><br /><!--此处使用click方法可以直接修改父控件count的值,也可以修改此组件调用的count的值--><button @click="addcount">执行父组件的addcount方法</button><br /><!--此处使用click方法可以直接修改父控件count的值,也可以修改此组件调用的count的值--><button @click="addcount1">执行此组件的addcount1方法</button><br /><!--这里是接收到的父组件定义的穿透值nocount,但其设置了只读属性--><div>这里是classtest2接收到父组件不允许修改的nocount值{{ nocount }}</div><br /><!--此处使用click方法不可以修改nocount的值,因为其设置了只读--><button @click="addnocount">执行父组件的addcount方法</button>
</template><script>
import {inject} from 'vue'export default {setup() {//使用inject接收父组件定义的注入名//let 变量名 = inject(父组件的provide注入值);let messages = inject("message");//使用inject接收父组件provide的住入值,其注入值为一个对象let { count, addcount } = inject("obj");function addcount1() {count.value++;}let nocount = inject("nocount");function addnocount() {nocount.value++;}return {messages,count,addcount,addcount1,nocount,addnocount}},
};
</script><style>
</style>

3. 定义全局

import './assets/main.css'import { createApp} from 'vue'
import App from './App.vue'createApp(App)
//此处注册一个全局的message
//注意如果子组件又使用provide定义了一个message注入
//则此子组件的下属组件将使用此子组件新注入的message的值
.provide('message', 'Hello')
.mount('#app')

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

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

相关文章

SpringBoot项目中如何结合Mybatis进行数据库查询

在Spring Boot项目中使用Mybatis进行数据库操作是一种常见的实现方式。下面我将展示如何在Spring Boot项目中整合Mybatis。这个示例将包括几个主要部分&#xff1a;项目依赖配置、配置文件、实体类、Mapper接口及其XML配置文件、服务类、以及一个简单的控制器。 1. 项目依赖配…

Linux Centos7配置SSH免密登录

Linux Centos7配置SSH免密登录 配置SSH免密登录说明&#xff1a; 分两步 第一步、给Server A生成密钥对 第二步、给Server B授权 生成密钥对之后&#xff0c;我们可以看看它保存的目录下的文件。 接下来我们就要把Server A&#xff08;10.1.1.74&#xff09;的公钥拷贝到Se…

AI新秀Mistral:“Open AI“ 新时代

最近互联网出现不少类似“下一代openai”、“GPT-4最强竞品”、“法国AI独角兽”、“欧洲的OpenAI”、“微软新宠儿”.... 的文章&#xff0c;都会附带一张图片&#xff0c;就是下面这张&#xff1a; 那么到底发生了什么&#xff0c;出来个什么东西呢&#xff1f;就是本文的主…

跟着cherno手搓游戏引擎【28】第一个游戏!源码解读!逐行注释!

源码解读&#xff1a; GameLayer层级&#xff1a;在构造函数中&#xff1a;创建窗口和相机&#xff0c;对随机数种子初始化&#xff1b; 在OnAttach方法中&#xff1a;初始化关卡&#xff1a;加载资源初始化地图信息&#xff1b;设置字体&#xff1b; 在OnUpdate方法中&…

从单体服务到微服务:多模式 Web 应用开发记录<三>预初始化属性

相关文章&#xff1a; 多模式 Web 应用开发记录<一>背景&全局变量优化多模式 Web 应用开发记录<二>自己动手写一个 Struts 开头先看一个简单的例子&#xff0c;这是 ftl 文件的一个表单&#xff1a; <form id"validateForm" action"#&quo…

【第十天】C++函数对象/仿函数、谓词、适配器及常见algorithm算法

一、函数对象 重载了函数调用运算符()的类 实例化的对象叫函数对象&#xff0c;也叫仿函数。 如果函数对象 有一个参数 叫&#xff1a;一元函数对象/仿函数如果函数对象 有二个参数 叫&#xff1a;二元函数对象/仿函数如果函数对象 有三个及以上参数 叫&#xff1a;多元函数对…

K8S存储卷与PV,PVC

一、前言 Kubernetes&#xff08;K8s&#xff09;中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据&#xff0c;并且可以保持数据的持久性&#xff0c;即使Pod被重新调度或者删除&#xff0c;数据也不会丢失。 Kubernetes支持多种类型的存储卷…

Three.js-03Vite打包入门

1.安装 说明&#xff1a;创建文件以后&#xff0c;按照提示进行操作。如cd文件夹&#xff0c;npm i ,npm run dev等操作。 npm create vitelatest 2.安装three npm i three.js 4.打开npm官网 说明:搜索three第三方库。按照案例进行操作。 5.修改App.vue文件 <script set…

手撕LRU缓存——LinkedHashMap简易源码

题目链接&#xff1a;https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 原理非常简单&#xff0c;一个双端链表配上一个hash表。 首先我们要知道什么是LRU就是最小使用淘汰。怎么淘汰&#xff0c;链表尾部就是最不常用的直接…

Google大模型Bard更名Gemini,现在实力如何?(VS gpt系列)

名人说&#xff1a;一花独放不是春&#xff0c;百花齐放花满园。——《增广贤文》 作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、简要介绍1、Gemini是什么&#xff1f;2、主要特点3、Gemini的版本4、应用潜力5、…

zookeeper启动报错

启动zookeeper报错 从报错中可以看到 Invalid config, exiting abnormally 意思是&#xff1a;配置无效&#xff0c;异常退出 在往上看是没有zoo.cof这个配置文件 2024-02-27 14:47:03,285 [myid:] - ERROR [main:o.a.z.s.q.QuorumPeerMain99] - Invalid config, exiting…

基于AMDGPU-ROCm的深度学习环境搭建

在风起云涌的AI江湖&#xff0c;NVIDIA凭借其CUDA生态和优秀的硬件大杀四方&#xff0c;立下赫赫战功&#xff0c;而另一家公司AMD也不甘示弱&#xff0c;带着他的生态解决方案ROCm开始了与不世出的NVIDA的正面硬钢&#xff0c;"ROCm is the answer to CUDA", AMD官网…

Java——数组的定义与使用

目录 一.数组的基本概念 1.什么是数组 2.数组的创建及初始化 3.数组的使用 二.数组是引用类型 1.初始JVM的内存分布 2.基本类型变量与引用类型变量的区别 3.再谈引用变量 4.认识 null 三.数组的应用场景 1.保存数据 2.作为函数的参数 2.1参数传基本数据类型 2.…

学习vue3第二节(使用vite 创建vue3项目)

使用vite 创建vue3项目 node 安装请移步 node官网&#xff1a; https://nodejs.p2hp.com/ node 版本控制 请移步 nvm官网&#xff1a;https://nvm.uihtm.com/ vite 生成vue项目完整版 请移步 vite官网&#xff1a;https://cn.vitejs.dev/ 1、使用 npm 或者 yarn 创建vue3 项目…

NXP实战笔记(十一):32K3xx基于RTD-SDK在S32DS上配置DFLASH、MemAcc、Fee

目录 1、概述 2、RTD-SDK配置之Cache_Ip 3、RTD-SDK配置之Mem_43_InFls 4、RTD-SDK配置之MemAcc 5、RTD-SDK配置之Fee 6、代码示例 1、概述 S32K3目前安装的RTD普遍使用的是R22-11版本的AUTOSAR规范&#xff0c;作为一直使用AUTOSAR4.2.2的程序员来讲&#xff0c;属实迭代…

东方博宜 1511. 数字之和为13的整数

东方博宜 1511. 数字之和为13的整数 #include<iostream> using namespace std; int main() {int n ;cin >> n ;int cnt 0 ;for(int i 1 ; i < n ; i){int sum 0 ;int y ;y i ;while(true){sum y%10;y y / 10 ;if(y0)break; }if(sum 13)cnt 1 ; }cout…

91、在推理流程中加载动态库中的Infer函数

注:建议在 new_version_with_notes 目录下尝试本节内容,有更为丰富的细节输出。 在上一节将生成的代码编译成一个动态链接库之后,接下来需要加载动态链接库中写好的推理入口函数,完成推理。 在生成的代码中,在 codegen 目录下,有一个 codegen.cc 文件,里面是一个 Infe…

二、TensorFlow结构分析(2)

目录 1、会话 1.1 __init__(target,graphNone,configNone) 1.2 会话的run() 1.3 feed操作 TF数据流图图与TensorBoard会话张量变量OP高级API 1、会话 1.1 __init__(target,graphNone,configNone) def session_demo():# 会话的演示# Tensorflow实现加法运算a_t tf.constan…

Appium + mitmProxy 实现APP接口稳定性测试

随着 App 用户量的不断增长&#xff0c;任何小的问题都可能放大成严重的线上事故&#xff0c;为了避免对App造成损害的任何可能性&#xff0c;我们必须从各个方面去思考 App 的稳定性建设&#xff0c;尽可能减少任何潜在的威胁。 1.背景介绍 为了保障 App 的稳定性&#xff0…

算法基础(三)(模拟)

1.模拟算法介绍&#xff1a; 模拟算法通过模拟实际情况来解决问题&#xff0c;一般容易理解但是实现起来比较复杂&#xff0c;有很多需要注意的细节&#xff0c;或者是一些所谓很“麻烦”的东西。模拟题一般不涉及太难的算法&#xff0c;一般就是由较多的简单但是不好处理的部…