Vue 2 组件化开发与根组件详解

组件化开发概述

组件化开发的定义

组件化开发是指将一个完整的网页或应用界面,按照功能与职责划分为若干个独立、可复用的单元——即组件。每个组件均具备以下三个基本要素:

  • 独立的结构(template):定义组件的 HTML 模板;
  • 独立的样式(style):定义组件专属的 CSS 或预处理器样式;
  • 独立的行为(script):定义组件的数据、方法、计算属性、侦听器及生命周期钩子等逻辑。

传统开发模式的局限性

在未采用组件化开发的项目中,通常将全部 HTML 结构、CSS 样式与 JavaScript 逻辑集中于单一文件中:

  • 所有 DOM 结构写入一个 HTML 文件;
  • 所有样式通过 <link> 引入或内联于 <style> 标签;
  • 所有交互逻辑集中于一个或多个 JS 文件。

该模式在小型项目中具有开发便捷性,但存在显著缺陷:

  • 可维护性差:当页面代码量达数百行时,定位特定模块的结构、样式或逻辑异常困难;
  • 复用性缺失:相同功能模块(如页头、页脚)需在多处重复编写,修改需同步多处;
  • 协作效率低:团队成员难以并行开发不同功能区域,易引发冲突。

组件化开发的核心优势

组件化开发通过解耦与封装,系统性解决上述问题:

(1)提升可维护性
  • 页面被拆分为语义明确的组件(如 Header.vueSidebar.vueMainContent.vueFooter.vue);
  • 各组件内部的结构、样式、行为高度内聚,错误定位范围被严格限定在单个组件内
  • 修改某组件仅影响其自身,不影响其他组件逻辑。
(2)增强可复用性
  • 封装完成的组件可在同一项目内多处复用(如全站统一头部);
  • 组件可跨项目迁移,形成企业级 UI 组件库;
  • 复用无需复制粘贴代码,仅需导入与注册即可使用。
(3)提高开发效率
  • 开发过程类比“搭积木”:通过组合已有的、经过充分测试的组件快速构建新页面;
  • 组件更新后,所有引用位置自动同步生效;
  • 支持并行开发:不同开发者可同时开发不同组件,互不干扰。

组件分类:普通组件与根组件

组件的两类划分

Vue 应用中的组件依据其层级与作用范围,分为:

  • 普通组件(Regular Component):用于实现具体业务功能或 UI 区域的可复用单元,例如商品卡片、用户列表、搜索框等;
  • 根组件(Root Component):整个 Vue 应用的顶层容器组件,唯一且必须存在,负责组织与挂载所有普通组件。

根组件的核心地位

  • 根组件是应用的入口与总控中心,包裹并协调所有子组件的渲染与通信
  • 其文件名约定为 App.vue,由 Vue 实例通过 new Vue({ el: '#app', render: h => h(App) }) 进行挂载;
  • 在组件树结构中处于最顶层,构成严格的父子层级关系:
    1
    2
    3
    4
    5
    6
    7
    App.vue(根组件)  
    ├── Header.vue
    ├── Sidebar.vue
    ├── MainContent.vue
    │ ├── ProductCard.vue
    │ └── ProductCard.vue
    └── Footer.vue

App.vue 的标准结构与规范

单文件组件(SFC)的三部分构成

App.vue 作为典型的 Vue 单文件组件,严格遵循三段式结构:

部分 标签名 作用说明
结构 <template> 定义组件的 HTML 模板;必须且仅能有一个根元素(Vue 2 限制);
行为 <script> 导出组件配置对象,包含 datamethodscomputedwatch、生命周期钩子等;
样式 <style> 定义组件作用域内的 CSS 样式;支持原生 CSS 及预处理器(如 Less、Sass);

注意:此三段式结构不仅适用于根组件 App.vue,同样适用于所有普通 .vue 组件。

结构部分(<template>)规范

  • 根元素唯一性:模板内必须且只能存在一个顶层 DOM 元素(如 <div><section>),不可并列多个同级标签;
  • 错误示例

    1
    2
    3
    4
    5
    <template>
    <header></header> <!-- ❌ 错误:多个根元素 -->
    <main></main>
    <footer></footer>
    </template>
  • 正确写法(外层包裹容器):

    1
    2
    3
    4
    5
    6
    7
    <template>
    <div class="app-container"> <!-- ✅ 正确:唯一根元素 -->
    <header></header>
    <main></main>
    <footer></footer>
    </div>
    </template>
  • 说明:该限制为 Vue 2 特性,Vue 3 已支持多根节点(Fragments),但本教程基于 Vue 2,须严格遵守。

行为部分(<script>)规范

  • 必须以 export default 语法导出一个配置对象;
  • 该对象即为当前组件的实例选项(Instance Options),可包含以下常用选项:

    • data():返回一个函数,其返回值作为组件的响应式数据对象;
    • methods:定义组件内可调用的方法,常用于事件处理;
    • computed:定义计算属性,依赖响应式数据并具备缓存机制;
    • watch:定义侦听器,监听数据变化并执行副作用;
    • 生命周期钩子:如 createdmountedupdateddestroyed 等;
  • 基础示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <script>
    export default {
    data() {
    return {
    message: 'Hello Vue'
    }
    },
    methods: {
    handleClick() {
    alert('Hello Vue!')
    }
    },
    created() {
    console.log('组件实例已创建')
    }
    }
    </script>

样式部分(<style>)规范

默认为全局样式,若需限制作用域至当前组件,应添加 scoped 属性:

1
2
3
<style scoped>
.app { color: red; }
</style>

支持 CSS 预处理器,需显式声明 lang 属性并安装对应依赖:

预处理器 声明方式 必需依赖包(开发依赖)
Less <style lang="less"> less、less-loader
Sass/SCSS <style lang="scss"> sass、sass-loader
  • 启用 Less 的完整步骤

    1. <style> 标签中添加 lang="less" 属性;
    2. 执行命令安装依赖:
      1
      npm install less less-loader --save-dev
    3. 重启开发服务器使配置生效。
  • Less 嵌套语法示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <style lang="less">
    .app {
    width: 400px;
    height: 400px;
    background-color: pink;

    .box {
    width: 100px;
    height: 100px;
    background-color: skyblue;
    }
    }
    </style>

开发环境配置要点

语法高亮支持

  • VS Code 默认无法识别 .vue 文件的多语言语法;
  • 需安装官方推荐插件 Vetur
  • 安装后,<template><script><style> 三部分将获得对应语言的语法高亮与智能提示。

依赖管理原则

  • 所有构建工具链依赖(如 less-loader)必须声明为开发依赖(--save-dev
  • 生产环境无需这些工具,仅在开发与构建阶段使用;
  • 依赖缺失将导致构建失败,典型错误信息:
    Module parse failed: Unexpected character '@'Failed to resolve loader

Vue 2 组件注册与使用教程(局部注册)

组件注册方式总览

Vue 提供两种组件注册机制:局部注册全局注册。二者本质区别在于作用域范围,类比于编程语言中的变量作用域:

注册方式 作用域范围 类比说明 适用场景
局部注册 仅在当前注册该组件的 Vue 实例或组件内部可用 类似于函数作用域内的局部变量,声明后仅在该函数内有效 针对特定组件定制、避免命名冲突、提升模块独立性
全局注册 在整个 Vue 应用的所有组件中均可直接使用 类似于全局变量,在任意位置均可访问 基础 UI 组件(如按钮、图标)、第三方插件组件

局部注册标准流程

局部注册需严格遵循以下两步操作流程:

创建 .vue 组件文件

  1. 目录规范:在 src/components/ 目录下创建组件文件。该目录专用于存放业务组件,体现清晰的项目结构约定。
  2. 文件命名:采用大驼峰命名法(PascalCase),例如 Header.vueMain.vueFooter.vue。此命名规则是 Vue 官方推荐,确保模板中标签名与组件名一致且语义明确。
  3. 文件结构:每个 .vue 文件必须包含完整的三部分:
    • <template>:定义组件渲染的 DOM 结构;
    • <style>:定义组件专属样式(建议添加 scoped 属性以实现样式隔离);
    • <script>:导出组件配置对象(export default { ... })。

注意:组件之间相互独立,各自维护自己的结构、样式与逻辑,不存在隐式依赖或样式污染。

在使用处导入并注册组件

在需要使用该组件的父组件(如 App.vue)中执行以下操作:

步骤一:导入组件
1
2
3
import Header from '@/components/Header.vue';
import Main from '@/components/Main.vue';
import Footer from '@/components/Footer.vue';
  • 使用相对路径(如 ./components/Header.vue)或别名路径(如 @/components/Header.vue@ 默认指向 src/ 目录);
  • 导入语句必须位于 <script> 标签内,且在 export default 之前。
步骤二:局部注册组件

在父组件的 export default 配置对象中,通过 components 选项注册:

1
2
3
4
5
6
7
8
9
export default {
name: 'App',
components: {
// 完整写法:组件名: 组件对象
Header: Header,
Main: Main,
Footer: Footer
}
}
  • components 是 Vue 实例的内置配置项,类型为对象;
  • 键(key)为组件在模板中使用的标签名,值(value)为导入的组件对象;
  • 当键与值变量名相同时,可使用 ES6 对象简写语法:
    1
    2
    3
    4
    5
    components: {
    Header, // 等价于 Header: Header
    Main,
    Footer
    }

组件使用规范

完成注册后,组件即可在父组件的 <template> 中以自定义 HTML 标签形式使用:

标签语法

  • 直接使用注册时指定的组件名作为标签名,例如 <Header/><Main/><Footer/>
  • 必须遵循大驼峰命名法,且标签名中不能包含空格或特殊字符
  • 推荐使用自闭合标签(如 <Header/>),符合 HTML5 规范且语义清晰。

模板中调用示例

1
2
3
4
5
6
7
<template>
<div class="app">
<Header/>
<Main/>
<Footer/>
</div>
</template>

注意事项

  • 组件标签名区分大小写<header/><Header/> 被视为不同标签;
  • 若未正确注册,控制台将报错 Unknown custom element
  • 组件标签必须嵌套在单个根元素内(如 <div>),否则 Vue 将抛出编译错误。

实践案例:构建三层布局应用

以下以构建一个包含头部、主体、底部的典型页面为例,完整演示局部注册流程。

初始化项目结构

  1. 清空 src/App.vue 内容,保留基础框架;
  2. 删除 src/assets/src/components/ 目录(若存在);
  3. 新建 src/components/ 目录。

创建子组件

(1)创建 Header.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div class="header">我是Header</div>
</template>

<script>
export default {
name: 'Header'
}
</script>

<style scoped>
.header {
height: 100px;
line-height: 100px;
text-align: center;
font-size: 30px;
background-color: #409eff;
color: white;
}
</style>
(2)创建 Main.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div class="main">我是Main</div>
</template>

<script>
export default {
name: 'Main'
}
</script>

<style scoped>
.main {
height: 400px;
margin: 20px 0;
text-align: center;
font-size: 24px;
background-color: #e6f7ff;
color: #1890ff;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div class="footer">我是Footer</div>
</template>

<script>
export default {
name: 'Footer'
}
</script>

<style scoped>
.footer {
height: 100px;
line-height: 100px;
text-align: center;
font-size: 30px;
background-color: #1890ff;
color: white;
}
</style>

App.vue 中注册并使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<template>
<div class="app">
<Header/>
<Main/>
<Footer/>
</div>
</template>

<script>
import Header from '@/components/Header.vue';
import Main from '@/components/Main.vue';
import Footer from '@/components/Footer.vue';

export default {
name: 'App',
components: {
Header,
Main,
Footer
}
}
</script>

<style>
.app {
width: 600px;
height: 700px;
margin: 0 auto;
padding: 20px;
background-color: #d0e7ff;
}
</style>

开发环境优化提示

  • VS Code 标签自动补全配置:若输入组件名后按 Tab 键无法自动展开标签,请启用 Trigger Suggestion 功能:
    1. 打开 VS Code 设置(Ctrl + ,);
    2. 搜索 editor.suggestOnTriggerCharacters
    3. 勾选该选项;
    4. 重启编辑器生效。

关键知识点总结

  • 组件本质:Vue 组件是封装了结构、样式与行为的可复用单元,遵循单一职责原则;
  • 局部注册核心步骤创建 .vue 文件 → 在父组件中 import → 在 components 选项中注册
  • 命名规范强制要求:组件文件名、导入变量名、注册键名、模板标签名均须采用大驼峰命名法(PascalCase)
  • 作用域隔离:局部注册组件仅在声明它的组件内有效,保障模块独立性;
  • 对象简写语法:当 components 对象的键与导入变量名相同时,可省略重复书写,提升代码简洁性;
  • 样式隔离.vue 文件中 <style scoped> 确保样式仅作用于当前组件,避免全局污染。

全局注册

定义与特征

全局注册指在 Vue 实例创建前,通过 Vue.component() 方法将组件注册为全局可用资源。注册完成后,该组件可在任意 Vue 组件模板中直接使用,无需重复导入与注册。

实施步骤

  1. 创建单文件组件(.vue 文件)
    同局部注册,需完整定义 <template><style><script> 三部分。例如创建 HmButton.vue

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <template>
    <button class="hm-button">通用按钮</button>
    </template>

    <script>
    export default {
    name: 'HmButton'
    }
    </script>

    <style scoped>
    .hm-button {
    height: 50px;
    line-height: 50px;
    padding: 0 20px;
    background-color: #337ab7;
    border-radius: 5px;
    cursor: pointer;
    }
    </style>
  2. 在入口文件 main.js 中完成全局注册

    • 导入组件模块;
    • 调用 Vue.component() 方法注册;
    • 导入语句必须置于 main.js 文件顶部,符合 JavaScript 模块导入规范。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // main.js
    import Vue from 'vue'
    import App from './App.vue'
    import HmButton from './components/HmButton.vue'

    // 全局注册组件
    Vue.component('HmButton', HmButton)

    new Vue({
    render: h => h(App)
    }).$mount('#app')
  3. 注册语法说明

    • Vue.component() 接收两个参数:组件名称(字符串)组件选项对象(或构造函数)
    • 组件名称必须为合法的 HTML 标签名格式,推荐使用大驼峰命名;
    • 每次调用 Vue.component() 仅注册一个组件;注册多个组件需多次调用。

使用方式

  • 注册完成后,在任意 .vue 文件模板中直接以标签形式使用,如 <HmButton></HmButton>
  • 支持在同一个模板中多次渲染,例如:
    1
    2
    3
    4
    5
    6
    7
    <template>
    <div>
    <HmButton />
    <HmButton />
    <HmButton />
    </div>
    </template>

全局注册优势

  • 一次注册,全域可用:避免跨组件重复导入与注册;
  • 集中维护,统一更新:修改组件源码后,所有引用位置自动生效;
  • 提升开发效率与代码一致性:适用于通用 UI 控件(如按钮、输入框、弹窗等)。

全局注册注意事项与最佳实践

命名规范

  • 所有组件名(含全局与局部)必须采用大驼峰命名法(PascalCase),例如 HmButtonUserProfileCard
  • 避免使用 HTML 保留字(如 headerfootermain),防止解析歧义;
  • 全局组件名建议添加业务前缀(如 Hm 表示“黑马”),降低命名冲突风险。

文件路径与导入

  • Vue CLI 脚手架支持省略 .vue 后缀的导入语法(如 import HmButton from './components/HmButton'),但显式书写 .vue 后缀更利于代码可读性与工具链兼容性
  • 导入路径应使用相对路径(./../),避免绝对路径依赖,提升项目可移植性。

全局注册的潜在风险

  • 命名污染:全局组件名空间有限,需严格约定命名规则;
  • 过度使用导致耦合:非必要全局化会削弱组件独立性,增加测试与重构难度;
  • 调试困难:全局组件错误可能影响全站,需配合 Vue Devtools 进行精准定位。

开发验证方法

  • 验证全局注册生效:注释 main.js 中的 Vue.component() 调用,保存后观察所有引用位置是否消失;
  • 验证局部注册隔离性:仅在单一组件中注册后,检查其他组件模板中是否报错(Unknown custom element);
  • 验证样式作用域:使用 <style scoped> 确保组件样式不泄漏,避免意外覆盖全局样式。

两种注册方式对比与选型原则

对比维度 局部注册 全局注册
作用域 仅限当前组件内部 所有组件均可直接使用
注册位置 使用组件的 components 选项中 main.js 入口文件中
导入位置 使用组件的 <script> main.js 文件顶部
注册方法 components: { ComponentName } Vue.component('ComponentName', component)
适用场景 功能专一、复用率低的私有组件 多处复用、需统一维护的通用组件
维护成本 高(多点同步修改) 低(单点修改,全域生效)

选型决策指南

  • 优先采用局部注册:作为默认实践,保障组件封装性与可预测性;
  • 当满足以下全部条件时,应升级为全局注册
    • 组件被三个及以上不同组件引用;
    • 组件具备明确的通用性(如基础 UI 控件、业务通用模块);
    • 团队对组件的视觉表现、交互逻辑、API 接口有统一规范要求
    • 项目已建立组件治理机制,能有效管理全局组件命名冲突与版本演进。

总结

组件注册是 Vue 应用架构设计的基础环节。局部注册保障组件封装性与按需加载能力,全局注册提升复用效率与维护一致性。开发者应依据组件复用广度、业务通用性及团队协作规范,审慎选择注册方式。在实际工程中,建议遵循“局部优先、全局收敛”原则:初始开发采用局部注册,待组件复用需求明确后,再迁移至全局注册,并纳入统一组件库管理体系。

Vue 2 组件开发规范:结构、样式与数据绑定注意事项

结构层面的约束:单根元素原则

Vue 2 要求每个组件的 template 选项中必须且只能包含一个根元素
该限制源于 Vue 的虚拟 DOM 渲染机制——组件实例需对应唯一的根节点,以确保 DOM 更新的准确性和一致性。

示例(合法):

1
2
3
4
5
6
<template>
<div class="container">
<h1>{{ title }}</h1>
<p>{{ content }}</p>
</div>
</template>

示例(非法):

1
2
3
4
5
<!-- 错误:存在多个同级根元素 -->
<template>
<h1>{{ title }}</h1>
<p>{{ content }}</p>
</template>

注意:若需包裹多个元素,应使用一个语义化或无样式容器(如 <div><section>)作为唯一根节点。

样式层面的隔离:全局样式与局部样式(scoped)

默认行为:全局样式

在 Vue 组件中声明的 <style> 标签,默认为全局样式。其作用域覆盖整个应用,不受组件边界限制。

  • 所有匹配的选择器(如 div.btn#header)将影响页面中所有符合该条件的 DOM 元素;
  • 不论目标元素位于哪个组件内,只要满足 CSS 选择器条件,样式即生效;
  • 多个组件中重复定义相同选择器时,易引发样式冲突,导致不可预期的视觉覆盖。

推荐实践:启用局部样式(scoped)

为保障组件样式的封装性与可维护性,强烈推荐为每个组件的 <style> 标签添加 scoped 属性

1
2
3
4
5
6
<style scoped>
div {
border: 3px solid blue;
margin: 30px;
}
</style>

启用 scoped 后,该样式仅作用于当前组件内部的元素,不会影响其他组件或根应用容器。

scoped 样式的工作原理

scoped 属性通过编译时注入机制实现样式隔离,包含两个关键步骤:

  1. 属性标记(Attribute Injection)
    Vue 编译器自动为当前组件模板内的所有 HTML 元素添加一个唯一标识属性:
    data-v-{hash},其中 {hash} 是基于组件文件内容生成的短哈希值。
    同一组件内所有元素共享同一哈希值;不同组件的哈希值互不相同。

  2. 选择器重写(Selector Rewriting)
    编译器同步重写 CSS 选择器,在原有选择器后追加 [data-v-{hash}] 属性选择器。
    例如:

    1
    2
    3
    4
    5
    /* 原始书写 */
    div { border: 3px solid blue; }

    /* 编译后实际生效的样式 */
    div[data-v-f3f4f5a6] { border: 3px solid blue; }

该机制确保:只有同时满足“元素类型匹配”且“具备对应 data-v-{hash} 属性”的 DOM 节点,才会被该样式规则命中。

实践建议

  • 所有组件的 <style> 标签均应显式声明 scoped 属性;
  • 若确需穿透作用于子组件(如第三方 UI 库),可使用 >>>/deep/ 深度选择器(Vue 2 支持),但须谨慎评估封装性影响;
  • 避免在 scoped 样式中过度依赖元素选择器(如 div),优先使用类名(如 .card)提升可读性与可维护性。

逻辑层面的数据定义:data 必须为函数

在 Vue 2 中,组件的 data 选项必须声明为一个函数,而非直接的对象字面量。这是 Vue 2 对组件实例化机制的关键约束,具有严格的语义和运行时保障意义。

该规范适用于所有可复用的组件(即通过 Vue.component 全局注册或在 components 选项中局部注册的组件),不适用于根实例(new Vue({}))。

正确写法:data 作为返回对象的函数

1
2
3
4
5
6
7
8
export default {
name: 'Counter',
data() {
return {
count: 999
}
}
}

说明data 函数在每次创建组件新实例时被调用一次,其返回值作为该实例的初始数据对象。

错误写法:data 直接赋值为对象

1
2
3
4
5
6
// ❌ 违反规范,将导致运行时错误
export default {
data: {
count: 999
}
}

Vue 2 在开发模式下会立即抛出警告:

1
[Vue warn]: The "data" option should be a function that returns a per-instance object in component definitions.

生产环境中虽可能静默降级,但行为不可预测,严禁采用

保证组件实例间数据隔离

问题背景:对象引用共享风险

JavaScript 中对象为引用类型。若 data 为静态对象,则所有组件实例将共享同一份内存地址的数据对象。任一实例修改属性,其余实例同步响应,破坏封装性与可预测性。

解决方案:函数式数据初始化

data 函数确保每次实例化均执行一次,生成全新且独立的数据对象。其本质是利用函数作用域与闭包机制,实现数据实例级隔离。

执行流程如下:

  1. 创建第一个组件实例 → 调用 data() 函数 → 返回 { count: 999 } 对象 A
  2. 创建第二个组件实例 → 再次调用 data() 函数 → 返回 { count: 999 } 对象 B
  3. 创建第三个组件实例 → 第三次调用 data() 函数 → 返回 { count: 999 } 对象 C

关键结论:对象 A、B、C 在内存中互不关联,修改 A.count 不影响 B.countC.count

实例验证:多实例独立性演示

假设在 App.vue 中三次使用 <Counter /> 组件:

1
2
3
4
5
6
7
<template>
<div>
<Counter />
<Counter />
<Counter />
</div>
</template>
  • 每个 <Counter /> 实例均拥有独立的 count 属性;
  • 点击第一个组件的“+”按钮,仅增加其自身 count 值;
  • 其他两个组件的 count 值保持不变;
  • 控制台可验证 data() 函数被精确调用三次(可通过 console.log('data executed') 辅助确认)。

此行为符合组件化设计原则:高内聚、低耦合、可复用、状态隔离

使用方式:语法兼容性与一致性

尽管 data 必须为函数,但其内部数据的访问与操作方式与 Vue 2 中其他响应式数据完全一致。

【1】模板中渲染数据

1
2
3
<template>
<span>{{ count }}</span>
</template>

说明:双花括号语法 {{ count }} 的解析逻辑不受 data 是否为函数影响,仍基于当前实例的响应式数据代理。

【2】事件处理器中修改数据

1
2
3
4
5
6
7
<template>
<div>
<button @click="count++">+</button>
<span>{{ count }}</span>
<button @click="count--">−</button>
</div>
</template>

说明count++count-- 直接操作实例数据属性,响应式系统自动触发视图更新,语法与此前对象写法完全一致。

总结

  • 核心规则:Vue 2 中,组件的 data 选项必须是一个函数,该函数返回一个包含初始数据属性的对象。
  • 设计目的:确保每个组件实例拥有独立的数据副本,避免多实例间状态污染,保障组件封装性与可复用性。
  • 使用一致性data 函数的引入仅改变定义方式,不影响模板渲染、事件处理、计算属性等所有后续数据操作语法。
  • 工程实践:开发中应将 data 函数视为组件定义的必需结构,配合 Vue CLI 或 IDE 插件进行静态检查,杜绝对象字面量误用。

遵循此规范,是构建健壮、可维护 Vue 2 应用的基础前提。