vue 之 mixins 混入

混入mixins

一、基础介绍

什么是mixins?

混入mixins:分发vue组件中可复用功能的灵活方式。
混入对象可以包含任意组件选项。
组件使用混入对象时,所有混入对象的选项将混入该组件本身的选项。

什么时候使用Mixins?

页面的风格不用,但是执行的方法和需要的数据类似,我们可以选择提取出公共部分,使用mixins。

二、使用规则

规则

  1. 选项合并:组件选项和对象选项同名时,将以恰当方式混合。
  2. 数据对象:和组件数据冲突时以组件数据优先。
  3. 同名钩子函数:混合为一个数组,都将被调用,混入对象钩子先调用。
  4. 值为对象选项:methods,components,将被混合为同一个对象,两对象键名冲突时,取组件对象的键值对。

合并(细化)

当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。

一、数据对象内

mixin的数据对象和组件的数据发生冲突时以组件数据优先。

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

new Vue({
  mixins: [mixin],
  data: function () {
    return {
      message: 'goodbye',
      bar: 'def'
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
})
二、值为对象的选项

值为对象的选项,如 methods, components 和 directives,将被混合为同一个对象。两个对象键名冲突时,取组件对象的键值对。

var mixin = {
  methods: {
    foo: function () {
      console.log('foo')
    },
    conflicting: function () {
      console.log('from mixin')
    }
  }
}

var vm = new Vue({
  mixins: [mixin],
  methods: {
    bar: function () {
      console.log('bar')
    },
    conflicting: function () {
      console.log('from self')
    }
  }
})

vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"
三、钩子函数

同名钩子函数将会混合为一个数组,都将被调用到,但是混入对象的钩子将在组件自身钩子之前调用。

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

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

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

三、混入方式

混入方式:全局混入,组件混入

1. 组件混入(局部混入)

使用方式:

  1. 新建mixin.js文件
  2. 在mixin.js文件中,注册一个mixin对象,定义需要的方法或者数据,export该对象
  3. 在需要的页面引入并使用,混入
// 引入
import mixin from '@/assets/mixins/mixin.js'
// 混入
mixins: [mixin]

2. 全局混入

一旦使用全局混入对象,将会影响到 所有 之后创建的 Vue 实例。

使用方式:

  1. 在main.js中定义mixin(Vue.mixin)
  2. 在需要使用的页面直接使用,不需要再引入(使用方法同局部混入)
// 全局混入
Vue.mixin({
    data() {
        return {
            name: 'dandan'
        }
    },
    methods: {
        hello() {
            console.log('hello, 全局mixin')
        }
    }
})

四、一些比较

与vuex的区别

vuex:用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。

Mixins:可以定义共用的变量,在每个组件中使用,引入组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。

与公共组件的区别

组件:在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据props来传值,但本质上两者是相对独立的。

Mixins:则是在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。

五、总结

混合对于封装一小段想要复用的代码来讲是有用的。当然不是唯一可行的。混合很好,它不需要传递状态,但是这种模式当然也可能会被滥用。所以还是需要仔细斟酌使用。

你可能感兴趣的:(vue笔记)