Vue3 的 inject 和 provide (附源码)

news2024/12/26 11:00:40

一:前言

        在前端项目中牵扯的最多的莫过于组件之间的传值了,除了最最常用的 props 和 emit,其实在 Vue 中还额外提供了另外几种方法。今天分享一种组件之间通信的方法:provide 和 inject。

二:使用

1、目录结构

        以下是项目的目录结构,其中 index.vue 是进入的首页。在这个页面中引入了 son1.vue 组件,在 son1.vue 中引入了 son2.vue 组件。

2、效果

        右侧是我们项目的页面效果,当我们选中不同的颜色时,下面的三个正方形都会同步进行颜色的更改

3、index.vue

        这里的单选框没有使用 element plus ,是我直接自己写的。在下方 CSS 中使用了 vue3 新支持的 v-bind 方式进行动态绑定背景色。而后使用了 provide 提供了一个 color 属性。

<template>
    <div class="home">
        <div class="box" @click.stop="onCheck(1)">
            <input type="checkbox" v-model="check1" /> 粉色
        </div>
        <div class="box" @click="onCheck(2)">
            <input type="checkbox" v-model="check2" /> 红色
        </div>
        <div class="box" @click="onCheck(3)">
            <input type="checkbox" v-model="check3" /> 黄色
        </div>
    </div>
    <div class="col"></div>
    <hr />
    <son1></son1>
</template>

<script lang="ts" setup>
import son1 from './components/son1.vue'
let color = ref('red')
provide('color', color)

let check1 = ref(false)
let check2 = ref(true)
let check3 = ref(false)

const onCheck = (index: number) => {
    if (index == 1) {
        if (check1.value && !check2.value && !check3.value) {
            return
        }
        check1.value = !check1.value
        check2.value = false
        check3.value = false
        color.value = 'pink'
    } else if (index == 2) {
        if (!check1.value && check2.value && !check3.value) {
            return
        }
        check1.value = false
        check2.value = !check2.value
        check3.value = false
        color.value = 'red'
    } else if (index == 3) {
        if (!check1.value && !check2.value && check3.value) {
            return
        }
        check1.value = false
        check2.value = false
        check3.value = !check3.value
        color.value = 'yellow'
    }
}
</script>

<style lang="scss" scoped>
.home {
    display: flex;
}

.box {
    margin-right: 10px;
    cursor: pointer;
}

.col {
    margin: 10px 0;
    width: 100px;
    height: 100px;
    background: v-bind(color);
}
</style>

4、son1.vue

        在这个页面中,我们引入了 son2.vue 组件,并且创建了一个背景色,动态绑定为注入的 color 属性。

<template>
    <h1>son1 组件</h1>
    <div class="col"></div>
    <hr />
    <son2></son2>
</template>

<script setup>
import son2 from './son2.vue'
let color = inject('color')
</script>

<style lang="scss" scoped>
.col {
    margin: 10px 0;
    width: 100px;
    height: 100px;
    background: v-bind(color);
}
</style>

5、son2.vue

        这个组件和 son1.vue 的逻辑是相同的。不同之处在于我们在这个组件中写了一个小问题。

        在使用 inject 的时候,我们在子组件中修改值,别的组件中会同步修改,在某些情况下这显然是不合理的。因此我们写了一个 button 按钮进行测试,发现确实是有影响。解决办法也很简单,在使用 inject 的时候使用 readonly 标记一下就好了,再次点击 button 按钮是不生效的。

<template>
    <h1>son2 组件</h1>
    <button @click="color='blue'">to blue</button> PS.readonly不允许修改
    <div class="col"></div>
</template>

<script setup>
import { readonly } from 'vue';

let color =readonly(inject('color'))
</script>

<style lang="scss" scoped>
.col {
    margin: 10px 0;
    width: 100px;
    height: 100px;
    background: v-bind(color);
}
</style>

三:总结

        provide 和 inject 是适用于多层传值比较方便的一种方式之一。熟练地使用这个知识,可以让我们在日常开发中提高代码效率和可读性。不过也有很多需要注意的地方,这些各位小伙伴在写的时候会逐步发现。这里我只写了基本使用。

        好啦以上就是本文的全部内容啦,最后附上我学习这些知识点时写的练习项目,里面包含各种知识点,有需要的小伙伴可以自己拉取哦。

乾辰/vue3全家桶练习icon-default.png?t=N7T8https://gitee.com/qianchen12138/vue3-family-bucket-practice

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

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

相关文章

一起学docker系列之十六使用Docker Compose简化容器编排

目录 1 前言2 Docker Compose是什么&#xff1f;3 Docker Compose安装步骤3.1 **下载Compose**3.2 **设置权限**3.3 **创建符号链接&#xff08;可选但建议以便使用&#xff09;** 4 Docker Compose的核心概念4.1 **YAML文件&#xff08;docker-compose.yml&#xff09;**4.2 *…

千梦网创:熟悉抖音内容创作的切入方式

因为身边抖音网红的资源比较近&#xff0c;所以虽然一直没有露脸去做短视频运营&#xff0c;但是最近也是跟随朋友一起开始了短视频的学习之路。 在参观过一些“超级直播间”之后&#xff0c;我们敲定了未来的两个盈利方向&#xff0c;这两个方向可以将我们身边的资源极致利用…

柱状展示当中 ,如何给每个位置加多个项的办法

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>双柱修改</title> <script src"https://cdn.staticfile.org/Chart.js/3.9.1/chart.js"></script> </head> <body><canvas i…

全网关键词采集,免费关键词采集软件使用方法

网站的SEO优化已经成为企业提升在线可见性的不二选择。而关键词的选择和使用则是SEO优化的核心。本文将专心分享关键词采集的正确用法&#xff0c;助您在SEO的道路上掌握正确的方向。 关键词采集&#xff1a;SEO的基础 让我们明确关键词采集的重要性。在搜索引擎的世界里&…

面试 Java 基础八股文十问十答第四期

面试 Java 基础八股文十问十答第四期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 31.HashMap的put 方法执行过程 HashMap 只提供了 put 用于添加元素&#xff…

12月02日每日信息差

_灵感 &#x1f396; 六国入境免签首日2029人次享便利 &#x1f384; 国内首个超大规模“光伏气膜”项目在江苏投运 &#x1f30d; 东京将推出氢气交易市场 &#x1f30b; 中国疾控中心&#xff1a;建议尽早接种流感疫苗&#xff0c;尤其是老年人和儿童 &#x1f381; 偏高1.…

对于Windows就是找不到 环境变量 的解决

我认为将“我的电脑”从桌面上隐藏掉纯粹是傻逼行为 说下解决办法&#xff1a; 1. 找到文件资源管理器&#xff0c; 2. 右键点击“此电脑” -- 选择属性&#xff1a; 3. 进入属性界面&#xff0c;应该进入的是“关于”界面&#xff1a;选择“高级系统设置”&#xff1a; 4. 终…

UVA11729 Commando War

UVA11729 Commando War 题面翻译 突击战 你有n个部下&#xff0c;每个部下需要完成一项任务。第i个部下需要你花Bj分钟交代任务&#xff0c;然后他就会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序&#xff0c;使得所有任务尽早执行完毕&#xff08…

混沌系统在图像加密中的应用(基于哈密顿能量函数的混沌系统构造1.5)

混沌系统在图像加密中的应用&#xff08;基于哈密顿能量函数的混沌系统构造1.5&#xff09; 前言一、自治非哈密顿系统的构造、动态特性分析1.相关理论基础2.两个四维自治非哈密顿系统3.数值分析 python代码 前言 续接混沌系统在图像加密中的应用&#xff08;基于哈密顿能量函…

MySql下载和安装

MySql下载和安装 一、概述 MySQL是一个开放源代码的关系型数据库管理系统 &#xff0c;由瑞典MySQL AB&#xff08;创始人Michael Widenius&#xff09;公 司1995年开发&#xff0c;迅速成为开源数据库的 No.1。 二、下载和安装 下载地址&#xff1a;https://dev.mysql.com…

Zabbix 6.0部署+自定义监控项+自动发现与自动注册+部署zabbix代理服务器

Zabbix 6.0 Zabbix 6.0一、关于zabbix1、什么是zabbix2、zabbix工作原理3、zabbix 6.0 特性4、zabbix 6.0 功能组件 二、Zabbix 6.0 部署1、 部署 zabbix 服务端(1) 部署 Nginx PHP 环境并测试(2) 部署数据库(3) 编译安装 zabbix server 服务端(4) 部署 Web 前端&#xff0c;进…

手写链表反转

LeetCode206 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 1. 建立虚拟头结点辅助反转 在分析链表插入元素的时候&#xff0c;会发现如何处理头…

分享89个节日PPT,总有一款适合您

分享89个节日PPT&#xff0c;总有一款适合您 89个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1j6Yj-7UCcUyV4V_S_eGjpQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

检测判断IP合法性API接口

检测判断IP合法性API接口 一、检测判断IP合法性API接口二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、检测判断IP合法性API接口 一款免费的帮助你检测判断IP合法性API接口 二、…

LeetCode刷题---合并两个有序链表

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

【AIGC】接着昨天的AI“洗图”骚操作,继续调戏国产大模型

目录 一、洗稿&#xff0c;洗图&#xff0c;洗视频 二、如何洗图 2.1 先看看效果 2.2 如何做的 2.3 提示词示例 三、试试星火和通义 2.1 星火和通义的特点 2.2 星火的做图能力理解力强&#xff0c;准确度还有待提高 2.3 通义大模型伺候 2.4 这3个大模型可以配合使用 …

【LeetCode】链式二叉树OJ题---C语言版

链式二叉树OJ题 一、单值二叉树&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 二、二叉树最大深度&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路…

Unity--互动组件(Input Field)||Unity--互动组件(Scroll View)

Unity--互动组件&#xff08;Input Field&#xff09; 一个输入字段是一种方法&#xff0c;使文本控件可编辑&#xff1b; 此组件中的&#xff0c;交互&#xff0c;过渡&#xff0c;导航与文章&#xff08;Unity--互动组件&#xff08;Button&#xff09;&#xff09;中的介绍…

网络基础:网络通信基础

目录 1.网络通信基本单位 2.网络通信基础 3.调制技术 4.解调技术 5.载波调制 6.编码技术 6.1基本编码 6.2应用型编码 1.曼彻斯特编码 2.差分曼彻斯特编码 3.MLT-3编码 4.mB/nB编码 1.网络通信基本单位 Byte&#xff08;字节&#xff09;是用于计量存储容量的一种…

YOLOv8如何输出COCO指标

1、先正常python train 一个模型 yolo taskdetect modetrain model/home//v8/v8-ori-x/yolov8x.pt data/home/v8/v8-ori-x/ultralytics/cfg/datasets/111.yaml epochs300 batch16 device62、再正常python val --各种参数 --save_jsonTrue&#xff0c;这一步的作用是要生成自己…