Vue的mixins属性

225 阅读1分钟

一 mixins

  1. mixins(混入),其本质就是复制,它的作用是减少data,method,钩子这些构造选项的重复。
  2. mixins(混入) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。

二 代码示例

  1. 对于如下代码,需求为,Child1和Child2组件在created的时候打印出"hello from mixin!"四个字。我们可以在每个组件中的created中打印,但是如果是10个组件或者更多。又或者需求不是打印字符串,而是更复杂的功能,此时会导致很多重复的代码。这时就可以使用mixins来减少重复。
  <div id="app">
        <Child1></Child1>
        <Child2></Child2>
  </div>

具体用法如下

  //log.js
  const log = {
    created: function() {
      console.log("hello from mixin!");
    },
  };
  export default log;

上面就是mixins代码,在每个组件中引入此代码即可,引用方法如下

  //Child1.vue
  <template>
    <div class="Child1">child1</div>
  </template>
  <script>
  import log from "../log.js";//引入代码
  export default {
    name: "Child1",
    mixins: [log],//使用代码
  </script>

  1. 如果想要创建Child1时打印"你好child1",想要创建Child2时打印"你好child2",这时代码可以改为如下形式
  const log = {
    data() {
      return {
        name: undefined,//新增代码
      };
    },
    created: function() {
      if (!this.name) {
        throw new Error("need name");
      }
      console.log(`你好${this.name}`);
    },
  };
  export default log;
  //Child1.vue
  <template>
    <div class="Child1">child1</div>
  </template>
  <script>
  import log from "../log.js";//引入代码
  export default {
    name: "Child1",
    data() {
      return {
        name: child1,//新增代码
      };
    },
    mixins: [log],//使用代码
  </script>

log.js中的name会自动与组件中的name合并。与普通复制不同得是,这里是智能合并。当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”。

比如,数据对象在内部会进行递归合并,并在发生冲突时以组件数据优先。同名钩子函数将合并为一个数组,因此都将被调用。值为对象的选项,例如 methods、components 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

Vue.mixin不推荐使用,混入范围太大。