Vue组件

组件

Vue 组件是 Vue.js 框架中的核心概念之一,它是构建用户界面的可复用模块。Vue 组件是一个自包含的、独立的代码单元,可以封装应用程序的特定功能或界面元素。每个组件都有自己的状态、模板、方法和样式,它们可以嵌套在其他组件中,以构建复杂的用户界面。

以下是关于 Vue 组件的一些重要特点和概念:

  1. 封装性:Vue 组件具有封装性,每个组件都可以包含自己的状态(数据)和行为(方法)。这使得代码更易于维护,因为每个组件只关注自己的功能。

  2. 复用性:组件可以在应用程序中的多个地方复用。这意味着你可以编写一次组件,并在不同的页面或视图中多次使用它,以实现一致的功能和外观。

  3. 独立性:每个组件都是独立的,它们不会干扰或影响其他组件。这使得并行开发和测试变得更容易。

  4. 响应式:Vue 组件中的数据和视图之间建立了响应式的关系。当组件的数据发生变化时,相关的视图会自动更新,无需手动操作。

  5. 单文件组件:Vue 允许你使用单文件组件(以 .vue 扩展名结尾)来组织组件的代码、模板和样式。这种方式将组件的结构更清晰地组织在一个文件中。

  6. 生命周期钩子:Vue 组件具有生命周期钩子函数,你可以在组件的不同生命周期阶段执行自定义逻辑,例如在组件创建、更新或销毁时。

  7. 自定义事件:组件之间可以通过自定义事件进行通信。一个组件可以触发事件,而另一个组件可以监听并响应这些事件,实现组件之间的交互和通信。

总之,Vue 组件是 Vue.js 中的核心概念,它们有助于构建复杂的用户界面和应用程序,使代码更易于管理、维护和扩展。组件化开发是现代前端开发的一种重要方法,它有助于提高代码的可重用性和可维护性。

代码示例

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
<html>
<head>
<title>vue 入门</title>
<script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
</head>

<body>
<div id="root" > {{message}} </div>
</body>

<script>
//定义helloword组件
const helloword = {
//data函数
data() {
return {
message: 'helloword!'
};
}
}

//创建vue对象挂载到html元素上
const app=Vue.createApp(helloword);
//挂载到具体html元素之上
app.mount('#root');
</script>
</html>

代码解析

  • {{message}}:这是 Vue.js 的模板语法。双大括号 {{}}`中的内容表示插值表达式,它会在页面渲染时被替换为 Vue 数据对象中对应属性的值。 - `const helloworld`:这是一个常量(变量不可重新赋值)的声明。在这里,我们将一个对象赋值给 `helloworld` 变量,该对象包含了组件的配置选项。Vue 组件通常以这种方式定义。 - 对象包含一个属性 `data`:这个属性是一个函数,用于返回组件的数据。在 Vue 组件中,`data` 函数返回一个包含组件数据的对象。在这个例子中,我们定义了一个名为 `message` 的数据属性,它的初始值是 `'helloworld!'`。 - `data()` 函数:Vue 组件的 `data` 属性是一个函数,而不是一个普通的对象。这是因为 Vue.js 3.x 引入了更严格的响应式系统。通过将数据定义在一个函数内,Vue 能够更好地跟踪和管理组件的状态。 - 总结来说,这段代码定义了一个 Vue 组件 `helloworld`,该组件包含一个数据属性 `message`,初始值为 `'helloworld!'`。你可以在组件的模板中使用 `{{ message }} 来显示这个数据属性的值。这是 Vue 组件的基本结构,你可以进一步在该组件中定义模板、方法、计算属性等,以构建更复杂的用户界面和交互逻辑。

DOM选择器

在 Vue.js 中,mount() 方法用于将 Vue 应用实例挂载(绑定)到一个特定的 DOM 元素上。你可以使用不同类型的选择器来指定要挂载到的元素,这取决于你想在页面的哪个位置渲染 Vue 应用。

以下是一些常见的选择器类型:

  • ID 选择器:使用 # 符号后跟元素的 ID,以选择页面上具有特定 ID 的元素。例如,#app 选择器会选择具有 “app” ID 的元素。

    1
    app.mount('#app');
  • 类名选择器:使用 . 符号后跟元素的类名,以选择页面上具有特定类名的元素。例如,.my-component 选择器会选择所有具有 “my-component” 类名的元素。

    1
    app.mount('.my-component');
  • 元素选择器:使用元素名称,以选择页面上的特定 HTML 元素类型。例如,div 选择器会选择所有 <div> 元素。

    1
    app.mount('div');
  • 标签选择器:使用标签名称(例如,bodyph1 等)来选择页面上的元素。这类似于元素选择器,但只匹配指定的 HTML 标签。

    1
    app.mount('body');
  • 属性选择器:使用元素的属性来选择页面上的元素。例如,[data-app] 选择器可以选择具有 data-app 属性的元素。

    1
    app.mount('[data-app]');

Vue.createApp

Vue.createApp 是 Vue.js 3.x 中的一个方法,用于创建一个 Vue 应用实例。这个方法接受一个包含应用程序配置选项的对象,并返回一个代表 Vue 应用的实例,你可以使用这个实例来配置和管理你的应用。

下面是 Vue.createApp 的基本用法:

1
2
3
const app = Vue.createApp({
// 应用程序的配置选项
});

在上面的示例中,app 是一个变量,它引用了通过 Vue.createApp 创建的 Vue 应用实例。你可以将应用程序的配置选项放在大括号内,以定义你的应用程序的行为、数据和方法等。

通常,配置选项包括以下一些常见属性:

  • data:用于定义应用程序的响应式数据。
  • methods:包含应用程序的方法。
  • computed:包含计算属性。
  • watch:包含监视属性变化的逻辑。
  • template:定义应用程序的模板,如果不在组件内部使用单文件组件。

例如,以下是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const app = Vue.createApp({
data() {
return {
message: 'Hello, Vue!'
};
},
methods: {
greet() {
alert(this.message);
}
}
});

app.mount('#app');

在这个示例中,我们创建了一个 Vue 应用实例,并定义了一个包含数据属性 message 和方法 greet 的配置选项。最后,我们使用 app.mount('#app') 将应用挂载到具有 id 为 “app” 的 DOM 元素上。

组件对象

Vue 组件的常用对象选项包括以下几个:

  1. data

    • data 选项用于定义组件的数据属性。
    • 这些数据属性可以在组件的模板中使用,并可以通过双向数据绑定实时更新视图。
    • 示例:data() { return { message: 'Hello, Vue!' }; }
  2. computed

    • computed 选项用于定义计算属性。
    • 计算属性是基于数据属性计算的属性,它们的值会自动更新,只要相关的依赖数据发生变化。
    • 示例:computed: { computedProperty() { return this.message.toUpperCase(); } }
  3. methods

    • methods 选项用于定义组件的方法。
    • 这些方法可以在模板中调用,用于处理用户交互、触发事件等。
    • 示例:methods: { greet() { console.log('Hello, Vue!'); } }
  4. watch

    • watch 选项用于监听数据属性的变化,并在数据变化时执行相应的操作。
    • 通常用于异步操作、复杂计算或依赖多个数据属性的情况。
    • 示例:watch: { message(newValue, oldValue) { console.log('Message changed:', newValue); } }
  5. props

    • props 选项用于接收父组件传递的属性。
    • 父组件可以通过属性绑定将数据传递给子组件。
    • 示例:props: ['propName']
  6. template

    • template 选项用于定义组件的模板。
    • 模板包含HTML结构和Vue指令,用于渲染组件的界面。
    • 示例:template: '<div><p>{{ message }}</p></div>'
  7. components

    • components 选项用于注册子组件,使其在当前组件的模板中可用。
    • 示例:components: { 'my-component': MyComponent }
  8. mounted

    • mounted 钩子函数在组件被挂载到DOM后调用,用于执行一些初始化操作。
    • 示例:mounted() { console.log('Component mounted'); }

这些选项用于配置组件的不同方面,包括数据、计算属性、方法、模板、生命周期钩子等。组合使用这些选项可以创建具有丰富功能和交互性的Vue组件。

data

在 Vue.js 中,data 函数是组件选项之一,用于定义组件的响应式数据。这个函数返回一个包含组件数据属性的对象。以下是关于 data 函数的用法的详细介绍:

1
2
3
4
5
6
7
const app = Vue.createApp({
data() {
return {
message: 'Hello, Vue!'
};
}
});

在上述示例中,data 函数被定义为组件的一个选项,并返回包含一个名为 message 的数据属性的对象。message 数据属性将成为组件的一个响应式属性,它的值可以在模板中使用并会在数据变化时自动更新视图。

响应式数据

通过 data 函数定义的属性会变成组件的响应式数据。这意味着如果你修改了 message 的值,相关的视图会自动重新渲染以反映这些变化。这是 Vue.js 的核心特性之一。

函数形式

data 必须以函数形式定义,而不是直接使用一个对象。这是因为 Vue 3.x 引入了更严格的响应式系统。使用函数形式有助于确保每个组件实例都有自己的数据副本,避免数据共享问题。

访问数据

你可以通过 this 关键字在组件的方法、计算属性和模板中访问 data 中的属性。例如,this.message 将访问 message 属性的当前值。

初始化数据

data 函数用于初始化组件的数据。你可以在其中定义任何你需要的数据属性,例如字符串、数字、数组、对象等等,以供组件使用。

动态数据

你可以随时在组件中修改 data 中的属性,Vue.js 将负责确保这些更改被追踪并更新视图。

总之,data 函数是 Vue 组件中用于定义响应式数据的重要选项。它使你能够将数据与视图关联起来,实现动态和交互性的用户界面。在编写 Vue 组件时,经常需要使用 data 函数来定义和管理组件的状态。

methods

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
33
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue methods</title>
<script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
</head>
<body>
<div id="app" class="demo"></div>

<script>
const app = Vue.createApp({
data() {
return { count: 4 }
},
methods: {
increment() {
// `this` 指向该组件实例
this.count++
}
}
})

const vm = app.mount('#app')

document.write(vm.count) // => 4
document.write("<br>")
vm.increment()

document.write(vm.count) // => 5
</script>
</body>
</html>
  • methods 中定义了一个 increment 方法,该方法用于递增 count 的值。

  • 之后,使用 document.write 输出了 vm.count 的值。vm.count 表示 Vue 应用实例中的 count 数据属性的值。最初的输出是 4,然后调用 vm.increment() 方法递增了 count 的值,所以第二次输出是 5。

父组件与子组件

在 Vue 3 中,使用 createApp() 方法创建一个 Vue 应用实例时,确实会有一个默认的根组件(父组件)。这个默认的根组件是 Vue 3 应用的最顶层组件,它包裹了整个应用的内容,并提供了应用的入口点。

这个默认的根组件通常不需要显式地定义,因为 Vue 3 应用的整体结构就是基于这个根组件构建的。您可以在根组件中挂载其他组件、定义全局指令、注册全局组件等。

示例中的代码就是一个典型的 Vue 3 应用的结构,其中 app 是通过 createApp() 创建的默认根组件,然后通过 app.component() 方法注册了一个名为 button-counter 的全局子组件,以及使用 app.mount('#app') 方法将根组件挂载到具有 id 为 “app” 的 HTML 元素上。

这个默认的根组件可以视为整个应用的容器,它包含了其他组件,并负责管理整个 Vue 应用的生命周期。在通常情况下,大部分 Vue 3 应用不需要显式定义根组件,而是直接通过 createApp() 创建根实例即可。

全局与局部组件

在 Vue 3 中,您可以创建两种类型的组件:全局组件和局部组件。这两种组件有不同的作用范围和注册方式:

全局组件

  • 全局组件是在整个 Vue 应用程序中都可用的组件。
  • 一旦注册为全局组件,您可以在任何地方使用它,包括模板、组件以及其他全局组件中。
  • 全局组件通常用于需要在多个组件之间共享的通用功能或UI元素。

注册全局组件的方式

1
2
3
4
5
6
const app = Vue.createApp({...})

app.component('my-component-name', {
/* ... */
})

全局组件案例

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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 全局组件</title>
<script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
</head>
<body>
<div id="app">
<runoob></runoob>
</div>

<script>

// 创建一个Vue 应用
const app = Vue.createApp({})

// 定义一个名为 runoob 的新全局组件
app.component('runoob', {
template: '<h1>全局组件!</h1>'
})

app.mount('#app')
</script>
</body>
</html>

局部组件

  • 局部组件只在其父组件的范围内可用,不能在其他组件中直接使用。
  • 局部组件通常用于构建特定页面或组件的一部分,以提高组件的封装性和可维护性。

注册局部组件的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//定义组件
const ComponentA = {
/* ... */
}
const ComponentB = {
/* ... */
}
const ComponentC = {
/* ... */
}


//引用组件
const app = Vue.createApp({
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})

局部组件案例

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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 局部组件</title>
<script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
</head>
<body>
<div id="app">
<local-component></local-component>
</div>
<script>

const localComponent= {
template: '<h1>局部组件</h1>'
}

const app=Vue.createApp({
components: {
'local-component': localComponent
}
})

app.mount('#app')

</script>
</body>
</html>

总结:

  • 全局组件通过 app.component 方法在应用程序实例上注册,可在整个应用中使用。
  • 局部组件通过在父组件的 components 选项中注册,只能在父组件的范围内使用。
  • 通常,全局组件用于通用功能或UI元素,而局部组件用于构建特定页面或组件的一部分,以提高组件的封装性和可维护性。
  • 使用适当的组件范围可以帮助管理复杂应用程序中的组件命名空间,减少组件之间的冲突。

参考资料