admin 管理员组

文章数量: 887021


2024年1月5日发(作者:设计模式分为哪几类)

vue3子组件向父组件传值的三种方式

## Props

Props是向子组件传递父组件数据的标准方法。可将Props理解为组件的不可变数据源,子组件通过Props接收父组件的值。通过这种方式实现的组件通信非常直接和可靠。此外,通过设置Props中的type和default属性,可以对传入的数据进行验证和初始化。

```html

```

## $emit

## Provide / inject

import ChildComponent from './'

```

## 结束语除了上述提到的方法,Vue3中还有一些其他的通信方式可以实现子组件向父组件传值。

## $attrs / $listeners

$attrs和$listeners是Vue3中用于组件通信的另外两个属性。子组件可以使用$attrs获取父组件传递的所有属性值,并使用$listeners获取传入的所有事件监听器。对于一些不需要显式地定义props属性的组件,$attrs / $listeners是一种非常灵活和方便的通信方式。

```html

```

EventBus或者全局事件是一种可以跨越组件层次传递数据的通信方式。这种通信方式允许子组件向任何其他组件传递事件,而不仅限于父组件。在Vue3中,可以使用Vue实例或者createApp方法创建一个全局事件总线来实现这种通信方式。

const eventBus = createApp({});

Properties.$bus = eventBus;

export default {

components: {

ChildComponent,

},

data() {

return {

message: ''

}

},

created() {

// 监听子组件发送的事件

eventBus.$on('customEventTriggered', (data) => {

e = data;

});

},

}

```

在父组件中先创建一个全局eventBus,然后通过Vue3提供的$on和emit方法分别实现监听事件和触发事件。在子组件中,使用$bus.$emit方法向其他组件发送事件。

## 结束语

Vue3提供多种方式实现组件间通信,其中子组件向父组件传值是最常用的需求之一。上述所述的方法都可以实现该功能。具体使用哪种通信方式取决于应用的具体场景。需要权衡使用方法的优点和缺点,选择合适的实现方式。## provide / inject 与 $attrs /

$listeners 的差异

在Vue3中,provide / inject和$attrs / $listeners两种通信方式是非常常用的。它们可以分别用于组件之间的跨层传递数据和事件。但是,这两种通信方式有着不同的用途和限制。

provide / inject是Vue3中的一种数据传递方式,它通过在祖先组件中提供数据,然后在子组件中注入数据来实现跨层数据传递。

需要注意的是,provide和inject本质上是依赖关系注入。当一个组件引入provide提供的数据后,它会在自己的提供者列表中增加该项依赖,这会影响组件的更新行为。在需要全局数据管理以及嵌套组件传递多层数据时,使用provide / inject会更加合适。

当提供数据的组件深层嵌套,并且数据将经常发生变化时,使用provide / inject会非常有用。但是,需要注意的是,这种通信方式需要避免出现组件之间非常紧密的耦合关系。如果组件之间的耦合关系过于紧密,则会使组件的复杂性大大增加。

$attrs / $listeners是Vue3中用于事件监听和传递数据的高级特性。这种通信方式允许子组件像外部组件发送事件,并传递属性和事件。

在子组件中,将`inheritAttrs`设置为false,$attrs / $listeners属性将不再与props合并,这样就可以通过$attrs / $listeners获取需要的数据。

这种通信方式非常适用于对props进行有效性验证和对props进行自定义修改的情况。因为在这种情况下,props的验证可以以组件内置的方式进行,无需使用provide / inject来传递验证规则。另外,如果父组件向子组件传递的所有数据中有一些无关的属性,那么可以使用$attrs / $listeners来过滤掉这些属性。

## 总结

在Vue3中,有多种方式可以实现子组件向父组件传值,比如使用props、$emit,EventBus、Provide/Inject、$attrs/$listeners等等。每种通信方式都有不同的优缺点,适用于不同的场景。在选择使用具体的通信方式时,应该根据具体的需求和场景,权衡其优缺点,选择最合适的方式。

无论使用哪种方式,我们都应该避免使用一些非正式的通信方式,例如直接修改其他组件的state,或在父组件中直接引用子组件的方法等。这些方式虽然看似简单,但往往会导致代码的混乱和不可维护性,造成更多的问题。

总之,合理使用Vue3中的组件通信方式可以提高代码的稳定性、复杂度、灵活性和可维护性。


本文标签: 组件 方式 事件 使用