当组件A中有一个方法methodCommon,组件B中一样有一个方法methodCommon,若是每一个组件中都写这个方法,会出现不少重复性代码:javascript
<!-- componentA.vue --> <template> <div>{{ methodCommon() }}</div> </template> <script> export defautl { methods: { methodCommon() { return 'this is a method ...' } } } </script>
<!-- componentB.vue --> <template> <div>{{ methodCommon() }}</div> </template> <script> export defautl { methods: { methodCommon() { return 'this is a method ...' } } } </script>
上面代码中的重复部分,能够抽取一个公共的mixin:html
// mixin.js export default { methods: { methodCommon() { return 'this is a method ...' } } }
而后在每个组件中引入该mixin.js便可:vue
<!-- componentA.vue --> <template> <div>{{ methodCommon() }}</div> </template> <script> import mixin from './mixin.js' export default { mixins: [ mixin ] } </script>
<!-- componentB.vue --> <template> <div>{{ methodCommon() }}</div> </template> <script> import mixin from './mixin.js' export default { mixins: [ mixin ] } </script>
经过混合,提升了代码的复用性。java
若是组件A中存在钩子函数,混合中也存在相同的钩子函数,那么两个钩子函数都会执行。
执行顺序是混合中的钩子函数先执行,组件中的钩子函数后执行。ide
// mixin.js export default { created() { console.log('mixin created ...') } }
<!-- componentA.vue --> <template> <div>component A</div> </template> <script> import mixin from './mixin.js' export default { mixins: [ mixin ], created() { console.log('componentA created ...') } } </script>
最终的执行结果:函数
mixin created ... componentA created ...
多个混合的钩子函数,会根据混合使用的顺序来执行。优化
mixins: [ 'mixin1', 'mixin2' ]
执行的时候,会先执行mixin1中的钩子函数,再执行mixin2中的钩子函数,最后执行当前组件中的钩子函数。ui
混合中的对象选项,如directives
filters
components
data
computed
methods
等会被混合成一个对象的属性,若是键值对相同,会优先根据组件中的内容进行输出。this
// mixin.js export default { data() { return { msg: 'mixin msg ...' } } }
<!-- componentA.vue --> <template> <div>{{ msg }}</div> </template> <script> import mixin from './mixin.js' export default { mixins: [ mixin ], data() { return { msg: 'componentA msg ...' } } } </script>
最终会输出组件A中的msg:componentA msg ...
code