Vue | Vue.js 组件化 - 组件间通信

Vue.js组件简介及使用示例 Vue组件是Vue.js应用中独立且可复用的代码块。每个Vue组件都封装了自己的模板、样式和逻辑,而且可以通过组件间的嵌套和通信来构建复杂的用户界面。Vue.js的组件机制使得我们可以轻松构建可复用的用户界面,提高开发效率。通过props和事件等方式进行组件间的通信,进一步增强了组件的灵活性和可扩展性。以上是对Vue.js组件的简单介绍及使用示例。希望能够帮助你更好地理解和应用Vue组件。如果你有任何问题,欢迎留言讨论! 阅读详情

🖥️  Vue.js专栏:Vue.js 初级知识 组件化 - 组件间通信
🧑‍💼 个人简介:一个不甘平庸的平凡人🍬

✨ 个人主页:CoderHing的个人主页

🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️

👉 你的一键三连是我更新的最大动力❤️


目录

一、Vue组件的嵌套关系

认识组件的嵌套

组件的拆分

组件的通信

二、父组件传递子组件

父子组件之间通信的方式

父组件传递给子组件

Props的对象用法(掌握)

细节一: type的类型都可以是哪些?

细节二:对象类型的其他写法

细节三:Prop的大小写命名

三、非props的attribute

非Prop的Attribute

禁用Attribute继承和多根节点

四、子组件传递父组件

子组件传递给父组件

自定义事件的流程

自定义事件的参数和验证

五、组件通信案例练习


一、Vue组件的嵌套关系

认识组件的嵌套

        如果我们一个应用程序将所有的逻辑都放在一个组件中 那么这个组件就会变得非常臃肿难以维护

        所以组件化的核心思想是对组件进行拆分 拆分成 一个个小的组件

        再将这些组件组合嵌套在一起 最终形成 我们的应用程序

组件的拆分

我们可以按照如下的方式进行拆分:

 按照上面的拆分方式后,我们开发对应的逻辑只需要去对应的组件编写即可.

组件的通信

上面的嵌套逻辑如下:存在如下关系:

        App组件是Header  Main  Footer组件的父组件

        Main组件是Banner  ProductList组件的父组件

在开发过程中 经常遇到需要组件之间相互进行通信:

        如 App可能使用了多个 Header 每个地方的Header展示的内容不同 就需要使用者传递给Header一些数据来进行展示

        我们在Main中一次性 请求了Banner数据和ProductList数据,那么就需要传递给它们来进行展示

        也可能是子组件中发生了事件  需要由父组件来完成某些操作 就需要子组件向父组件传递事件

二、父组件传递子组件

父子组件之间通信的方式

父子组件之间如何进行通信呢?

        父组件传递给子组件:通过props属性

        子组件传递给父组件:通过$emit触发事件

父组件传递给子组件

在开发中常见的就是 父子组件之间通信 如 父组件有一些数据 需要子组件展示:

        通过props 来完成组件之间的通信

 什么是Props呢?

        Props是你可以在组件上注册一些自定义的attribute

        父组件给这些attribute赋值,子组件通过attribute的名称获取到对应的值

Props有两种常见的用法:

        方式一:字符串数组,数组中的字符串就是attribute的名称

        方式二:对象类型 对象类型我们可以在指定attribute 名称的同时,指定他需要传递的类型 是否是必须的 默认值等

Props数组写法

Props的对象用法(掌握)

数组用法我们只能说明传入的attribute的名称,并不能对其进行任何形式的限制.

使用对象语法时 可以对传入都额内容限制更多

        如制定传入的attribute的类型 ,  是否必传 , 没有传入时 attribute为默认值

细节一: type的类型都可以是哪些?

        String

        Number

        Boolean

        Array

        Object

        Date

        Function

        Symbol

细节二:对象类型的其他写法

细节三:Prop的大小写命名

Prop的大小写命名

        HTML中的attribute名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符

        使用DOM中的模版时 camelCase(驼峰命名法)的prop名需要使用其等价的kebab-case(短横线分割命名)命名;

三、非props的attribute

非Prop的Attribute

什么是非Prop的attribute?

        当我们传递给一个组件某个属性 但是该属性并没有定义对应的props或emits时 就称为非Prop的Attribute

        常见的包括class  style  id属性等

Attribute继承

        当组件有单个根节点时 非Prop的Attribute将自动添加到根节点的Attribute中

禁用Attribute继承和多根节点

不希望组件的根元素继承attribute,可以在组件中设置inheritAttrs:false:

        禁用attribute继承的常见情况是需要将attribute应用于根元素之外的其他元素

        我们可以通过$attrs来访问所有的 非props

多个根节点的attribute

        多个根节点的attribute如果没有显示的绑定 那么会警告,我们必须手动的指定要绑定到哪一个属性

四、子组件传递父组件

子组件传递给父组件

什么情况下 子组件需要传递内容到父组件呢?

        当 子组件有一些事件发生 的时候 如 在组件中发生了点击,父组件需要切换内容

                子组件 有一些内容想要传递给父组件的时候

如何完成上面的操作?

        1 我们需要在 子组件中定义好在某些情况下触发的事件名称

        2 在 父组件中以v-on的方式传入要监听的事件名称, 并且绑定到对应的方法中

        3 在子组件中发生某个事件的时候,根据事件名称触发对应的事件

自定义事件的流程

封装一个CounterOperation.vue的组件

        内部其实是监听两个按钮的点击,点击之后通过this.$emit的方式发出去事件

JavaScript
export default {
  name: "AddCounter",
  methods:{
    btnAdd(count){
      // console.log(count)
      // 改变App.vue文件中的counter的数值
    //  让子组件 发出一个自定义事件
      // 第一个参数 是自定义的事件名称,第二个参数是传递的参数
      this.$emit("add",count)
    }
  }
}

自定义事件的参数和验证

自定义事件的时候 我们也可以传递一些参数给父组件

JavaScript
btnSub(count){
  // this.$emit(参数名称,传参值)
  this.$emit('sub',count)
}

在Vue3中 我们可以对传递的参数进行验证:

JavaScript
// 2 emits 对象语法  好处:可以给参数进行验证
emits:{
  // null 表示 不做任何验证
  add:function(count){
    if(count <= 10){
      return true
    }
    return false
  }
},

五、组件通信案例练习

实现效果:

App.vue文件代码

JavaScript
<template>
  <div class="app">
<!--    1 tab-control-->
  <tab-control/>

<!--  <tab-control :names="['电脑','手机','平板']" />-->

<!--    2 展示内容-->
    <h1>{{products[currentIndex]}}</h1>
  </div>
</template>

<script>
import tabControl from "@/04_组件通信_案例练习/TabControl";
export default {
  name: "App",
  components: {
    tabControl
  },
  data(){
    return {
      products:["衣服列表","鞋子列表","裤子列表"],
      currentIndex:0
    }
  },
  methods:{
    tabItemClick(index){
      console.log("app",index)
      this.currentIndex = index
    }
  }

}
</script>

<style scoped>

</style>

TabControl.vue文件代码

JavaScript
<template>
  <div class="tab-control">
    <template v-for="(item,index) in names" :key="item">
<!--      :class="{active:index===currentIndex} 如果 索引号全等于 下面的索引号 就为true-->
      <div class="tab-control-item" :class="{active:index===currentIndex}" @click="itemClick(index)">{{item}}</div>
    </template>
  </div>
</template>

<script>
export default {
  name: "TabControl",
//  让别人告诉我展示数据
  props:{
    names:{
      type:Array,
      //如果没有传值 进来 就为 默认值
      default:()=>['衣服','鞋子','裤子']
    }
  },
  data(){
    return {
      // 记住 索引很重要 点击谁 就赋值给它
      currentIndex:0
    }
  },
  methods:{
    //这里发生点击 外部不知道 要穿出去
    emits:["tabItemClick"],
    itemClick(index){
      this.currentIndex = index
      // console.log(this.currentIndex)
      this.$emit("tabItemClick",index)
    }
  }
}
</script>

<style scoped>
  .tab-control {
    display: flex;
    height: 44px;
    line-height: 44px;
    text-align: center;
    background-color: pink;
  }
  .tab-control-item {
    flex: 1;
  }
  .tab-control-item.active {
    color:skyblue;
    border-bottom: 3px solid red;
    font-weight: 700;
  }
</style>

Vue.js 组件通信与高级特性解析 本文深入探讨了Vue.js中的组件通信机制、内容分发、混合、动态组件等高级特性。通过代码示例和详细解析,展示了如何在Vue.js应用中实现父子组件间的数据传递、如何利用slot实现组件内容的灵活分发、混合对象在Vue.js中的使用方式、动态组件的创建与缓存,以及异步组件的加载等。 阅读详情

相关推荐

DoubletFinder实战:如何优化参数提升scRNA-seq双细胞识别准确率?

本文深入探讨了如何通过优化DoubletFinder参数提升scRNA-seq双细胞识别准确率。详细解析了pK和nExp参数的影响机制,提供了系统化的参数优化流程和多样本整合策略,并结合真实数据集演示了验证方法与高级应用场景,帮助研究人员获得更可靠的分析结果。

weixin_28523493的博客 339

【Vue项目复习笔记】tabControl组件的吸顶效果

因为原来在我们的布局上面,这个tabControl把内容都往下压了压,然后tabControl脱标了以后,下面的东西都会往上走tabControl的高度,所以会突然往上升了升。我们可以这么做,一旦我们向上滚动的时候,当我滚到两个tabControl重合的时候,就让最上面的那个tabControl显示出来,一旦到了下面的时候,就让它消失,也就是。这里的offsetTop指的是图片加载完成,加载完成以后再获取的offsetTop,也就是544这个值,之后我们在动态的绑定样式。所以我们直接监听轮播图加载。....

qq_40992225的博客 489

字节跳动扣子AI应用开发平台之实战

推出背景:扣子平台由字节跳动推出,旨在让非开发者也能快速创建、调试和优化聊天机器人。上线时间:扣子平台于2024年2月1日正式上线。功能定位:扣子是一个AI聊天机器人和应用程序编辑开发平台,可以理解为字节跳动版的GPTs。

恩爸编程 5893

vue3 swiper获取当前activeIndex

vue3 swiper获取当前activeIndex

yaoyao_mengyao的博客 5477

从实验室到生产线:Qwen3-Omni后训练技术在实际业务中的落地挑战

本文探讨了Qwen3-Omni后训练技术在实际业务中的落地挑战,重点分析了多模态AI在工业应用中的关键问题与解决方案。通过金融风控、跨境电商等场景案例,揭示了通用模型与垂直需求的矛盾,并提供了知识蒸馏、语音合成优化等实战经验,助力企业实现技术到业务的转化。

weixin_29035147的博客 265

2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛A题 农业灌溉系统优化

该摘要探讨了农业灌溉系统优化面临的复杂挑战,涉及智能灌溉技术的应用与资源配置问题。研究聚焦于一个1公顷的方形农场案例,该农场种植三种作物并面临动态环境条件(土壤类型、气象变化)。系统优化需平衡河流引水(非线性成本函数:C=50L^1.2+0.1Q^1.5)与储水罐灌溉(成本5元/升容积)两种方案,同时满足喷灌技术约束(喷头间距≥15米,覆盖半径15米)。关键矛盾体现在"平河旱储"的水资源调配策略与多作物需水量差异之间的协调,需通过传感器数据实时调整灌溉方案以实现效率最大化。(149字)

m0_60472361的博客 641

Vue实现active点击切换

循环的情况: 1、点击时传入index索引(获取当前点击的是哪个) @click="active(index)" 2、将索引值传入class(索引等于几就第几个添加active类) :class="{active:index==ins}" 3、在data里边添加ins:0(表示默认第一个添加active类) data{ ins:0 } 4、最后在methods里边添加方法 act...

小破孩的博客 6万+

达梦慢sql和统计信息收集

各计划节点的执行顺序为:缩进越多的越先执行,同样缩进的上面的先执行,下面的后执行,上下的优先级高于内外。在建立索引的时候,要考虑索引的最左匹配原则(在使用 SQL 语句时,如果 where 部分的条件不符合最左匹配原则,可能导致索引失效,或者不能完全发挥建立的索引的功效);执行计划是 SQL 语句的执行方式,由查询优化器为语句设计的执行方式,交给执行器去执行。生产系统中,对于频繁变动的数据表,多次执行计划可能会出现不一致的问题,这往往是由于统计信息不准导致的,索引定期收集统计信息就很有必要了。

m0_37680131的博客 1713

vue项目使用锚点双向定位 实现滚动功能

vue项目使用双向锚点定位 如图所示: 点击左侧菜单可以跳转到对应内容,鼠标滚轮滚动 菜单也根据内容显示active项 代码如下: 给父盒子一个id <div class="case-infos" id="content"> <ul class="tabs"> <li v-for="(item, index) in tabsList" :key="index"

weixin_52827704的博客 8250

zynq的irq_f2p 如何增加或修改中断引脚个数(宽度)

ZYNQ开发过程中,如果使用PL到PS的中断,会产生一个疑问,设置界面显示可以有[91:84]、[68:61]共16个中断引脚,但是并没有设置中断口的宽度,如果使用多个中断引脚,应该怎么办?如果通过concat连接多个引脚,则自动调整为对应的引脚数。例如连接3个中断信号,则自动调整为:IRQ_F2P[2:0]

FPGA艺术家的博客 833

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1658

class样式悬停 :class=“{‘active‘:循环项==index}“

data(){ return{ 循环项:-1 }} style里面写active的样式

Neko的博客 2249

如何解决Elsevier和IEEE期刊之间参考文献的转换问题

Elsevier期刊和IEEE旗下的期刊两者模版互相转换的时候,会发现Elsevier模版的参考文献是存放在.bib文件下的,然后在.tex文件中直接引用即可。3. 在IEEE的.tex文件中的\end{document}命令行之前,添加下面的这句话(ps:\bibliography{**}中的**名称即为.bib文件的名称)如何将Elsevier的参考文献快速的转成IEEE期刊可用的格式,是本博客需要解决的问题。2. 将下载好的.bib文件,上传到IEEE的latex文件中。

薰珞婷紫小亭子的博客 1674

Vue.js 基础:渐进式 JavaScript 框架

本文围绕 Vue.js 展开,它是渐进式 JS 框架,可按需引入功能。介绍了 CDN 和 NPM 引入方式,涵盖数据绑定、指令、组件化、组件通信及生命周期钩子等基础知识。创新在于渐进式开发理念。适用于从简单交互到大型单页应用,能降低开发门槛,提高效率,助力构建灵活可扩展的前端应用。

专注技术分享 722

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Vue.js 组件化开发:从入门到进阶

介绍了 Vue.js 组件化开发的概念与实践,首先解释了什么是组件化及其优势,然后通过简单的例子展示如何创建和使用 Vue 组件。接着,讨论了组件间的通信,包括父子组件间的数据传递和事件处理。最后,文章提到组件库的应用,帮助开发者更高效地复用代码。总体而言,组件化开发能够使代码更模块化、更易维护。

lzDevastator的博客 1099

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Vue.js组件开发教程:高效构建可复用的UI组件

在Vue中,组件是一个包含视图(HTML)、行为(JavaScript)和样式(CSS)的独立单元。组件是Vue应用的基本构建块,几乎所有的Vue应用都由多个组件组成。Vue组件有两种定义方式:1. 全局注册组件:可以在Vue实例中直接注册并在整个应用中使用。2. 局部注册组件:只在某个父组件内注册,局部使用。Vue.js组件化开发的优势在于:1. 可复用性:组件可以被多次复用,减少代码冗余,提高开发效率。2. 模块化:每个组件都是一个独立的模块,功能分明,易于维护和扩展。

X2829352498的博客 1329

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于Vue.js组件开发

Vue.js组件开发是一种基于Vue.js框架的开发方式,通过将用户界面分解为独立的、可复用的组件,实现高效、模块化的前端开发。Vue.js组件开发是一种高效、模块化的开发方式,通过将用户界面分解为独立的组件,可以实现复杂前端应用的快速开发和维护。通过组件化开发,可以将复杂的前端应用分解为多个独立的模块,每个模块负责特定的功能,从而提高代码的可维护性和复用性。Vue.js非常适合开发单页面应用。通过组件化开发,可以将页面的不同部分封装为独立的组件,然后通过Vue Router实现页面的路由切换。

欢迎来到我的博客 524

Vue.js教程-组件化开发

Vue.js教程-组件化开发前言Vue组件化什么是组件化Vue单页面开发的解释组件化思想组件的使用原理实际开发中的使用-父子组件父子组件传递数据父传子-props用法子传父-this.$emit()自定义事件父组件直接获取子组件的数据this.$childrenthis.$ref子组件直接获取父组件的数据-this.$parent非父子组件之间的数据传递总结 前言 本章介绍为什么要进行组件化开发、什么是组件化和组件之间的关系和数据传递。 Vue教程目录 Vue组件化 什么是组件化 当我们遇到复杂问题时

CoderHqf的博客 4216

Vue.js的组件化开发

web中的组件其实就是页面组成的一部分, 好比是电脑中的每一个元件(如硬盘、键盘、鼠标), 它是一个具有独立的逻辑和功能或界面, 同时又能根据规定的接口规则进行相互融化, 变成一个完整的应用。

无笙的博客 1万+

Vue.js 组件开发:从入门到精通

Vue.js 组件是可复用的 Vue 实例,它拥有自己独立的模板、逻辑和样式。通过将复杂的页面拆分成多个小的组件,我们可以更好地组织代码,提高代码的可读性和可维护性。

weixin_69882801的博客 538

Vue前端实战教程:环境搭建+组件化开发+组件通信

结构 (有且只能一个根元素)script: js逻辑style: 样式 (可支持less,需要装包)让组件支持lessstyle标签,lang="less" 开启less功能装包: yarn add less less-loader -D 或者npm i less less-loader -D。

As_Yua的博客 1713

vuejs-----组件化开发

什么是组件化? 我们将一个完整的页面分成很多个组件。 每个组件都用于实现页面的一个功能块。 而每一个组件又可以进行细分。 Vue组件化思想 组件化是Vue.js中的重要思想 它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。 任何的应用都会被抽象成一颗组件树 组件化思想的应用: 有了组件化的思想,我们在之后的开发中就要充分的利用它。 尽可能的将页面拆分...

猪窝 768

vue的安装使用

Vue概述 1、what 是一个渐进式的构建用户界面的js框架 2、where 小到的简单的表单处理,大到复杂的数据操作比较频繁的单页面应用程序 3、why 方便阅读的中文文档 容易上手 (学习曲线比较缓和) 体积小 基于组件化的开发方式 代码的可读性、可维护性得到了提高 4、how 工作方式:可以通过丰富的指令扩展模板,可以通过各种各样的插件来增强功能 搭建环境 方式1 全局安装 vue-cli...

weixin_45589635的博客 215

在Vue js中什么是组件通信有哪些方法可以实现组件通信

基本概念与作用说明组件通信的重要性组件间的关系示例一:通过 props 和自定义事件进行父子组件通信父组件向子组件传递数据:props子组件向父组件传递数据:自定义事件示例二:使用 Vuex 进行跨组件通信示例三:使用 provide/inject 进行祖先-后代组件通信示例四:使用事件总线(Event Bus)进行兄弟组件通信示例五:使用 Refs 访问子组件实例实际开发中的使用技巧1. 使用 Key 值强制重新渲染2. 使用 scoped slots 传递具名插槽内容。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1340

初识vue(7)——组件化

组件化的意义 什么是组件化:将一个大问题拆解为一个一个小问题,去解决一个一个的小问题,当解决完所有小问题,那么大问题也就解决了。 比如这个页面,可以先将这个大页面分为2部分,上部分导航栏,下部分显示内容。页面上部分的导航栏,有6个功能不同的按钮,可以看成6个组件,6个组件组成导航栏,然后导航栏和下部分组成整个页面。这里的组件都是可以复用。 组件化优势: 1.高内聚低耦合,拆分项目,团队分工,加快进展; 2.组件可复用,方便维护,方便阅读; 3. ...

qq_45149720的博客 183

vue向ifarm传值_Vue倔强青铜-入门和组件化通信

入门作为前端最容易上手的框架,Vue入门其实没啥说的,我放一段清单的代码,大家能看懂就说明能上手了<template> <div id="app"> <h1>{{title}}</h1> <div> <input type="text" v-model="val"> <butt...

weixin_39624716的博客 224
上一篇: Vue | Vue.js 组件化基础 - 脚手架
下一篇: 前端经典面试题 | this相关问题
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderHing[专注前端]

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值