详解Vue2.0组件的继承与扩展


Posted in Javascript onNovember 23, 2018

前言

本文将介绍vue2.0中的组件的继承与扩展,主要分享slot、mixins/extends和extend的用法。

一、slot

1.默认插槽和匿名插槽

slot用来获取组件中的原内容,此方式用于父组件向子组件传递“标签数据”。有的时候为插槽提供默认的内容是很有用的,例如,一个<my-hello> 组件可能希望这个按钮的默认内容是“如果没有原内容,则显示该内容”,但是同时允许用户覆写为别的内容。

<body>
 <div id="itany">
 <my-hello>180812</my-hello>
 </div>
<template id="hello">
 <div>
 <h3>welcome to xiamen</h3>
 <slot>如果没有原内容,则显示该内容</slot>// 默认插槽
 </div>
</template>
<script>
 var vm=new Vue({
  el:'#itany',
  components:{
  'my-hello':{
  template:'#hello'
 }
  }
 }); 
</script>

详解Vue2.0组件的继承与扩展

2.具名插槽

有些时候我们需要多个插槽,<slot> 元素有一个特殊的特性:name。这个特性可以用来定义额外的插槽:

<div id="itany">
 <my-hello>
  <ul slot="s1">
 <li>aaa</li>
 <li>bbb</li>
 <li>ccc</li>
  </ul>
  <ol slot="s2">
 <li>111</li>
 <li>222</li>
 <li>333</li>
  </ol>
 </my-hello>
</div>
<template id="hello">
 <div>
  <slot name="s2"></slot>
  <h3>welcome to xiamen</h3>
  <slot name="s1"></slot>
 </div>
</template>
<script>
 var vm=new Vue({
 el:'#itany',
 components:{
  'my-hello':{
   template:'#hello'
  }
 }
 }); 
</script>

详解Vue2.0组件的继承与扩展

二、mixins

1.mixins简介

混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。mixins 选项接受一个混合对象的数组。

2.mixins用途

一般有两种用途:

1、在你已经写好了构造器后,需要增加方法或者临时的活动时使用的方法,这时用混入会减少源代码的污染。

2、很多地方都会用到的公用方法,用混入的方法可以减少代码量,实现代码重用。

例如下面的例子:实现每次数据变化时都能够在控制台打印出提示:"数据发生变化"

<h1>Mixins</h1>
 <hr>
 <div id="app">
  <p>num:{{ num }}</p>
  <P>
   <button @click="add">增加数量<tton>
  </P>
 </div>
 <script type="text/javascript">
  var addLog = { //额外临时加入时,用于显示日志
   updated: function () {
    console.log("数据发生变化,变化成" + this.num + ".");
   }
  }
  Vue.mixin({// 全局注册一个混入,影响注册之后所有创建的每个 Vue 实例
   updated: function () {
    console.log("我是全局的混入")
   }
  })
  var app = new Vue({
   el: '#app',
   data: {
    num: 1
   },
   methods: {
    add: function () {
     this.num++;
    }
   },
   updated() {
    console.log("我是原生的update")
   },
   mixins: [addLog]//混入
  })

详解Vue2.0组件的继承与扩展

3.mixins的调用顺序

上例说明了:从执行的先后顺序来说,混入对象的钩子将在组件自身钩子之前调用,如果遇到全局混入(Vue.mixin),全局混入的执行顺序要前于混入和组件里的方法。

三、extends

1.extends用法

extends选项允许声明扩展另一个组件,而无需使用 Vue.extend
通过外部增加对象的形式,对构造器进行扩展。它和混入mixins非常的类似。只不过接收的参数是简单的选项对象或构造函数,所以extends只能单次扩展一个组件。

<h1>Extends</h1>
 <hr>
 <div id="app">
  num:{{ num }}
  <p>
   <button @click="add">add</button>
  </p>
 </div>
 <script type="text/javascript">
  var bbb = {
   updated() {
    console.log("我是被扩展出来的");
   },
   methods: {
    add: function () { //跟原生的方法冲突,取原生的方法,这点跟混入一样
     console.log('我是被扩展出来的add方法!');
     this.num++;
    }
   }
  };
  var app = new Vue({
   el: '#app',
   data: {
    num: 1
   },
   methods: {
    add: function () {
     console.log('我是原生add方法');
     this.num++;
    }
   },
   updated() {
    console.log("我是扩展出来的");
   },
   extends: bbb// 接收对象和函数
  })

详解Vue2.0组件的继承与扩展

从上面的例子也可看出,执行的先后顺序和mixins一样,另外扩展的方法与原生的冲突时,扩展的方法不生效,这点跟混入一样。

2.extends和mixins优先级比较

var extend={
 data:{extendData:'我是extend的data'},
 created:function(){
  console.log('这是extend的created');
 }
 }
 var mixin={
 data:{mixinData:'我是mixin的data'},
 created:function(){
  console.log('这是mixin的created');
 }
 }
 var vm=new Vue({
 el:'#app',
 data:{mixinData:'我是vue实例的data'},
 created:function(){
  console.log('这是vue实例的created');
 },
 methods:{
  getSum:function(){
  console.log('这是vue实例里面getSum的方法');
  }
 },
 mixins:[mixin],
 extends:extend
 })

详解Vue2.0组件的继承与扩展

由此可以得出,相对于mixins,extends触发的优先级更高

四、extend

Vue.extend只是创建一个构造器,它是为了创建可复用的组件。其主要用来服务于Vue.component,用来生成组件

<div id="itany">
  <hello></hello>
  <my-world></my-world>
 </div>
 <script>
  /**
   * 方式1:先创建组件构造器,然后由组件构造器创建组件
   */
  //1.使用Vue.extend()创建一个组件构造器
  var MyComponent = Vue.extend({
   template: '<h3>Hello World</h3>'
  });
  //2.使用Vue.component(标签名,组件构造器),根据组件构造器来创建组件
  Vue.component('hello', MyComponent);
  /**
   * 方式2:直接创建组件(推荐)
   */
  // Vue.component('world',{
  Vue.component('my-world', {
   template: '<h1>你好,世界</h1>'
  });
  var vm = new Vue({ //这里的vm也是一个组件,称为根组件Root
   el: '#itany',
   data: {}
  }); 
 </script>

如果有需要源代码,请猛戳源代码

参考文章

Vue官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js检测客户端不是firefox则提示下载
Apr 07 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
使用jquery实现div的tab切换实例代码
May 27 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
跟我学习javascript的闭包
Nov 16 Javascript
基于javascript实现动态显示当前系统时间
Jan 28 Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 Javascript
JavaScript中关于iframe滚动条的去除和保留
Nov 17 Javascript
在vue.js中抽出公共代码的方法示例
Jun 08 Javascript
9102年webpack4搭建vue项目的方法步骤
Feb 20 Javascript
Vite + React从零开始搭建一个开源组件库
Jun 25 Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 #Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 #Javascript
Vue.js组件间通信方式总结【推荐】
Nov 23 #Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 #Javascript
vue全局使用axios的方法实例详解
Nov 22 #Javascript
vue中的ref和$refs的使用
Nov 22 #Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
Nov 22 #Javascript
You might like
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
PHP学习笔记之二 php入门知识
2011/01/12 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
2011/07/18 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
JS焦点图切换,上下翻转
2011/05/12 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
Jquery的hover方法让鼠标经过li时背景变色
2013/09/06 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
Vue cli+mui 区域滚动的实例代码
2018/01/25 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
Python实现多线程下载文件的代码实例
2014/06/01 Python
浅谈Python单向链表的实现
2015/12/24 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python实现人像动漫化的示例代码
2020/05/17 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
爱情寄语大全
2014/04/09 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
党支部工作总结2015
2015/04/01 职场文书
房租涨价通知
2015/04/23 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技