Vue组件化开发

Vue的组件化

组件化是Vue的精髓,Vue就是由一个一个的组件构成的。Vue的组件化设计到的内容又很是多,当在面试时,被问到:谈一下你对Vue组件化的理解。这时候又有可能无从下手,所以在这里阐释一下我的对Vue的组件化的理解。vue

组件的分类

通常来讲,组件大体能够分为三类:面试

  1. 页面级别的组件。
  2. 业务上可复用的基础组件。
  3. 与业务无关的独立组件。

页面级别的组件

页面级别的组件,一般是pages目录下的.vue组件,是组成整个项目的一个大的页面。通常不会有对外的接口。咱们一般开发时,主要就是编写这种组件。以下所示:pages下面的Home.vue(主页)和About.vue(关于咱们)等都是一个独立的页面,也是一个独立的组件。数组

pages
  ├─ About.vue
  └─ Home.vue

业务上可复用的基础组件

这一类组件一般是在业务中被各个页面复用的组件,这一类组件一般都写到components目录下,而后经过import在各个页面中使用。这一类组件一般是实现某个功能,好比外卖中各个页面都会使用到的评分系统。这个部分就能够实现评分功能,能够写成一个独立的业务组件。好比下面的components中的Star.vue就是一个业务组件。这一类组件的编写一般涉及到组件经常使用的props,slot和自定义事件等。iview

components
  └─ Star.vue

与业务无关的独立组件

这一类组件一般是与业务功能无关的独立组件。这类组件一般是做为基础组件,在各个业务组件或者页面组件中被使用。目前市面上比较流行的ElementUI和iview等中包含的组件都是独立组件。若是是本身定义的独立组件,好比富文本编辑器等,一般写在utils目录中。编辑器

组件的编写

说完了组件的分类,接下来咱们谈一谈组件的编写。要写好一个组件,咱们须要考虑哪些因素。首先一个组件最重要的两个必定是数据事件。另外,组件开发要考虑可扩展性,在vue中组价你的扩展经过slot来实现。
数据主要是指:dataprop。其中data主要是用于组件内部的数据展现,一般是一个函数。而prop是接收外部数据,涉及到数据的校验,数据的扩展等,是很是重要的一个API。函数

事件:组件的事件(event)不一样于在普通元素身上绑定事件。组件事件应该如何触发,是在父组件中触发仍是在组件内部元素身上触发。组件化

slot:主要用于组件的扩展。一样是组件开发很是重要的API。ui

综上所述:组件开发中有三个很是重要的API,能够戏称为组件开发三要素:prop,eventslot。接下来咱们将从组件开发的角度来分别讲述这三个API的使用。并不单单是简单的使用。设计

属性prop

prop定义了组件能够接收哪些可配置的属性。主要是用来接收父组件传递的数据。props接收属性时能够是数组形式,也能够是对象形式。若是不涉及到类型校验或者其余校验能够直接使用数组形式,若是涉及到校验最好使用对象形式。
数组形式:code

props:['name','age']

对象形式: 使用对象的形式,能够对数据的类型,是否必填,以及其余特征进行校验。这对于组件化开发很是有利。
Child.vue定义组件

<template>
  <div class="container">
    姓名:{{name}}
    年龄:{{age}}
    <button :class = "type">点击</button>
  </div>
</template>

<script>
export default {
  name:'Child',
  props:{
    name:{
      type:String,
      require:true
    },
    age:{
      type:Number
    },
    type:{
      //校验: 判断type是不是success,warning和primary之一。
      validator:function(value){
        return (['success','warning','primary'].indexOf(value)) > -1
      }
    }
  }
}
</script>

Parent.vue使用组件

<Child :name = name  :age = age :type = type></Child>

定义组件时,name是String类型且是必填的,age是number类型非必填的。type是必须是success,warning和primary中的某一个。

自定义事件

如何触发组件上定义的事件:
假设如今咱们须要给咱们定义的Child组件添加点击事件:这时候咱们通常是经过在组件内部的button上经过$emit
触发事件,而后在父组件中监听。
在组件中经过$emit定义事件:
Child.vue

<template>
  <div class="container">
    姓名:{{name}}
    年龄:{{age}}
    <!-- 触发事件 -->
    <button @click ="$emit('onClick','自定义事件')" :class = "type">点击</button>
  </div>
</template>

Parent.vue监听事件

<Child @onClick = 'handleClick' :age = age :type = type></Child>

slot

咱们定义的组件一般会被用到各个地方,可是并不必定可以知足全部的使用场景,有时候咱们须要
进行一些功能的扩展。这时候就须要用到slot了。一句话描述slot:就是用来在组件中插入新的内容
好比咱们刚刚定义的Child组件,须要插入一段话。那么这时候就须要用到slot了。
Child.vue中使用slot

<template>
  <div class="container">
    姓名:{{name}}
    年龄:{{age}}
    <button @click ="$emit('onClick','自定义事件')" :class = "type">点击</button>
    <slot></slot>
  </div>
</template>

Parent.vue中扩展功能。插入一段话:

<template>
  <div class="container">
    <Child @onClick = 'handleClick' :age = age :type = type>
      <div>这是经过slot插入的一段话</div>
    </Child>
  </div>
</template>

如上所示:在Child.vue中使用了slot,在Parent.vue中使用CHild时,插入了一段话。
实现了功能的扩展。固然若是须要扩展更多的功能可使用具名插槽,这里就不具体介绍了。

总结:

组件的分类:

  1. 页面级组件
  2. 业务上可复用的基础组件
  3. 与业务无关的独立功能组件

组件开发三要素
prop,自定义事件,slot是组成组件的三个重要因素。

  1. prop用于定义组件的属性。
  2. 自定义事件用于触发组件的事件。
  3. slot用于组件功能的扩展。

经过合理的使用这三个API,能够更好地帮助咱们开发组件。

相关文章
相关标签/搜索