{{ message }}
+ +{{ message }}
+ +``` + +- **指令**: Vue 指令是带有 `v-` 前缀的特殊属性。指令属性的值预期是单一 JavaScript 表达式。例如 `v-model`、`v-if`/`v-else-if`/`v-else`、`v-show`、`v-for`、`v-bind`、`v-on` 等。 + +```vue + + +Hello Vue!
+ +Focus me!
+ + + +``` + +在上述例子中,我们创建了一个自定义指令 `v-focus`,当元素被插入到 DOM 中时,这个指令会使元素自动获取焦点。 + +**使用 props 和自定义事件实现父子组件通信** + +在 Vue.js 中,props 和自定义事件是实现父子组件通信的主要方式。父组件通过 props 向子组件传递数据,子组件通过发射 (emit) 自定义事件向父组件传递数据或者通知父组件某个事件已经发生。 + +- 以下是一个使用 props 和自定义事件实现父子组件通信的例子: + +1. **父组件 (ParentComponent.vue)** + +```vue + +{{ injectedData }}
+ + + +``` + +在上述后代组件中,我们使用了 `inject` 函数来注入名为 `ancestorData` 的数据。请注意,在 TypeScript 中,我们需要使用类型断言 `>` 来指定注入数据的类型。 + +这种方式特别适用于一些跨级别的状态共享,例如主题颜色、语言偏好等全局性的配置。 + +**使用 event bus 进行任意组件间的通信(Vue 3.0 不再内置,但可以自行实现)** + +Vue 3.0 不再内置 event bus,但你可以使用一个简单的 EventEmitter 实现自己的 event bus。在这种情况下,任何组件都可以通过 event bus 发送和接收事件,实现跨组件通信。 + +以下是一个使用 event bus 进行任意组件间通信的例子: + +首先,我们需要创建一个 Event Bus: + +```ts +// EventBus.ts +import { EventEmitter } from 'events' + +export const EventBus = new EventEmitter() +``` + +然后,组件可以通过 Event Bus 发送和接收事件: + +1. **发送事件的组件 (EmitterComponent.vue)** + +```vue + + + + + +``` + +在上述组件中,我们定义了一个方法 `emitEvent`,用于在 `customEvent` 事件上发送数据。 + +2. **接收事件的组件 (ReceiverComponent.vue)** + +```vue + +{{ receivedData }}
+ + + +``` + +在上述组件中,我们使用了 `EventBus.on` 来监听 `customEvent` 事件,并在事件处理器 `handleCustomEvent` 中更新 `receivedData`。同时,我们也使用了 `EventBus.off` 来在组件卸载前移除事件监听器,以避免内存泄漏。 + +请注意,使用 event bus 进行跨组件通信应该谨慎使用,因为它使得数据流难以追踪,增加了代码的复杂性。在大型项目中,你可能会更倾向于使用专门的状态管理库,如 Vuex。 + +**使用 Vue 3.0 的新功能 `teleport` 进行组件内容的传输** + +在 Vue 3.0 中,新增了 `teleport` 功能,也被称为 "传送门"。`teleport` 能将子组件渲染到 DOM 中的任意位置,而不仅仅是局限于父组件的范围内。它特别适用于需要“破坏性”的 UI 特性,例如全屏覆盖的模态框、通知、对话框等。 + +以下是一个使用 `teleport` 进行组件内容的传输的例子: + +1. 在 HTML 文件中,添加一个目标元素: + +```html + + ... + + +``` + +2. 创建一个使用 `teleport` 的组件 (ModalComponent.vue): + +```vue + +This is some content inside the modal
+{{ count }}
+{{ double }}
+ + +{{ count }}
+ + +