当前位置:Gxlcms > JavaScript > 详解Vue2.0组件的继承与扩展

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

时间:2021-07-01 10:21:17 帮助过:12人阅读

前言

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

一、slot

1.默认插槽和匿名插槽

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

  1. <body>
  2. <div id="itany">
  3. <my-hello>180812</my-hello>
  4. </div>
  5. <template id="hello">
  6. <div>
  7. <h3>welcome to xiamen</h3>
  8. <slot>如果没有原内容,则显示该内容</slot>// 默认插槽
  9. </div>
  10. </template>
  11. <script>
  12. var vm=new Vue({
  13. el:'#itany',
  14. components:{
  15. 'my-hello':{
  16. template:'#hello'
  17. }
  18. }
  19. });
  20. </script>

2.具名插槽

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

  1. <div id="itany">
  2. <my-hello>
  3. <ul slot="s1">
  4. <li>aaa</li>
  5. <li>bbb</li>
  6. <li>ccc</li>
  7. </ul>
  8. <ol slot="s2">
  9. <li>111</li>
  10. <li>222</li>
  11. <li>333</li>
  12. </ol>
  13. </my-hello>
  14. </div>
  15. <template id="hello">
  16. <div>
  17. <slot name="s2"></slot>
  18. <h3>welcome to xiamen</h3>
  19. <slot name="s1"></slot>
  20. </div>
  21. </template>
  22. <script>
  23. var vm=new Vue({
  24. el:'#itany',
  25. components:{
  26. 'my-hello':{
  27. template:'#hello'
  28. }
  29. }
  30. });
  31. </script>

二、mixins

1.mixins简介

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

2.mixins用途

一般有两种用途:

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

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

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

  1. <h1>Mixins</h1>
  2. <hr>
  3. <div id="app">
  4. <p>num:{{ num }}</p>
  5. <P>
  6. <button @click="add">增加数量<tton>
  7. </P>
  8. </div>
  9. <script type="text/javascript">
  10. var addLog = { //额外临时加入时,用于显示日志
  11. updated: function () {
  12. console.log("数据发生变化,变化成" + this.num + ".");
  13. }
  14. }
  15. Vue.mixin({// 全局注册一个混入,影响注册之后所有创建的每个 Vue 实例
  16. updated: function () {
  17. console.log("我是全局的混入")
  18. }
  19. })
  20. var app = new Vue({
  21. el: '#app',
  22. data: {
  23. num: 1
  24. },
  25. methods: {
  26. add: function () {
  27. this.num++;
  28. }
  29. },
  30. updated() {
  31. console.log("我是原生的update")
  32. },
  33. mixins: [addLog]//混入
  34. })

3.mixins的调用顺序

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

三、extends

1.extends用法

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

  1. <h1>Extends</h1>
  2. <hr>
  3. <div id="app">
  4. num:{{ num }}
  5. <p>
  6. <button @click="add">add</button>
  7. </p>
  8. </div>
  9. <script type="text/javascript">
  10. var bbb = {
  11. updated() {
  12. console.log("我是被扩展出来的");
  13. },
  14. methods: {
  15. add: function () { //跟原生的方法冲突,取原生的方法,这点跟混入一样
  16. console.log('我是被扩展出来的add方法!');
  17. this.num++;
  18. }
  19. }
  20. };
  21. var app = new Vue({
  22. el: '#app',
  23. data: {
  24. num: 1
  25. },
  26. methods: {
  27. add: function () {
  28. console.log('我是原生add方法');
  29. this.num++;
  30. }
  31. },
  32. updated() {
  33. console.log("我是扩展出来的");
  34. },
  35. extends: bbb// 接收对象和函数
  36. })


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

2.extends和mixins优先级比较

  1. var extend={
  2. data:{extendData:'我是extend的data'},
  3. created:function(){
  4. console.log('这是extend的created');
  5. }
  6. }
  7. var mixin={
  8. data:{mixinData:'我是mixin的data'},
  9. created:function(){
  10. console.log('这是mixin的created');
  11. }
  12. }
  13. var vm=new Vue({
  14. el:'#app',
  15. data:{mixinData:'我是vue实例的data'},
  16. created:function(){
  17. console.log('这是vue实例的created');
  18. },
  19. methods:{
  20. getSum:function(){
  21. console.log('这是vue实例里面getSum的方法');
  22. }
  23. },
  24. mixins:[mixin],
  25. extends:extend
  26. })


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

四、extend

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

  1. <div id="itany">
  2. <hello></hello>
  3. <my-world></my-world>
  4. </div>
  5. <script>
  6. /**
  7. * 方式1:先创建组件构造器,然后由组件构造器创建组件
  8. */
  9. //1.使用Vue.extend()创建一个组件构造器
  10. var MyComponent = Vue.extend({
  11. template: '<h3>Hello World</h3>'
  12. });
  13. //2.使用Vue.component(标签名,组件构造器),根据组件构造器来创建组件
  14. Vue.component('hello', MyComponent);
  15. /**
  16. * 方式2:直接创建组件(推荐)
  17. */
  18. // Vue.component('world',{
  19. Vue.component('my-world', {
  20. template: '<h1>你好,世界</h1>'
  21. });
  22. var vm = new Vue({ //这里的vm也是一个组件,称为根组件Root
  23. el: '#itany',
  24. data: {}
  25. });
  26. </script>

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

参考文章

Vue官方文档

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

人气教程排行