Vue 3:从父组件向子组件发出事件

And*_*ter 16 javascript vue.js vue-component vuejs2 vuejs3

现在我需要从父组件向子组件发出事件。我在 vue version 3 中看到$on$off实例$once方法被删除了。应用程序实例不再实现事件发射器接口。

现在我如何可以从 vue 版本 3 中的父组件发出事件并从子组件监听?

Sta*_*yan 17

您可以使用以下方式访问子方法Refs

https://v3.vuejs.org/guide/composition-api-template-refs.html

<!-- Parent -->
<template>
    <ChildComponent ref="childComponentRef" />
</template>

<script>
import { ref } from 'vue'
import ChildComponent from './components/ChildComponent.vue'

export default { 
  setup( ) {
    const childComponentRef = ref()
    childComponentRef.value.expandAll();

    return { childComponentRef }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)
<!-- Child -->
<script>
export default {
    setup() {
        const expandAll= () => {
            //logic...
        }

        return { expandAll}
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

  • 如果使用“&lt;script setup&gt;”,请参阅[组件参考](https://vuejs.org/guide/essentials/template-refs.html#ref-on-component)。您必须使用“defineExpose({})”公开您希望从父级调用的函数 (8认同)

小智 6

您不会从子组件监听父事件,而是将一个 prop 传递给子组件,如果子组件需要更新数据,您将从子组件向父组件发出一个事件来更新状态。

只读生命周期:Parent > Prop > Child

读取/更新生命周期:Parent > Prop > Child > Emit > Parent > Update > Child Updates

  • 例如,“expandAll”怎么样?我有带有按钮的父级和带有可扩展行的数据表子级。每个子行都有一个带有可扩展行的孙数据表。我想单击按钮并展开或折叠所有子数据表和所有孙数据表行。如果我只是在 props 中传递一个标志,它会保持行展开/折叠,并且不允许用户更改任何单行的状态......? (6认同)