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

简介: Vue | Vue.js 组件化 - 组件间通信

一、Vue组件的嵌套关系

认识组件的嵌套

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


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


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

组件的拆分

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

138a4a5e938a42cc83c3aaaa298fa5b4.png

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

组件的通信

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


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


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


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


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


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


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

二、父组件传递子组件

父子组件之间通信的方式

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


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


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


449df700539e4ce28597c5dca7bfec39.png

父组件传递给子组件

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


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


什么是Props呢?


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


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


Props有两种常见的用法:


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


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


Props数组写法

8599af14aec94d2ebdfc27e4ed7d0076.png

Props的对象用法(掌握)

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


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


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

01d814392cf2478b9224b72a75eff24e.png

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

       String


       Number


       Boolean


       Array


       Object


       Date


       Function


       Symbol

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

557cf5393de64709bfa06e54239b47f5.png

细节三:Prop的大小写命名

Prop的大小写命名

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


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

e265d5fb1f1c4b7bacecae42deb1f557.png

三、非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的方式发出去事件

dc872dbd17bc4d799984d08aa87bda89.png

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

d1f0e90b73c048ae9de82fe7c88f02af.png

自定义事件的参数和验证

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

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
  }
},

五、组件通信案例练习

实现效果:

857442e7363f4311adb499dc3a7712e4.png2a070ad3a0e443e28a647ac80b0f3739.pngce9d909990594d60a4d8830e6693b3fa.png

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>
相关文章
|
4天前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
58 1
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
516 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
2月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
96 0
|
2月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
221 1
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
357 17
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
198 1
|
存储 前端开发 JavaScript
为什么我不再用Vue,改用React?
当我走进现代前端开发行业的时候,我做了一个每位开发人员都要做的决策:选择一个合适的框架。当时正逢 jQuery 被淘汰,前端开发者们不再用它编写难看的、非结构化的老式 JavaScript 程序了。
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
730 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
524 77