news 2026/7/11 4:53:25

【Vue】scoped作用 父子组件通信 props emit

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Vue】scoped作用 父子组件通信 props emit

文章目录

  • Ⅰ. scoped 作用及原理
    • 一、scoped 的作用
    • 二、scoped的原理
  • Ⅱ. 父子组件通信
    • 一、介绍
    • 二、父传子:`props`
    • 三、子传父:`v-on` && `emit`

Ⅰ. scoped 作用及原理

一、scoped 的作用

默认情况下,写在组件中的style样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。

  1. 全局样式:默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响
  2. 局部样式:可以给组件加上scoped属性,可以让样式只作用于当前组件的标签

MyLeft.vue文件:

<script setup></script><template><divclass="my-left"style="flex:1;align-items:center;height:100px;background:paleturquoise;text-align:center;"><h3>每天起床第一句</h3></div></template><style>h3{color:red;}</style>

MyRight.vue文件:

<script setup></script><template><divclass="my-right"style="flex:1;align-items:center;height:100px;background:plum;text-align:center;"><h3>先给自己打个气</h3></div></template><style></style>

App.vue文件:

<script setup>importMyLeftfrom'./components/MyLeft.vue'importMyRightfrom'./components/MyRight.vue'</script><template><divclass="container"><MyLeft/><MyRight/></div></template><style>.container{display:flex;}</style>

至此,发现MyRight.vueh3的样式受到了的影响。为了解决样式污染/冲突问题,可以给组件的style添加scoped属性,这样就避免了不同组件之前样式污染的问题。

二、scoped的原理

  1. 组件内所有标签都被添加data-v-hash值的自定义属性
  2. css选择器都被添加[data-v-hash值]的属性选择器

最终效果:必须是当前组件的元素,才会有这个自定义属性,从而保证了样式只能作用到当前组件。

Ⅱ. 父子组件通信

一、介绍

组件通信,是指一个把数组传递给另一个组件。

  1. 组件的数据是独立的,无法直接访问其他组件的数据。
  2. 想使用其他组件的数据,就需要组件通信

组件之间的关系:

  1. 父子关系:组件 A 使用了组件 B,则 A 是父,B 是子
  2. 非父子关系:比如祖先和孙子的关系,兄弟关系

二、父传子:props

当子组件的数据需要按需改变的时候,就得让父组件传递数据给子组件,从而提高组件的灵活性和复用性。

父组件通过props(自定义属性)将数据传递给子组件,如下所示:

<MyButton text="提交"color="blue"/>

其中textcolor就是props,然后子组件通过内置方法defineProps()来接收这些自定义属性,如下所示:

<script setup>// 可以只写自定义属性,而不需要和下面一样写完整!// 完整写法如下所示:// type:表示类型// default:表示默认值// required:表示是否必填constprops=defineProps({text:String,color:{type:String,default:'blue',required:false},price:Number})</script><template><button:style="{ backgroundColor: color }">{{text}}</button></template>

<script setup>中需要用到defineProps()中传入的属性时,必须先拿到props对象或者解构出对应的属性,否则是没办法在<script setup>中使用的;

但是在<template>中则不需要,因为有 “语法糖” 的好处,Vue会自动解包props,所以不需要拿到props对象就能直接使用对应的属性!

下面举个例子:

App.vue文件:

<script setup>importMyGoodsfrom'./components1/MyGoods.vue';// 提供数据// 商品列表constgoodsList=[{id:'4001172',name:'称心如意手摇咖啡磨豆机咖啡豆研磨机',price:289,picture:'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg'},{id:'4001594',name:'日式黑陶功夫茶组双侧把茶具礼盒装',price:288,picture:'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg'},{id:'4001009',name:'竹制干泡茶盘正方形沥水茶台品茶盘',price:109,picture:'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png'},{id:'4001874',name:'古法温酒汝瓷酒具套装白酒杯莲花温酒器',price:488,picture:'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png'},{id:'4001649',name:'大师监制龙泉青瓷茶叶罐',price:139,picture:'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png'},{id:'3997185',name:'与众不同的口感汝瓷白酒杯套组1壶4杯',price:108,picture:'https://yanxuan-item.nosdn.127.net/8e21c794dfd3a4e8573273ddae50bce2.jpg'},{id:'3997403',name:'手工吹制更厚实白酒杯壶套装6壶6杯',price:100,picture:'https://yanxuan-item.nosdn.127.net/af2371a65f60bce152a61fc22745ff3f.jpg'},{id:'3998274',name:'德国百年工艺高端水晶玻璃红酒杯2支装',price:139,picture:'https://yanxuan-item.nosdn.127.net/8896b897b3ec6639bbd1134d66b9715c.jpg'}]</script><template><divclass="list"><!--在子组件中,传入自定义属性--><MyGoods v-for="item in goodsList":key="item.id":imgUrl="item.picture":price="item.price":title="item.name"/></div></template><style lang="scss">*{margin:0;padding:0;box-sizing:border-box;}.list{width:1000px;margin:0auto;display:flex;flex-wrap:wrap;}</style>

子组件MyGoods.vue

<script setup>defineProps(['imgUrl','title','price'])// 采用简写的方式,不要求具体的类型等</script><template><divclass="item"><img:src="imgUrl":alt="title"/><pclass="name">{{title}}</p><pclass="price">{{price}}.00</p></div></template><style lang="scss"scoped>.item{width:240px;margin-left:10px;padding:20px 30px;transition:all0.5s;margin-bottom:20px;.item:nth-child(4n){margin-left:0;}&:hover{box-shadow:0px 0px 5pxrgba(0,0,0,0.2);transform:translate3d(0,-4px,0);cursor:pointer;}img{width:100%;}.name{font-size:18px;margin-bottom:10px;color:#666;}.price{display:flex;align-items:center;font-size:22px;color:firebrick;button{margin-left:48px;font-size:14px;outline:none;}}.price::before{content:'¥';font-size:22px;}}</style>

三、子传父:v-on&&emit

在上面父传子的案例中,如果新增一个砍价功能的按钮,会发现子组件不能直接修改父组件传递的数据,因为props是只读的,子组件不能修改。

解决方案:

  1. 在父组件中提供砍价功能对应的方法,然后在使用子组件的时候将该方法绑定起来,和props一起发送给子组件。绑定的语法实际上就是v-on,如下所示:

    @自定义事件="父组件中修改数据的函数"
  2. 在子组件中通过defineEmits()拿到触发自定义事件的函数emit(),然后在砍价按钮中绑定点击事件,在该点击事件中去触发自定义事件,此时该自定义事件就会发送到父组件,父组件就会执行砍价功能对应的方法。emit()方法参数如下所示:

    emit('自定义事件',父组件中对应方法所需的参数...)

defineEmits()本质是一个编译宏,用于生成一个 “事件触发器函数”,通常叫emit,而emit才是真正用来发射事件的函数,所以不要搞错(直接拿defineEmits()去发射事件,那就错了)

App.vue文件:

<script setup>importMyGoodsfrom'./components2/MyGoods.vue';import{ref}from'vue'// 商品列表constgoodsList=ref([{id:'4001172',name:'称心如意手摇咖啡磨豆机咖啡豆研磨机',price:289,picture:'https://yanxuan-item.nosdn.127.net/84a59ff9c58a77032564e61f716846d6.jpg'},{id:'4001594',name:'日式黑陶功夫茶组双侧把茶具礼盒装',price:288,picture:'https://yanxuan-item.nosdn.127.net/3346b7b92f9563c7a7e24c7ead883f18.jpg'},{id:'4001009',name:'竹制干泡茶盘正方形沥水茶台品茶盘',price:109,picture:'https://yanxuan-item.nosdn.127.net/2d942d6bc94f1e230763e1a5a3b379e1.png'},{id:'4001874',name:'古法温酒汝瓷酒具套装白酒杯莲花温酒器',price:488,picture:'https://yanxuan-item.nosdn.127.net/44e51622800e4fceb6bee8e616da85fd.png'},{id:'4001649',name:'大师监制龙泉青瓷茶叶罐',price:139,picture:'https://yanxuan-item.nosdn.127.net/4356c9fc150753775fe56b465314f1eb.png'},{id:'3997185',name:'与众不同的口感汝瓷白酒杯套组1壶4杯',price:108,picture:'https://yanxuan-item.nosdn.127.net/8e21c794dfd3a4e8573273ddae50bce2.jpg'},{id:'3997403',name:'手工吹制更厚实白酒杯壶套装6壶6杯',price:100,picture:'https://yanxuan-item.nosdn.127.net/af2371a65f60bce152a61fc22745ff3f.jpg'},{id:'3998274',name:'德国百年工艺高端水晶玻璃红酒杯2支装',price:139,picture:'https://yanxuan-item.nosdn.127.net/8896b897b3ec6639bbd1134d66b9715c.jpg'}])// 砍价功能对应的方法,由父组件提供constbargain=(index,price)=>{goodsList.value[index].price-=price}</script><template><divclass="list"><!--在子组件中,传入自定义属性--><MyGoods v-for="(item, index) in goodsList":key="item.id":urlImg="item.picture":price="item.price":title="item.name":idx="index"@ccc="bargain"/></div></template><style lang="scss">*{margin:0;padding:0;box-sizing:border-box;}.list{width:1000px;margin:0auto;display:flex;flex-wrap:wrap;}</style>

MyGoods.vue文件:

<template><divclass="item"><img:src="urlImg":alt="title"/><pclass="name">{{title}}</p><pclass="price"><span>{{price}}.00</span><button @click="cutPrice">砍价</button></p></div></template><script setup>constprops=defineProps(['urlImg','title','price','idx'])constemit=defineEmits();constcutPrice=()=>{emit('ccc',props.idx,3);}</script><style scoped>.item{width:240px;margin-left:10px;padding:20px 30px;transition:all0.5s;margin-bottom:20px;.item:nth-child(4n){margin-left:0;}&:hover{box-shadow:0px 0px 5pxrgba(0,0,0,0.2);transform:translate3d(0,-4px,0);cursor:pointer;}img{width:100%;}.name{font-size:18px;margin-bottom:10px;color:#666;}.price{font-size:22px;color:firebrick;display:flex;align-items:center;height:36px;button{font-size:14px;margin-left:50px;}}.price::before{content:'¥';font-size:22px;}}</style>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 8:45:06

2026年最新版恒星播放器下载安装全攻略:多格式支持与性能优化详解

一、前言 在多媒体播放领域&#xff0c;恒星播放器因其兼容性强、播放性能稳定、界面简洁等特点&#xff0c;逐渐成为用户在Windows端的热门选择。许多用户在搜索“恒星播放器下载安装”时&#xff0c;往往只找到零散的教程或过时版本。本文将从下载安装方法、功能讲解到系统优…

作者头像 李华
网站建设 2026/7/10 23:17:52

【Flutter × OpenHarmony】跨端开发实现全局Toast提示卡片

文章目录 【Flutter OpenHarmony】跨端开发实现全局Toast提示卡片前言背景Flutter OpenHarmony 跨端开发介绍开发核心代码&#xff08;详细解析&#xff09;1. Toast示例卡片 Widget代码解析&#xff1a; 2. 全局Toast实现方法核心解析&#xff1a; 心得总结 【Flutter Open…

作者头像 李华
网站建设 2026/7/1 11:54:04

断网、断电,不断数据——LoongCollector 极限边缘场景可靠采集方案

作者&#xff1a;林润骑(太业) 背景 在云计算和物联网快速发展的今天&#xff0c;越来越多的业务场景将计算和数据采集能力推向了边缘侧。从智能制造的产线设备、新能源汽车的车载系统&#xff0c;到遍布各地的零售终端和智能家居设备&#xff0c;这些终端设备产生的可观测数据…

作者头像 李华
网站建设 2026/7/1 14:16:46

CSS 简介

CSS 简介 引言 层叠样式表(Cascading Style Sheets,简称CSS)是用于描述HTML或XML文档样式的样式表语言。它是一种用于网页设计的样式表语言,与HTML语言紧密相关,但独立于HTML。CSS能够将HTML文档的结构与表现分离,使得网页设计更加灵活和高效。 CSS 的起源与发展 CSS…

作者头像 李华
网站建设 2026/6/30 13:19:17

【Java开发】办公通讯软件端到端消息分发与提示技术深度解析

【精选优质专栏推荐】 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解《网安渗透工具使用教程(全)》 —— 一站式工具手册《CTF 新手入门实战教…

作者头像 李华
网站建设 2026/7/2 13:33:42

基于深度学习YOLOv12的红细胞、白细胞和血小板检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 本项目开发了一个基于YOLOv12深度学习算法的智能血细胞检测系统&#xff0c;能够自动识别和分类血液样本中的红细胞(RBC)、白细胞(WBC)和血小板(Platelets)。系统采用包含874张标注图像的专业数据集&#xff08;训练集765张、验证集73张、测试集36张&#xff09;…

作者头像 李华