17.mixin和Composition API

144 阅读2分钟

(mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 在vue2中会有一些使用,对于公共的函数,变量可以起到一个复用的效果.但是也可能会出现一些意想不到的问题(比如冲突)而导致不好排查bug

局部引用

components//
export default {
  data: () => ({
    count: 1
  }),
  methods: {
    addCount() {
      count += 1;
    }
  }
};

组件内引用

<template>
  <div class="xx-container">
    这是本组件的count: {{ count1 }}
    <br />
    这是混入的count: {{ count }}
  </div>
</template>
<script>
import mixin from './Component.js';
export default {
  mixins: [mixin],
  data() {
    return {
      count1: 12
    };
  }
};
</script>

效果: image.png 可以发现我们的mixin可以看做一个单独的函数式组件,里面可以包含data,或者其他的函数,watch,computer,在其他组件中可以通过局部引入,然后mixins注册.

全局混入

在main注册

Vue.mixin({
  data: () => ({
    count: 1
  }),
  methods: {
    addCount() {
      count += 1;
    }
  },
  created() {
    console.log('mixin的created');
  }
});

app组件使用

<template>
  <div id="app">
    app的count:{{ count }}
    <router-view />
  </div>
</template>

其他组件使用

<template>
  <div class="xx-container">
    这是本组件的count: {{ count1 }}
    <br />
    这是home混入的count: {{ count }}<button @click="count += 1">count+1</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      count1: 12
    };
  }
};
</script>

结果:

image.png image.png 我们可以看到在组件内可以直接使用该变量 而且不会影响到其他地方. 而且created函数在2个组件和vue实例中都分别调用了一次.

变量,函数重复

混入

export default {
  data: () => ({
    count: 1,
    obj: {
      a: 1,
      b: 2,
      c: 3
    }
  }),
  methods: {
    addCount() {
      this.count += 1;
    }
  },
  created() {
    console.log('mixin的created');
  },
  computed: {
    computedNum() {
      return 333;
    }
  }
};

组件内

<template>
  <div class="xx-container">
    简单数据类型count: {{ count }} <button @click="addCount">countAdd</button>
    <br />
    复杂数据类型obj:{{ obj }}
    <br />
    计算属性computedNum:{{ computedNum }}
  </div>
</template>
<script>
import mixin from './Component.js';
export default {
  mixins: [mixin],
  data() {
    return {
      count: 12,
      obj: {
        a: 13
      }
    };
  },
  methods: {
    addCount() {
      this.count += 100;
    }
  },
  created() {
    console.log('组件的created');
  },
  computed: {
    computedNum() {
      return 222;
    }
  }
};
</script>

结果:

image.png

image.png

对于简单数据和methods里面的方法以组件内部为主. 生命周期函数先执行混入里面的再执行组件内部的 对象数据会拼接在一起,重复了的以组件为主 计算属性和watch以组件为主

总结

混入对于一些全局都会使用变量或者函数确实有很好的帮助,但是还是尽量使用局部使用,1可以节约性能.2避免出现一些意料之外的bug

这些问题再vue3的Composition API中克服了mixin问题 Composition API的主要思想是,我们将它们定义为从新的 setup 函数返回的JavaScript变量,而不是将组件的功能(例如state、method、computed等)定义为对象属性。

mixin模式表面上看起来很安全。然而,通过合并对象来共享代码,由于它给代码增加了脆弱性,并且掩盖了推理功能的能力,因此成为一种反模式。

Composition API最聪明的部分是,它允许Vue依靠原生JavaScript中内置的保障措施来共享代码,比如将变量传递给函数和模块系统。