详解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无缝滚动代码
Jan 03 Javascript
jquery选择器原理介绍($()使用方法)
Mar 25 Javascript
JQuery标签页效果实例详解
Dec 24 Javascript
详解vue中使用express+fetch获取本地json文件
Oct 10 Javascript
JavaScript实现区块链
Mar 14 Javascript
AngularJS 前台分页实现的示例代码
Jun 07 Javascript
JavaScript实现封闭区域布尔运算的示例代码
Jun 25 Javascript
webstrom Debug 调试vue项目的方法步骤
Jul 17 Javascript
在vue项目中引入vue-beauty操作方法
Feb 11 Javascript
JS字符串与二进制的相互转化实例代码详解
Jun 28 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
Dec 12 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
PHP多进程编程实例详解
2017/07/19 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
php数据序列化测试实例详解
2017/08/12 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
vue实现歌手列表字母排序下拉滚动条侧栏排序实时更新
2019/05/14 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Python loguru日志库之高效输出控制台日志和日志记录
2020/03/07 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
网络技术专业求职信
2014/05/02 职场文书
重阳节标语大全
2014/10/07 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
负责培养人意见
2015/06/05 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB