1️⃣ 组件

Vue 的组件可以理解为预先定义好行为的 ViewModel 类,一个组件可以预定义很多选项,但是最核心的就是以下几个:
因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

  1. 1. **模板( template ):** 模板声明了数据和最终展现给用户的 DOM 之间的映射关系。
  2. 2. **初始数据( data ):**一个组件的初始数状态。对于可复用的组件来说,通常是私有状态。
  3. 3. **接受的外部参数( props ):**组件之间通过参数来进行数据的传递和共享。参数默认是单向绑定( 由上至下 ),但也可以显式声明为双向绑定。
  4. 4. **方法( methods ):** 对数据的改动操作一般都在组件的方法内进行。可以通过 v-on 指令将用户输入和组件方法进行绑定。
  5. 5. **生命周期钩子函数( lifecycle hooks ):** 一个组件会触发多个生命周期钩子函数,在这些钩子函数中,我们可以封装一些自定义的逻辑。

1️⃣ 基本规则和使用

2️⃣ 组件名

定义组件名的方式有两种:

  1. 1. 第一种:使用 kebab-case (横短线分隔命名)
  2. 1. 当使用 kebab-case 定义一个组件时,你必须在引用这个自定义元素时使用 kebab-case,例如:<my-component></my-component>。
  3. 2. 第二种:使用 PascalCase (大驼峰命名)
  4. 1. 当使用 PascalCase 定义一个组件时,你在引用这个自定义元素时两种命名法都可以。也就是说<my-component-name> <MyComponentName> 都是可接受的。注意,尽管如此,直接在 DOM (即字符串模板或单文件组件) 中使用时只有 kebab-case 是有效的。

另:在 DOM 中强烈推荐遵循 W3C 规范中的自定义组件名 (字母全小写且必须包含一个连字符)。这会帮助你避免和当前以及未来的 HTML 元素相冲突。

  1. <div id="app">
  2. <my-component></my-component>
  3. </div>
  1. Vue.component('my-component', {
  2. data() {
  3. return {
  4. }
  5. },
  6. template: '<h1>My-Component - 组件</h1>'
  7. })

2️⃣ 组件的 data 选项

当定义一个组件时 data 必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝

  1. function data() {
  2. return {
  3. a: 10,
  4. b: 20,
  5. };
  6. }
  7. let v1 = data();
  8. let v2 = data();
  9. console.log(v1); // {a: 10, b: 20}
  10. console.log(v2); // {a: 10, b: 20}
  11. v1.a = 100;
  12. v1.b = 200;
  13. console.log(v1); // {a: 100, b: 200}
  14. console.log(v2); // {a: 10, b: 20}
  1. Vue.component('my-component', {
  2. data() {
  3. return {
  4. }
  5. },
  6. template: '<h1>My-Component - 组件</h1>'
  7. })

2️⃣ 单个根元素

Vue2.x 每个组件只能有一个跟元素 Vue3.x 可以有多个跟元素

  1. Vue.component('my-component', {
  2. data() {
  3. return {
  4. }
  5. },
  6. // 只能有一个跟元素
  7. template:
  8. `<div>
  9. ......
  10. </div>`
  11. })