當組件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