vue组件通信

组件通信方式1:Props

在Vue中,组件间的通信是非常重要的。Props是Vue组件之间通信的一种方式,允许父组件向子组件传递数据。Props是子组件接收来自父组件的特定数据的方式。

优点

  1. 明确性:通过props,父组件可以明确地传递数据给子组件,子组件知道它应该接收哪些数据。
  2. 类型检查:Vue提供了类型检查功能,可以确保传递给子组件的数据符合预期的格式和类型,从而减少错误。
  3. 可预测性:使用props可以预测父组件将如何与子组件进行通信,使代码更具可读性和可维护性。

使用方式

  1. 定义Props:在子组件中,通过在props选项中声明属性来定义接收的props。
  2. 传递数据:在父组件中,使用属性将数据传递给子组件。
  3. 类型和验证:可以为props指定类型和验证规则,以确保传递的数据符合预期。
  4. 动态Props:使用v-bind指令或简写形式:将父组件的数据动态绑定到子组件的属性上。

注意事项

  1. 单向数据流:props是单向数据流,父组件向子组件传递数据,子组件不应直接修改从父组件接收的数据。
  2. 避免直接操作props:如果需要修改通过props传递的数据,应在子组件内部定义一个新的变量来存储这些数据,而不是直接修改props。
  3. 使用默认值:可以为props指定默认值,以确保在父组件未传递该属性时使用默认值。

示例代码

父组件(ParentComponent.vue):

  
  
  
  

子组件(ChildComponent.vue):

  
  
  
  

在Vue 3中,组件之间的通信方式保持不变,包括props和自定义事件。与Vue 2相比,Vue 3引入了组合式API,这是一种新的API风格,使组件逻辑更加清晰和可维护。

通信方式2:自定义事件

自定义事件是Vue组件之间通信的一种重要方式,允许子组件触发事件并向父组件传递数据。在Vue 3中,自定义事件的使用方式与Vue 2相似,但结合组合式API,可以更加灵活和模块化地实现组件间的通信。

优点

  1. 灵活性:自定义事件提供了一种灵活的通信方式,子组件可以在需要时触发事件并向父组件传递数据。
  2. 双向通信:与props的单向数据流不同,自定义事件可以实现子组件与父组件之间的双向通信。
  3. 事件封装:通过自定义事件,可以将相关的业务逻辑和数据封装在子组件中,使代码更加模块化。

使用方式

  1. 触发事件:在子组件中,使用this.$emit方法触发自定义事件,并传递相关数据作为参数。
  2. 监听事件:在父组件中,使用v-on指令或简写形式@来监听子组件触发的自定义事件,并在事件处理函数中接收传递的数据。

示例代码和代码注释

使用Vue 3的组合式API实现自定义事件的示例代码如下:

父组件(ParentComponent.vue):

  
  
  
  

子组件(ChildComponent.vue):

  
  
  
  

在父组件中,我们使用setup函数来定义组件的逻辑。在setup函数中,我们创建了一个名为handleCustomEvent的函数,该函数用于处理子组件传递的数据。然后,我们将该函数暴露给模板,以便在子组件触发自定义事件时能够调用该函数。在子组件中,我们使用setup函数来定义子组件的逻辑。在setup函数中,我们创建了一个名为triggerCustomEvent的函数,该函数用于触发自定义事件并传递数据给父组件。然后,我们将该函数暴露给模板,以便在按钮点击事件中调用该函数来触发自定义事件。通过这种方式,我们实现了子组件向父组件传递数据的能力,实现了组件之间的双向通信。

组件通信方式3:mitt

官方性的介绍Vue组件通信方式3:mitt

Mitt是一个小巧且高性能的库,用于在JavaScript应用程序中捕获和触发自定义事件。虽然Mitt不是Vue专用的,但它可以与Vue 3的组合式API一起使用,为组件间的通信提供额外的灵活性和性能。

Mitt的主要特点是:

  1. 轻量级: Mitt只有大约1KB,非常适合小型到中型项目。
  2. 高性能: Mitt使用了高效的内存分配和事件池技术,确保高效的事件触发和内存使用。
  3. 易用性: 它提供了一个简单易用的API,可以轻松地创建、触发和监听事件。

首先,确保您已经安装了 Mitt。您可以使用npm或yarn进行安装: 

npm install mitt  
# 或  
yarn add mitt

父组件(ParentComponent.vue)

  
  

 子组件(ChildComponent.vue)

  
  

Vue组件通信方式4:v-model

v-model是一种特殊的语法糖,用于简化双向数据绑定。它使父组件和子组件之间的数据传递更加直观和高效。在Vue 3中,v-model与组合式API结合使用,进一步提高了代码的可读性和可维护性。

优点

  1. 双向绑定:v-model提供了一种简单的方法来实现双向数据绑定,使得父组件和子组件之间的数据同步更加方便。
  2. 简洁性:v-model简化了双向绑定的语法,减少了代码的复杂性,提高了开发效率。
  3. 易于理解:对于熟悉表单输入的开发者来说,v-model非常直观,易于理解和学习。

缺点

  1. 依赖性强:v-model依赖于Vue的响应式系统,如果使用其他框架或库,v-model可能无法正常工作。
  2. 不适合所有场景:虽然v-model在许多场景下非常有用,但它并不适合所有组件通信方式。对于更复杂的数据流或需要更精细控制的情况,可能需要其他通信方式。

父组件(ParentComponent.vue):

 

  
  

 子组件(ChildComponent.vue):

  
  

Vue组件通信方式5:$attrs

在Vue 3中,$attrs是一个特殊的属性,它提供了组件上所有非prop特性的属性。这使得子组件能够访问父组件传递给它的所有属性,而不仅仅是那些明确声明的prop。

优点

  1. 灵活性:$attrs提供了一种灵活的方式来访问和传递额外的属性。它使得子组件能够接收并使用父组件传递的任何属性,而不必显式声明或处理这些属性。
  2. 简化代码:在某些情况下,使用$attrs可以避免在子组件中显式声明和传递不必要的prop,从而简化代码和提高可读性。

缺点

  1. 易用性:由于attrs包含了所有非prop的属性,它可能会使代码变得混乱,特别是当传递大量属性时。开发者需要小心处理attrs,以确保不会意外地覆盖或修改重要的组件状态。
  2. 性能影响:使用attrs可能会对性能产生一定影响,因为它涉及到额外的属性绑定和可能的计算成本。在性能敏感的应用中,应该谨慎使用attrs。

父组件(ParentComponent.vue):

  
  

 子组件(ChildComponent.vue):

  
  

在 Vue 3 中,组件通信主要有以下几种方式:props 传递、事件触发、emit、refs、parent和全局状态管理。

$refs

refs用于直接访问子组件实例,通常用于在模板中无法直接访问的场景。通过refs,可以直接访问子组件的数据、方法等。

优点:
  1. 可以直接访问子组件的数据和方法。
  2. 可以用于在模板中无法直接访问的场景。
缺点:
  1. 不应过度依赖 $refs,因为这会增加父子组件的耦合度。
  2. 不应在模板中频繁使用 $refs,因为这会影响性能。

父组件模板:

 父组件脚本:

import { ref, onMounted } from 'vue';  
import ChildComponent from './ChildComponent.vue';  
  
export default {  
  components: { ChildComponent },  
  setup() {  
    const message = ref('');  
    const inputRef = ref(null);  
    const childRef = ref(null);  
    onMounted(() => {  
      console.log(inputRef.value); // 访问 input 输入框的值  
      console.log(childRef.value); // 访问子组件实例  
    });  
    return { message, inputRef, childRef };  
  },  
};

子组件模板:

子组件脚本:

export default {  
  setup() {  
    const parentComponent = this.$parent; // 访问父级组件实例  
    const message = parentComponent.message; // 访问父级组件的数据(message)  
    console.log(message); // 输出父级组件的数据(message)到控制台  
  },  
};

父组件通过 refs可以直接访问子组件的实例,并且可以通过子组件的实例来调用其方法或访问其数据。但需要注意,过度依赖refs 会增加组件之间的耦合度,应尽量避免。此外,频繁使用 $refs 也会影响性能,因此应尽量在模板中避免使用。

$parent

parent用于访问当前组件的父级组件。通过parent,可以获取父级组件的数据和方法。但需要注意的是,过度依赖 parent会导致组件之间的耦合度增加,应尽量避免。此外,使用parent 也可能会破坏 Vue 的数据流,导致一些难以调试的问题。因此,除非必要,否则应避免使用 $parent。

优点:
  1. 可以直接访问父级组件的数据和方法。
  2. 可以用于跨层级的通信。
缺点:
  1. 不应过度依赖 $parent,因为这会增加组件之间的耦合度。
  2. 使用 $parent 也可能会破坏 Vue 的数据流,导致一些难以调试的问题。
  3. 不应在模板中频繁使用 $parent,因为这会影响性能。
  4. 不应在非父子关系的组件之间使用 $parent,因为这会导致逻辑混乱和难以维护。

 

export default {  
  setup() {  
    const parentComponent = this.$parent; // 访问父级组件实例  
    const message = parentComponent.message; // 访问父级组件的数据(message)  
    console.log(message); // 输出父级组件的数据(message)到控制台  
  },  
};

你可能感兴趣的:(vue.js,前端,javascript,笔记)