前端经典面试题 | Vue组件间的通信方式

简介: 前端经典面试题 | Vue组件间的通信方式

一、回答点

普遍的 说 三四个即可 父/子 props/emit eventBus  provide/ inject 等..

二、深入回答

props/$emit

       简述: 父组件通过 props 向子组件传递数据,子组件通过 $emit 和父组件通信


父组件向子组件传值


  • props 只能由父组件对子组件进行传值, 使得父子组件之间形成一个单向绑定.子组件的数据会随着父组件不断的更新
  • props 可以定义一个以上(包括一个)的数据,对于子组件接收的数据,可以是各种数据类型,也可以传递一个函数
  • 代码展示
<!-- 父组件 -->
<template>
  <div class="father">
    <son :msg="msg" :fn="fatherFunction" />
  </div>
</template>
<script>
import son from './sons.vue'
export default {
  name: 'FatherPage',
  components: {
    son
  },
  data() {
    return {
      msg: '父组件数据'
    }
  },
  methods: {
    fatherFunction() {
      console.log('fatherPage')
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div class="son">
    <p>父组件传递过来的值:{{ msg }}</p>
    <button @click="fn">按钮</button>
  </div>
</template>
<script>
export default {
  name: 'Son',
  props: ['msg', 'fn']
}
</script>

子组件向父组件传值


  • $emit 绑定一个自定义事件,当这个事件被触发时会将参数传递给父组件 而父组件通过 v-on 或语法糖(@) 监听并接收参数
  • 代码展示
<!-- 父组件 -->
<template>
  <div class="father">
    <son @clickSon="clickSonMsg" />
  </div>
</template>
<script>
import son from './sons.vue'
export default {
  name: 'FatherPage',
  components: {
    son
  },
  methods: {
    clickSonMsg() {
      console.log('子组件传递过来点击信息')
    }
  }
}
</script>
<!-- 子组件 -->
<template>
  <div class="son">
    <button @click="sonClick">告诉父亲被打了!</button>
  </div>
</template>
<script>
export default {
  name: 'SonPage',
  methods: {
    sonClick() {
      this.$emit('clickSonMsg')
    }
  }
}
</script>

eventBus 事件总线(emit/emit/emit/on)

       简述:eventBus事件总线 适合 父子组件|非父子组件等之间的通信,使用步骤如下:


  • 创建事件中心管理组件之间的通信
  • 发送事件
  • 接收事件

依赖注入Provide / inject

       简述: Vue中的依赖注入,用于 父子组件之间通信,也可用于 祖孙组件之间的通信,在层级很深的情况下,使用这种方式进行传值.


provide / inject 是Vue提供的两个钩子函数 和 data methods 是同级的 并且 provide书写跟data是一样的.


  • provide 是用来发送数据/方法
  • inject 用来接收数据/方法
  • 需要注意的是 依赖注入提供的属性 都 不是响应式
  • 代码展示
// 在父组件中:
  provide() {
    return {
      num: this.num
    }
  }
// 在子组件中:
  inject: ['num']

ref/$refs

       简述:也是实现 父子组件 之间的通信


  • ref:用在子组件上,它的引用指向了子组件的实例. 可以通过实例来访问组件的数据和方法..

parent/parent/parent/ children

  • $parent 可以让组件访问父组件的实例(上一级组件的属性和方法)
  • $children 可以让组件访问子组件的实例,注: 它并不能保证 子组件的顺序,并且访问的数据 不是响应式数据

attrs/attrs/attrs/listeners

       简述: Vue引入了它们两个 可以实现 跨组件跨代通信


  • $attrs: 继承所有的父组件属性(除了prop传递的属性 class style),常用于 子组件的元素上
  • listeners:,,von=listeners:它是一个对象,包含了作用在这个组件上的所有监听器,配合v−on=listeners: 它是一个对象,包含了 作用在这个组件上的所有监听器,配合v-on=listeners,将所有的事件监听器指向这个组件的某个特定的元素.

三、总结及归纳

父子组件的通信

  • 子组件通过 props 来接收父组件传递过来的数据, 父组件在子组件上 注册监听事件,子组件通过 $emit触发事件 向 父组件发送数据.
  • 通过ref属性给子组件设置名字,父组件通过refs=,refs=组件名来获取子组件实例,子组件通过refs=组件名来获取子组件实例,子组件通过parent获得父组件,这样也可以实现通信.
  • 使用provide/inject , 在父组件中 通过 provide提供变量, 子组件中通过inject将变量注入到组件中,不论层级有多深,只要调用了inject 就可以注入 provide中的数据

兄弟组件的通信

  • eventBus方法,它本质是通过 创建一个空的Vue实例来作为消息传递的对象, 通信组件 引入这个实例,通过这个实例来监听和触发时间,实现传递
  • 通过parent/parent/parent/refs 来获取到兄弟组件 也可以进行通信

任意组件之间

  • 还是通过eventBus来实现,他创建了一个 中心点 可以用它来传递事件和接收
相关文章
|
18天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
18天前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
23天前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
18天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】 React与Vue:前端框架的巅峰对决与选择策略
|
25天前
|
前端开发 JavaScript API
2025年前端框架是该选vue还是react?有了大模型-例如通义灵码辅助编码,就不用纠结了!vue用的多选react,react用的多选vue
本文比较了Vue和React两大前端框架,从状态管理、数据流、依赖注入、组件管理等方面进行了详细对比。当前版本和下载量数据显示React更为流行,但Vue在国内用户量增长迅速。Vue 3通过组合式API提供了更灵活的状态管理和组件逻辑复用,适合中小型项目;React则更适合大型项目和复杂交互逻辑。文章还给出了选型建议,强调了多框架学习的重要性,认为技术问题已不再是选型的关键,熟悉各框架的最佳实践更为重要。
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
6天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
6天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
5天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉