5.模板语法与组件通信 来源:https://my.feishu.cn/docx/Kt6vdjYURoJygjxKpSrcr8oXngd 采集状态:已完成正文采集;已滚动到底部并复查 ✏️ Vue 的模板语法是其声明式渲染的核心,而组件通信则是构建可扩展应用的基础。这两者都是 Vue 面试中的绝对高频考点。 ​ ​ 1. 模板语法深入解析​ Vue 的指令(Directives)是带有 v- 前缀的特殊属性,用于在渲染的 DOM 上应用响应式行为。​ v-bind (缩写 :) - 动态属性绑定​ 用于动态地绑定一个或多个 HTML 属性。​ ​ ​ v-model - 双向数据绑定​ v-model 是一个语法糖,用于在表单输入元素或自定义组件上创建双向数据绑定。它会根据元素类型自动选择正确的方式来更新值。​ 核心原理: :value + @input 事件的结合。​ 修饰符:​ - .lazy: 将 input 事件同步改为 change 事件同步。​ - .number: 将输入值自动转为数字。​ - .trim: 自动过滤用户输入的首尾空白字符。​ ​ ​ ​ v-for - 列表渲染​ 用于基于一个数组来渲染一个列表。​ • 关键: 必须使用 key 属性为每个节点提供一个唯一的标识,以帮助 Vue 高效地更新 DOM。​ • 适用范围: 可以遍历数组、对象、数字和字符串。​ ​ ​ v-if / v-show - 条件渲染​ 用于根据条件决定是否渲染或显示一个元素。​ • v-if (真正的条件渲染): ◦ 当条件为 false 时,元素及其子组件会被销毁和从 DOM 中移除。 ◦ 切换开销较高,但初始渲染开销较低(如果条件为 false)。 ◦ 支持与 v-else 和 v-else-if 配合使用。 • v-show (基于 CSS 的切换): ◦ 元素始终会被渲染到 DOM 中。 ◦ 通过切换元素的 CSS display 属性来控制其显示和隐藏。 ◦ 切换开销较低,但初始渲染开销较高。 使用原则:​ • 频繁切换:使用 v-show。​ • 运行时条件很少改变:使用 v-if。​ ​ ​ ​ ​ 2. 组件通信模式详解​ 父子通信:props / emit / slots​ 这是最常用和最基础的通信方式。​ • props (父 -> 子): 父组件通过属性将数据向下传递给子组件。​ • emit (子 -> 父): 子组件通过触发事件将信息发送给父组件。​ • slots (父 -> 子内容分发): 父组件可以将模板片段(内容)插入到子组件指定的位置。​ • ​ 父组件 ParentComponent.vue​ ​ 子组件 UserCard.vue​ ​ ​ 双向绑定:在自定义组件上使用 v-model​ 你可以在自己的组件上实现 v-model,这对于创建自定义表单控件尤其有用。​ • 约定: 组件接收一个名为 modelValue 的 prop,并通过 update:modelValue 事件来更新它。​ 父组件 ParentForm.vue​ 子组件 CustomInput.vue​ ​ ​ 跨层级通信:provide / inject​ 当需要从祖先组件向其所有后代组件传递数据时,使用 provide 和 inject 可以避免逐层传递 props(即“prop drilling”)。​ • provide: 在祖先组件中提供数据或方法。​ • inject: 在任何后代组件中注入(接收)这些数据或方法。 祖先组件 App.vue​ ​ 后代组件 DeepChild.vue​ ​ ​ ​ ​ 3. 面试核心问题与最佳实践​ Q1: "v-if 和 v-show 有什么区别,应该如何选择?"​ • 区别: ◦ 原理: v-if 是真正的条件渲染,它会确保在切换过程中条件块内的事件监听器和子组件被适当地销毁和重建。v-show 只是简单地切换元素的 CSS display 属性。 ◦ 性能: v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。 • 选择: ◦ 如果需要频繁地切换,使用 v-show 性能更好。 ◦ 如果条件在运行时很少改变,或者初始为假时不需要渲染任何东西,使用 v-if 更合适。 Q2: "在 Vue 3 中,v-if 和 v-for 一起使用时,哪个优先级更高?"​ • 在 Vue 3 中,v-if 的优先级高于 v-for。这意味着 v-if 会先生效,此时它还无法访问到 v-for 作用域中的变量。​ • 最佳实践是避免将它们放在同一个元素上。推荐的做法是: a. 使用一个计算属性(computed)来预先过滤掉不需要显示的项,然后在过滤后的列表上使用 v-for。 b. 将 v-for 移到