zoukankan      html  css  js  c++  java
  • 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和自定义事件等。

      components
      └─ Star.vue
    

    与业务无关的独立组件

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

    组件的编写

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

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

    slot:主要用于组件的扩展。同样是组件开发非常重要的API。

    综上所述:组件开发中有三个非常重要的API,可以戏称为组件开发三要素:prop,eventslot。接下来我们将从组件开发的角度来分别讲述这三个API的使用。并不仅仅是简单的使用。

    属性prop

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

    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,可以更好地帮助我们开发组件。

  • 相关阅读:
    阿里云OSS学习
    spring学习(十二)--spring中WebApplicationInitializer解析
    spring学习(十)--WebApplicationInitializer接口替代web.xml启动spring容器
    tomcat学习(二)--tomcat配置详解
    tomcat学习(一)--tomcat请求过程
    WEB工程中web.xml文件基本配置
    MAVEN学习(九)--利用nexus创建私服供上传下载jar包
    NGINX学习(九)--nginx配置示例
    Django所有ORM总结
    ORM一般操作
  • 原文地址:https://www.cnblogs.com/yinhaiying/p/10985476.html
Copyright © 2011-2022 走看看