【Vue】vue中的mixin混入

Vue中的mixin混入

文章目录

  • Vue中的mixin混入
      • 简介
      • 功能
      • mixin存在的问题
      • 混入特性
      • 总结
    • 部分特性详解
      • 定义混入
      • 使用混入两种方法
      • 组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,在发生冲突时以组件优先。
      • 同名生命周期钩子将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。
      • 使用Mixin混入方法

简介

混入(mixin)提供了一种非常灵活的方式,来分发 Vue
组件中的可复用功能。一个混入对象可以包含任意组件选项(如data、methods、mounted等等)。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

功能

可以把多个组件共用的配置提取成一个混入对象

可以理解是:Vue.mixin给我们提供了一种混入Vue实例的方法,创建了混入对象之后,我们自定义的方法或者变量可以很轻松的挂载在Vue实例上,给我们的偷懒带来方便;

mixin存在的问题

  • 变量来源不明,不利于代码的阅读;
  • 使用多个Mixin可能会造成命名冲突;
  • Mixin和组件可能会出现多对多关系,复杂度较高;

混入特性

mixin可以定义公用的变量或方法,但是mixin中的数据是不共享的,也就是每个组件中的mixin实例都是不一样的,都是单独存在的个体,不存在相互影响的;
mixin混入对象值为函数(例如:beforeCreate,created,beforeMount,mounted,beforeUpdate,updated,beforeDestroy,destroyed)的同名函数选项将会进行递归合并为数组,两个函数都会执行,只不过先执行mixin中的同名函数;
mixin混入对象值为对象(例如:props,data,methods,components)的同名对象将会进行替换,都优先执行组件内的同名对象,也就是组件内的同名对象将mixin混入对象的同名对象进行覆盖

总结

mixin: 将多个组件相同的逻辑,抽离出来复用;

使用mixin混入data: 组件 data 优先级高于 mixin混入的 data;

使用mixin混入钩子: 先执行 mixin的钩子,再执行组件里的钩子;

使用mixin混入方法: 组件 methods方法 优先级高于 mixin混入的 methods方法;

使用mixin混入自定义属性: 组件自定义属性优先级高于 mixin混入的 自定义属性;

修改优先级: 配置app.config,使用optionMergeStrategies属性修改优先级;

局部mixin: 局部Mixin和局部组件的用法类似,局部mixin在使用时,需要使用mixins声明;

全局mixin: 全局mixin类似于全局组件,默认注入每一个组件里,直接可用;

部分特性详解

定义混入

const mixin = {
    data(){....},
    methods:{....}

}

使用混入两种方法

全局混入:Vue.mixin(xxx)

举个栗子

import mixin from './mixins';
Vue.mixin(mixin)

局部混入:mixins:[‘xxx’]

组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,在发生冲突时以组件优先。

var mixin = {
	data: function () {
		return {
    		message: 'hello',
            name: 'abc'
    	}
  	}
}

new Vue({
  	mixins: [mixin],
  	data () {
    	return {
      		message: 'minxxxxxxx',
            top: 'asd'
    	}
    },
  	created () {
    	console.log(this.$data)
    	// log{ message: "minxxxxxxx", name: "abc", top: "def" }
  	}
})

结论:组件 data 优先级高于 Mixin 混入的 data

同名生命周期钩子将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用。

var mixin = {
  	created () {
    	console.log('混入对象的钩子被调用')
  	}
}

new Vue({
  	mixins: [mixin],
  	created () {
    	console.log('组件钩子被调用')
  	}
})

// => "混入对象的钩子被调用"
// => "组件钩子被调用"

结论:先执行 Mixin 的钩子,再执行组件里的钩子

使用Mixin混入方法

var mixin = {
      methods:{
                handleClick(){
                    console.log("mixin handleClick");
                }
            },
}

new Vue({
  	mixins: [mixin],

    methods:{
        handleClick(){
            console.log("handleClick");
        }
    },
})

// => "handleClick"


结论:组件 methods方法 优先级高于 Mixin 混入的 methods方法

你可能感兴趣的:(vue,javascript,vue.js,javascript,前端)