vue的extend和mixin和mixins

238 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

extend 是vue构造一个子类的实例构造器,通俗的讲也可以把这个方法当成一个扩展组件的方法,但是比较特殊的事,用这个方式扩展的组件不再vue的实例内部,而是在外部,需要我们自己把扩展出来的组件,挂在到你想你想的地方去

简单用法

// tep.vue

<template>
  <div>{{text}}</div>
</template>
<script>
export default {
  name: 'hello',
  data () {
    return {
      text: ''
    }
  }
}
</script>

// a.js

import Vue from 'vue';
import HelloTemplate from './tep.vue';

// 使用extend方法创建vue的子类
const HelloConstructor = Vue.extend(HelloTemplate);

// 使用这个方法调用hello组件
function Hello(options) {
  options = options || {};
  if (typeof options === 'string') {
    options = {
      text: options
    }
  }
  
  // 实例化子组件,
  const helloInstence = new HelloConstructor({data: options});
  // 方式一挂在到body伤
    helloInstence.vm = helloInstence.$mount();
  console.log(helloInstence.vm)
  document.body.appendChild(helloInstence.vm.$el);
  // 方式2 用$mount()挂载到对应节点上
  
 helloInstence.$mount("#app")
}
export default Hello;

最后有两种方式挂载到目标节点

  1. 拿到组件的dom节点 自己追加到body上 像我上面的例子
  2. 用vue自带的 $mount()方法,把id或者class名以参数的形式传到函数里 这两种方式 都不能挂载到vue根节点的子节点 如果你挂载到子节点 会直接替换掉的vue你之前设置的实例

mixin 是全局注册一个混入,一般都是在vue的插件中进行一会混入操作,把插件混入到vue的实例中,方便其他开发者调用 mixin方式需要传入一个对像 里面也是有相对应的钩子函数的 beforeCreate,create,等钩子函数 mixin简单的使用方式

vue.mixin({
  beforeCreate: ()=>{},
  create: () =>{}
}) 

// 实现vue插件的方式

a.install = function(_Vue) {
  Vue = _Vue;
  Vue.mixin({
    //
    beforeCreate: function () { 
     // 写入逻辑你自己的方法和属性
     // 全局实例就可以都用了
    }
})
}

mixin和extend在vue实现全局插件的方式上有所不同,但是结果是一样的,使用方式也不一样。

在实现插件上也可以用extend

还是以tep.vue为例 // a.js

import tep from './tep.vue'
prompt.install = function (Vue) {
    const promptConstructor = Vue.extend(tep)
    // 生成一个该子类的实例
     instance = new promptConstructor();
     // 把组件就直接挂到了body
     document.body.appendChild( instance.$mount().$el)
}
return prompt

调用 // main.js

import vue from 'vue'
improt prompt from './a.js'
// 上面的写的逻辑就生效
vue.use(prompt)

大体思路是这样的

mixins 是混入一个对象

这个对象可以包含vue组件用到所有钩子函数如:crate,beforeCreate,beoforeMount,mounted,beforeUpdata,updata,destory,beforedestory,metdods,data,fifter,等方法,回和你当前混入的组件的options进行一个合并,同一个钩子函数会合并成一个数组依次调用,如果是methods里有相同的见键名当前组件键名会直接覆盖mixins里面的键名 // 简单用法

export default {
  data: function() {
     return {}
  },
  create() {
    console.log("1111")
  },
  methods: {
     a: function() {
        consoe.log(“我会被覆盖”)
     }
  },
}

// 混入mixins

import a from './a.js'
export default {
   mixins: [a],
   create() {
      consoe.log(“2222”)
   },
   methods() {
     a: function() {
         consoe.log(“我要覆盖”)
     }
   }
}

// 组件执行 先打印 111 在打印 222 被混入的methods的a方法覆盖之前的方法,data里的数据也是可以公用的,

mixins 方便之处就是大家可以一些公共方法和一些公共的数据都放在一起,会减少大量的工作量