vue混入和继承

109 阅读1分钟

1.混入mixins

混入非常灵活,它的出现大大的提高了vue代码复用的能力。一个混入对象可以包含任意组件选项。当我们的组件使用这个混入对象时,混入对象的选项会和组件本身的选项进行合并。

var mixin = {  
    data() {  
        return {
            msg: 'hello',  
            count: 0  
        }  
    }
    created: function () {  
        console.log('11111')  
    }
    
}  
  
new Vue({  
    mixins: [mixin],  
    data() {  
        return {  
            msg: 'world',  
            num: 1 
        }  
    },  
    created() {
        console.log(22222)
        console.log(this.$data)  
        // 11111
        // 22222
        // { msg: "world", count: 0, num: 1 }
    }  
})

上面的例子可以看到,组件和混入把选项进行了合并,混入对象的钩子将在组件自身钩子之前调用;名称冲突的以组件的优先。组件引用多个混入时, mixins: [mixin1,mixin2],按顺序执行,即先注册的先执行。 全局混入 全局混入,相当于所有组件都引用了这个混入;即所有组件都会受其影响。

import Vue from "vue";
import App from "./App.vue";
import { mixins } from "./mixin/index";
Vue.mixin(mixins);

Vue.config.productionTip = false;

new Vue({
  render: (h) => h(App),
}).$mount("#app");

2.继承extends

  • extends从代码角度来说,和mixins高度类似;
  • 不同的是mixins接受的是数组,而extends接受的是对象;
  • 继承的优先级高于混入;相当于把extends放在了mixins数组的第一个位置。
  • 最大的不同点,在于它们的意义;mixins用于组合功能,而extends更关注于继承关系
extendsTest = { 
    data() {  
        return {
            msg: 'hello',  
            count: 0  
        }  
    }
    created: function () {  
        console.log('11111')  
    }
}
new Vue({  
    mixins: [mixin], 
    extends:extendsTest,
    data() {  
        return {  
            msg: 'world',  
            num: 1 
        }  
    },  
    created() {
        console.log(22222)
        console.log(this.$data)  
        // 11111
        // 22222
        // { msg: "world", count: 0, num: 1 }
    }  
})

3.mixins缺点及组合式函数

缺点:

  • 命名冲突时,同名会被覆盖(合并选项);
  • 数据来源不清晰(引入多个mixins);
  • 潜在的耦合(合并选项,同享的属性名)

vue3中更推荐使用组合式函数,官网鼠标跟踪器示例:

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

export function useMouse() {
  const x = ref(0)
  const y = ref(0)

  function update(event) {
    x.value = event.pageX
    y.value = event.pageY
  }

  onMounted(() => window.addEventListener('mousemove', update))
  onUnmounted(() => window.removeEventListener('mousemove', update))
  return { x, y }
}

组件中使用

<script setup>
import { useMouse } from './mouse.js'

const { x, y } = useMouse()
</script>

<template>Mouse position is at: {{ x }}, {{ y }}</template>