【Vue】Scoped、组件间通信、Props检验
目录
Scoped
作用
*原理
组件通信
前置知识
什么是组件通信
为什么需要组件通信
如何进行组件通信
如何辨别两个组件的关系
父子组件通信
父传子
子传父
非父子组件通信
祖先传后代
语法
任意两个组件通信
步骤
Props校验
props是什么
作用
语法
组件的ref/reactive数据与props的区别
Scoped
作用
- 默认情况下,写在任何一个.vue文件中style的样式是全局样式,这样的话,不仅会影响当前组件,也会影响其他组件。
- 全局样式:会影响每个vue文件,存在样式污染/冲突的问题,style不添加scoped,默认都是全局样式。
- 局部样式:只针对当前组件中的标签生效,不会影响其他组件的标签,如果想让样式变为局部样式,那么需要给style添加scoped属性。
综上,scoped的作用就是防止不同组件(vue文件)样式污染//冲突。
*原理
当给组件的style添加了scoped属性之后,组件会发生如下变化:
- scoped会给当前组件内的所有标签添加一个自定义属性,名为data-v-xxxxxxxx。
- scoped会用这个属性选择器[data-v-xxxxxxxx],配合我们编写的选择器形成一个交集选择器。
- 每个组件只要添加scoped属性,都会生成唯一的data-v-xxxxxxxx自定义属性。换句话说,每个组件生成的这个属性名都不同,因此形成的交集选择器只能选中当前组内的标签,保证了不会发生样式污染。
如下:表示既是h3又具备data-v-7b1a1c5e属性的
h3[data-v-7b1a1c5e]{
color:blue;
}
组件通信
前置知识
什么是组件通信
一个组件把数据传递给另一个组件。
为什么需要组件通信
开发Vue3的项目是借助了组件化的开发思想,不会把代码写在同一个文件中,而是会拆分一系列组件,进而通过组件的组装,拼装成完整的页面,这里难免需要进行组件间的数据传递,那么就需要组件通信了。
总的来说,可以归结于两点:
- 每个组件是一个独立的模块,组件的数据别的模块无法使用。
- 别的组件需要用到当前组件的数据,那么就需要组件通信了。
如何进行组件通信
需要辨别两个组件的关系,进而选择不同的通信方案
1、父子组件(掌握):
- 父传子:props自定义属性
- 子传父:emit自定义事件
2、非父子组件(了解):
- 祖先与后代:provide() + inject()
- 兄弟组件:eventBus(事件总线)
- 跨组件通信方案:Pinia(状态管理)
如何辨别两个组件的关系
- 父子关系:谁被使用,谁就是子组件,当前组件就是父组件
父子组件通信
父组件通过props将数据传递给子组件,子组件通过emit将数据传递给父组件。
父传子
当子组件的数据不固定的时候,也就是子组件的数据不能写死,就需要父传子。
父传子的语法:
- 子组件通过defineProps( )接收自己需要的数据,进而使用数据。(子接)
- 父组件内,子组件的自定义标签上,通过自定义属性传递数据。(父传)
子组件
这里数组的名字自定义,不是固定的。
<script setup>defineProps(['imgUrl','title','price'])
</script>
父组件
<script setup>import MyGoods from './components/MyGoods.vue'//父组件提供的数据const goodsObj={id:'123456',name:'kkk',price:150,picture:'https://test.com'}
</script>
<template><MyGoods :imgUrl="goodsObj.picture"/>
</template>
总结
- 子接:defineProps(['数据名称1','数据名称2'])
- 父传:自定义属性名="值"
子传父
当子组件需要修改父组件的数据(props接收的数据是只读的,不能修改),就需要使用子传父。
而子传父的的语法是:
- 父组件提供修改数据的方法/函数,并在子组件的自定义标签上,绑定自定义事件。
- 子组件在恰当的时机,触发/调用父组件修改数据的方法/函数。
子组件
<template><button @click="onCut">砍价</button>
</template><script setup>import { ref } from 'vue'const props=defineProps(['imgUrl','title','price','idx'])//拿到触发自定义事件的函数 emitconst emit=defineEmits()//定义子组件砍价按钮,emit传入父组件给出的修改函数,和需要的参数const onCut=()=>{emit('ccc',props.idx,1)}
</script>
父组件
<template><MyGoods @ccc="subPrice"/>
</template><script setup>import MyGoods from './components/MyGoods.vue'const subPrice = (i,price) => {goodsList.value[i].price -= price}
</script>
总结
- 父监听/绑定:@自定义事件="父修改数据的函数"
- 子触发/通知:emit('自定义事件',传递的参数.....)
非父子组件通信
祖先传后代
作用:实现跨层级数据传递
语法
祖先组件提供数据
provide('数据名称',数据)
示例:
<script setup>import {ref,provide} from 'vue'const money=ref(1000)provide('money',money)
</script>
后代组件获取数据
const 数据=inject('数据名称')
示例:
<script setup>import {ref,inject} from 'vue'const money=inject('money')
</script>
任意两个组件通信
EventBus可以实现任意两个组件通信,但是使用较为麻烦,能不使用,便不使用。
步骤
前提:需要一个中间者(媒婆)
- 创建一个中间者模块
- 确定消息的发送方,中间者.emit('事件名称',数据)
- 确定消息的接收方:中间者.on('事件名称',(数据)=>{ })
中间者采用第三方模块mitt,步骤如下:
1、安装mitt
npm install --save mitt
2、与App.vue同级,创建一个eventBus.js文件,在这创建一个中间人并导出

import mitt from'mitt'//创建中间人
const meipo=mitt()//默认导出:目的是给其他组件可以拿到meipo这个中间人
export default meipo
3、发送方
<template>
<div><button @click="onSend">Send</button>
</div>
</template><script setup>import {ref} from 'vue'import meipo from "../eventBus.js"const msg=ref('12345678')const onSend=()=>{meipo.emit("sendMsg",msg.value)}
</script>
4、接收方
<script setup>import {ref} from 'vue'import meipo from "../eventBus.js"meipo.on('sendMsg',(msg)=>{console.log(msg.value)})
</script>
Props校验
props是什么
如上面父子组件通信时使用到的,绑定在组件标签上的自定义属性,就是props
<MyGoods :imgUrl="goodsObj.picture"/>
作用
当我们在进行props传属性值时,可能会出现类型不匹配之类的情况,因此我们需要为prop指定验证要求,不符合要求,控制台就会有错误提示,以此来提高代码的健壮性。
换句话说,子组件接收的是什么样的props,那么父组件在传递的时候也必须按照这个规则来传递,双方都得遵守的一种协议。
语法
1、数组接收法:
defineProps(['imgUrl','title'])
- 优点:简单、上手快。
- 缺点:无法对接收的props进行校验,健壮性差。
2、对象接收法(简易写法校验,只校验类型):
defineProps({
title:String
imgUrl:String
})
- 优点:可以对props做校验,健壮性相对好点。
- 缺点:写法相对复杂些。
3、完整写法校验
简易写法的校验只能验证数据类型,在某些情况下可能需要要求数据必须传等条件,此时简易写法便不能满足要求。
语法
defineProps({
属性名:{
type:Number, //数据类型约束
default:50, //默认值,与required:true冲突,如果同时出现,required优先级更高
required:true/false //是否必须传值,默认不是必须传值
}
})
但是如果需要校验数据的范围,此时上述的方法便无法满足要求,就需要使用自定义校验函数
defineProps({
属性名:{
type:Number, //数据类型约束
default:50, //默认值,与required:true冲突,如果同时出现,required优先级更高
required:true/false //是否必须传值,默认不是必须传值
validator(value){
//value是实际props传递的值
if(value<0)
{
console.error("!")
return fasle
}
return true
}
}
})
组件的ref/reactive数据与props的区别
相同点
都可以为组件提供数据,进而使用
不同点
- ref/reative数据:是组件自己的数据,组件既可以获取,也可以修改
- props数据: 本质是由父组件提供的数据,子组件拿到这个数据之后,只能获取,不能直接修改,遵循单向数据流原则,想要修改,需要用到子传父的方法。
相关文章:
【Vue】Scoped、组件间通信、Props检验
目录 Scoped 作用 *原理 组件通信 前置知识 什么是组件通信 为什么需要组件通信 如何进行组件通信 如何辨别两个组件的关系 父子组件通信 父传子 子传父 非父子组件通信 祖先传后代 语法 任意两个组件通信 步骤 Props校验 props是什么 作用 语法 组件的…...
openbmc dbus架构简析(二)
1.说明 以前看内核代码觉得难,是因为内核代码涉及到硬件原理与算法结构和层次递进的代码逻辑,现在的应用层因为业务的复杂与代码和内核的交互接口复杂,也变得有些难度了。 这篇文章是继:openbmc dbus架构简析的第二篇文章。 首先贴出来前篇…...
【二分查找】Leetcode例题
【1】69. x 的平方根 - 力扣(LeetCode) 🍡解题思路:首先想到的是暴力查找,从1开始依次比较x与num*num的大小,然后找出满足num*num<x且(num1)*(num1)>x的num值;再来看看能不能优化一下&…...
gitlab配置调试minio
官方文档 rails console 调试 查看配置Settings.uploads.object_store加载minio clientrequire fog/awsfog_connection Fog::Storage.new(provider: AWS,aws_access_key_id: 你的MINIO_ACCESS_KEY,aws_secret_access_key: 你的MINIO_SECRET_KEY,region: <S3 region>,e…...
Vue实战技巧:如何展示附件(PDF、MP4、Excel、Zip等)并修改名称下载
大家好,今天给大家分享一篇关于在Vue项目中展示附件(PDF、MP4、Excel、Zip等)并修改名称下载的教程。在实际开发过程中,这个功能非常实用,下面我们就一起来学习一下。 一、准备工作 首先,确保你的项目中已经…...
AI证件照制作 API 对接说明
AI证件照制作 API 对接说明 本文将介绍一种 AI证件照制作 API 对接说明,它是可以通过输入人像照片URL以及自己喜欢的模板来制作各种风格的证件照。 接下来介绍下 AI证件照制作 API 的对接说明。 申请流程 要使用 API,需要先到 AI证件照制作 API?inv…...
Macos用brew安装Nodejs亲手教程
首先确保brew已安装,搜索node资源,命令如下: brew search nodejs 演示结果如下: 安装nodejs brew install node22 或 brew install node 出现如下界面 表示正在安装,安装成功后,提示如下信息࿱…...
Node.js 新手教程
1、nodejs简介 Node.js 是一个开源和跨平台的 JavaScript 运行时环境。它是几乎所有类型项目的流行工具! Node.js 在浏览器之外运行 V8 JavaScript 引擎(Google Chrome 的核心)。这使得 Node.js 的性能非常出色。 Node.js 应用程序在单个进…...
Latex转word(docx)或者说PDF转word 一个相对靠谱的方式
0. 前言 投文章过程中总会有各种各样的要求,其中提供word格式的手稿往往是令我头疼的一件事。尤其在多公式的文章中,其中公式转换是一个头疼的地方,还有很多图表,格式等等,想想就让人头疼欲裂。实践中摸索出一条相对靠…...
前端热门面试题目——React、Node
img 标签的 srcset 属性的作用 srcset 属性允许开发者为不同设备或分辨率提供多个图像选项,优化加载的图片以适应设备的屏幕大小和分辨率。这提高了性能和用户体验。 示例: <img src"default.jpg" srcset"small.jpg 480w, medium.j…...
Ansible自动化一键部署单节点集群架构
自动化部署利器:Ansible 一键部署脚本 在现代IT基础设施管理中,Ansible以其简洁、强大的自动化能力脱颖而出。以下是精心打造的Ansible自动化一键部署脚本,旨在简化部署流程,提升效率,确保一致性和可靠性。 通过这个…...
电脑插入耳机和音响,只显示一个播放设备
1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项...
家政小程序开发,打造便捷家政生活小程序
目前,随着社会人就老龄化和生活压力的加重,家政服务市场的需求正在不断上升,家政市场的规模也正在逐渐扩大,发展前景可观。 在市场快速发展的影响下,越来越多的企业开始进入到市场中,同时家政市场布局也发…...
tcpdump抓包wireshark分析
背景 分析特定协议的数据包,如 HTTP、DNS、TCP、UDP 等,诊断网络问题,例如连接故障、延迟和数据包丢失。 大概过程 1.安装tcpdump yum update yum install tcpdump2.抓包,从当前时间起,一小时后停止,…...
文件无法直接拖入zotero
解决方法:取消管理员权限打开zotero。 具体如下:右键zotero应用程序,打开属性,选择“兼容性”,点击底下的“更改所有用户的设置”,在弹出的框中取消“以管理员身份运行此程序”。如下所示:...
使用 useMemo 和 React.memo 优化 React 组件渲染
在 React 中,性能优化是一个重要的主题,特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。 1. 组件结构 创建一个父组件,包含两个子组件: MemoChild:使用 R…...
ISAAC SIM踩坑记录--添加第三方3D场景
ISAAC SIM仿真首先就是要有合适的3D场景,官方提供了一些场景,如果不能满足要求,那就只能自己建。 对于我这种不会3D建模的菜鸟,只能到网上下载了,sketchfab就是一个不错的平台,有不少免费资源可以下载。 …...
Git 详解
Git 详解 Git 是一个分布式版本控制系统,用于高效地管理项目代码的版本历史。它是目前最流行的版本控制工具之一,广泛应用于软件开发领域。Git 的分布式架构允许开发者在本地进行代码的版本管理,并与远程仓库同步,实现团队协作。…...
Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)
上篇文章:Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)_execv系统调用-CSDN博客 本篇代码Gitee仓库:myLerningCode 橘子真甜/linux学习 - 码云 - 开源中国 (gitee.com) 本篇重点:C语言基础IO与系统调用 目录 一.…...
【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接
目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档:它可以将复杂的HTML或XML文本转换为易于操作的树形结构…...
阅读落地灯哪个牌子好?优质款阅读落地灯推荐,买前建议收藏!
想要真正舒服又省心的照明,就别只会盯着参数看。说实话,挑护眼大路灯我就盯两点:光线柔不柔、用久了会不会累眼。像我家书桌前那种容易眩光的,我用一会儿就觉得不对劲;但像下面这些护眼大路灯,调光调色做…...
AI智能体驱动的海上风电制氢模型:技术解析与经济性评估
## 引言:当AI遇上海上风电制氢 在全球碳中和目标的推动下,海上风电制氢技术正从概念走向工程实践。然而,风电的间歇性与电解槽的响应特性之间的矛盾,一直是制约系统效率的瓶颈。近年来,AI智能体的引入为这一难题提供了…...
【ElevenLabs老挝文语音实战指南】:2024年唯一经实测验证的8步本地化语音合成落地方案
更多请点击: https://kaifayun.com 第一章:ElevenLabs老挝文语音合成的技术背景与本地化价值 ElevenLabs 作为全球领先的AI语音生成平台,长期聚焦于高保真、情感化多语言语音合成技术。尽管其支持语言列表持续扩展,老挝文&#x…...
Vue3 入门学习
Vue3 技术文章大纲Vue3 核心特性与优势Composition API 的设计理念与优势Composition API 是 Vue3 的核心特性之一,旨在解决 Options API 在复杂组件中逻辑分散的问题。通过 setup 函数,可以将相关逻辑组织在一起,提高代码的可读性和可维护性…...
西方垃圾思维在中国 AI 大模型中的渗透机制与贾子理论替代范式研究
西方垃圾思维在中国 AI 大模型中的渗透机制与贾子理论替代范式研究摘要: 西方垃圾思维(WCG)正通过“伪自主”模式深度渗透中国主流AI大模型。百度文心、讯飞星火等模型表面宣称“自主研发”“遵循社会主义核心价值观”,实则借助标…...
PPTist完全手册:零成本打造专业演示文稿的终极方案
PPTist完全手册:零成本打造专业演示文稿的终极方案 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for t…...
马来文语音合成效果差?3步诊断法+5个权威音素校准参数,立竿见影提升自然度与语调准确率
更多请点击: https://codechina.net 第一章:马来文语音合成效果差?3步诊断法5个权威音素校准参数,立竿见影提升自然度与语调准确率 马来文(Bahasa Melayu)语音合成常因音素切分模糊、重音规则缺失及语调建…...
10分钟搞定黑苹果:OpCore-Simplify自动化配置工具完全指南
10分钟搞定黑苹果:OpCore-Simplify自动化配置工具完全指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而烦恼吗…...
如何快速自定义游戏光标:提升操作精度的完整指南
如何快速自定义游戏光标:提升操作精度的完整指南 【免费下载链接】YoloMouse Game Cursor Changer 项目地址: https://gitcode.com/gh_mirrors/yo/YoloMouse 在激烈的游戏战斗中,你是否经常因为找不到鼠标光标而错失良机?当屏幕特效绚…...
市面上有哪些是真正高效的降AI率软件(规避AIGC机器检测)
最崩溃的不是查重难题,而是查重达标却AI率超标亮红灯;很多工具只会简单同义词替换、浅层改字,根本洗不掉AI专属句式、行文逻辑和高频模板话术,学校AIGC检测一查一个准,论文直接被标记为AI生成,想答辩都难。…...
