zoukankan      html  css  js  c++  java
  • vue 扩展现有组件的方法

    1. 使用vue.mixin全局混入

    混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。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]//混入
            })
    

    输出的结果

    mixins的调用顺序

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

    2.使用extends 扩展

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

    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// 接收对象和函数
            })
    

    结果

    执行的先后顺序和mixins一样,另外扩展的方法与原生的冲突时,扩展的方法不生效,这点跟混入一样

    ps extends和mixins优先级比较

    相对于mixins,extends触发的优先级更高

    3.加slot扩展

    .默认插槽和匿名插槽

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

    <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>
    

    具名插槽

    有些时候我们需要多个插槽, 元素有一个特殊的特性: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'
           }
        }
     });    
    
  • 相关阅读:
    iOS必备知识点
    stringByReplacingOccurrencesOfString
    iPhone X 设计适配指南 & iOS 11 新特性
    block与property
    swift开发笔记04
    category重写系统方法的调用顺序是怎么样的?
    Error: Chunk.entry was removed. Use hasRuntime()错误解决
    李阳音标速成MP3文本
    JavaScript权威指南(第6版)(中文版)笔记
    Idea检入boss项目
  • 原文地址:https://www.cnblogs.com/whkl-m/p/12888502.html
Copyright © 2011-2022 走看看