[TOC]

1. 认识组件化

1.1 什么是组件化

人面对复杂问题的处理方式:
任何一个人处理信息的逻辑能力都是有限的。所以,当面对一个非常复杂的问题时,我们不太可能一次性搞定一大堆的内容。但是,我们人有一种天生的能力,就是将问题进行拆解。如果将一个复杂的问题,拆分成很多个可以处理的小问题,再将其放在整体当中,你会发现大的问题也会迎刃而解。
我们将一个完整的页面分成很多个组件。每个组件都用于实现页面的一个功能块。而每一个组件又可以进行细分。

1.1 Vue组件化思想

组件化是Vue.js中的重要思想。它提供了一种抽象,让我们可以开发出一个个独立可复用的小组件来构造我们的应用。任何的应用都会被抽象成一颗组件树。

组件化思想的应用:
有了组件化的思想,我们在之后的开发中就要充分的利用它。尽可能的将页面拆分成一个个小的、可复用的组件。这样让我们的代码更加方便组织和管理,并且扩展性也更强。 所以,组件是Vue开发中,非常重要的一个篇章,要认真学习。

2. 组件化基础

2.1 注册组件

组件的使用分成三个步骤:

  • 创建组件构造器
  • 注册组件
  • 使用组件。

image.png

<div id="app">
  <!--3.使用组件-->
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>
  <my-cpn></my-cpn>

  <div>
    <div>
      <my-cpn></my-cpn>
    </div>
  </div>
</div>

<my-cpn></my-cpn>

<script src="../js/vue.js"></script>
<script>
  // 1.创建组件构造器对象
  const cpnC = Vue.extend({
    template: `
      <div>
        <h2>我是标题</h2>
        <p>我是内容, 哈哈哈哈</p>
        <p>我是内容, 呵呵呵呵</p>
      </div>`
  })

  // 2.注册组件
  Vue.component('my-cpn', cpnC)

  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊'
    }
  })
</script>

2.2 全局组件和局部组件

  • 当我们通过调用Vue.component()注册组件时,组件的注册是全局的。这意味着该组件可以在任意Vue示例下使用。
  • 如果我们注册的组件是挂载在某个实例中, 那么就是一个局部组件 ```vue
``` ### 2.3 父组件和子组件 组件和组件之间存在层级关系,而其中一种非常重要的关系就是父子组件的关系 ```vue
``` ### 2.4 注册组件语法糖 在上面注册组件的方式,可能会有些繁琐。Vue为了简化这个过程,提供了注册的语法糖。主要是省去了调用Vue.extend()的步骤,而是可以直接使用一个对象来代替。 ```vue ``` ### 2.5 模板的分离写法 Vue提供了两种方案来定义HTML模块内容: ①使用
<a name="QIDAZ"></a>
### 2.6 组件数据的存放
组件自己的数据存放在哪里呢<br />组件对象也有一个data属性(也可以有methods等属性<br />只是这个data属性必须是一个函数。而且这个函数返回一个对象,对象内部保存着数据

为什么data在组件中必须是一个函数呢? <br />首先,如果不是一个函数,Vue直接就会报错。其次,原因是在于Vue让每个组件对象都返回一个新的对象,因为如果是同一个对象的,组件在多次使用后会相互影响。 <br />因此复用组件时,都有自己的data属性,不相互影响
```vue
<div id="app">
  <cpn></cpn>
  <cpn></cpn>
  <cpn></cpn>
</div>
<template id="cpn">
  <div>
    <h2>{{title}}</h2>
    <p>我是内容,呵呵呵</p>
  </div>
</template>

<script src="../js/vue.js"></script>
<script>

  // 1.注册一个全局组件
  Vue.component('cpn', {
    template: '#cpn',
    data() {
      return {
        title: 'abc'
      }
    }
  })

  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      // title: '我是标题'
    }
  })
</script>

2.2 数据传递

3. 组件化高级

3.1 插槽slot

3.2 动态组件

3.3 异步组件

4. 组件声明周期