mixins-extends研究
很多人都用过mixins和extends,但是偏偏就对mixins和extend的执行顺序不慎了解. 那么开启我们的研究吧.
mixins
extends
官网解释:mixins可以接受一个对象数组,而extend只能扩展一个组件/对象/函数
mixins和extends执行顺序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>mixin的data值为:{{mixinData}}</p>
<button @click="handleClick()">点我触发handleClick方法</button>
</div>
</body>
<script>
var mixin = {
data: {mixinData: '我是mixin的data'},
created() {
console.log('这是mixin的created方法')
},
methods: {
handleClick() {
console.log('这是mixin的handleClick方法')
}
}
}
var extend = {
data: {extendData: '我是extend的data'},
created() {
console.log('这是extend的created方法')
},
methods: {
handleClick() {
console.log('这是extend的handleClick方法')
}
}
}
var vm = new Vue({
el: '#app',
data: {mixinData: '我是vue实例里的data'},
created() {
console.log('这是vue实例里的created方法')
},
methods: {
handleClick() {
console.log('这是vue实例里的handleClick方法')
}
},
mixins: [mixin],
extends: extend
})
</script>
</html>
结果
这是extend的created方法
这是mixin的created方法
这是vue实例里的created方法
这是vue实例里的handleClick方法
多个mixins和extends执行顺序(mixin在前,mixin2在后)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>mixin的data值为:{{mixinData}}</p>
<button @click="handleClick()">点我触发handleClick方法</button>
</div>
</body>
<script>
var extend = {
data: {extendData: '我是extend的data'},
created() {
console.log('这是extend的created方法')
},
methods: {
handleClick() {
console.log('这是extend的handleClick方法')
}
}
}
var mixin = {
data: {mixinData: '我是mixin的data'},
created() {
console.log('这是mixin的created方法')
},
methods: {
handleClick() {
console.log('这是mixin的handleClick方法')
}
}
}
var mixin2 = {
data: {mixinData: '我是mixin2的data'},
created() {
console.log('这是mixin2的created方法')
},
methods: {
handleClick() {
console.log('这是mixin2的handleClick方法')
}
}
}
var vm = new Vue({
el: '#app',
data: {mixinData: '我是vue实例里的data'},
created() {
console.log('这是vue实例里的created方法')
},
methods: {
handleClick() {
console.log('这是vue实例里的handleClick方法')
}
},
extends: extend,
mixins: [mixin, mixin2]
})
</script>
</html>
结果
这是extend的created方法
这是mixin的created方法
这是mixin2的created方法
这是vue实例里的created方法
这是vue实例里的handleClick方法
多个mixins和extends执行顺序(mixin在后,mixin2在前)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>mixin的data值为:{{mixinData}}</p>
<button @click="handleClick()">点我触发handleClick方法</button>
</div>
</body>
<script>
var extend = {
data: {extendData: '我是extend的data'},
created() {
console.log('这是extend的created方法')
},
methods: {
handleClick() {
console.log('这是extend的handleClick方法')
}
}
}
var mixin = {
data: {mixinData: '我是mixin的data'},
created() {
console.log('这是mixin的created方法')
},
methods: {
handleClick() {
console.log('这是mixin的handleClick方法')
}
}
}
var mixin2 = {
data: {mixinData: '我是mixin2的data'},
created() {
console.log('这是mixin2的created方法')
},
methods: {
handleClick() {
console.log('这是mixin2的handleClick方法')
}
}
}
var vm = new Vue({
el: '#app',
data: {mixinData: '我是vue实例里的data'},
created() {
console.log('这是vue实例里的created方法')
},
methods: {
handleClick() {
console.log('这是vue实例里的handleClick方法')
}
},
extends: extend,
mixins: [mixin2, mixin]
})
</script>
</html>
结果
这是extend的created方法
这是mixin2的created方法
这是mixin的created方法
这是vue实例里的created方法
这是vue实例里的handleClick方法
多个生命周期
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>mixin的data值为:{{mixinData}}</p>
<button @click="handleClick()">点我触发handleClick方法</button>
</div>
</body>
<script>
var extend = {
data: {extendData: '我是extend的data'},
beforeCreate(){
console.log('这是extend的beforeCreate方法')
},
created() {
console.log('这是extend的created方法')
},
beforeMount(){
console.log('这是extend的beforeMount方法')
},
mounted(){
console.log('这是extend的mounted方法')
},
beforeUpdate(){
console.log('这是extend的beforeUpdate方法')
},
updated(){
console.log('这是extend的updated方法')
},
methods: {
handleClick() {
console.log('这是extend的handleClick方法')
}
}
}
var mixin = {
data: {mixinData: '我是mixin的data'},
beforeCreate(){
console.log('这是mixin的beforeCreate方法')
},
created() {
console.log('这是mixin的created方法')
},
beforeMount(){
console.log('这是mixin的beforeMount方法')
},
mounted(){
console.log('这是mixin的mounted方法')
},
beforeUpdate(){
console.log('这是mixin的beforeUpdate方法')
},
updated(){
console.log('这是mixin的updated方法')
},
methods: {
handleClick() {
console.log('这是mixin的handleClick方法')
}
}
}
var mixin2 = {
data: {mixinData: '我是mixin2的data'},
beforeCreate(){
console.log('这是mixin2的beforeCreate方法')
},
created() {
console.log('这是mixin2的created方法')
},
beforeMount(){
console.log('这是mixin2的beforeMount方法')
},
mounted(){
console.log('这是mixin2的mounted方法')
},
beforeUpdate(){
console.log('这是mixin2的beforeUpdate方法')
},
updated(){
console.log('这是mixin2的updated方法')
},
methods: {
handleClick() {
console.log('这是mixin2的handleClick方法')
}
}
}
var vm = new Vue({
el: '#app',
data: {mixinData: '我是vue实例里的data'},
beforeCreate(){
console.log('这是vue实例里的beforeCreate方法')
},
created() {
console.log('这是vue实例里的created方法')
},
beforeMount(){
console.log('这是vue实例里的beforeMount方法')
},
mounted(){
console.log('这是vue实例里的mounted方法')
},
beforeUpdate(){
console.log('这是vue实例里的beforeUpdate方法')
},
updated(){
console.log('这是vue实例里的updated方法')
},
methods: {
handleClick() {
console.log('这是vue实例里的handleClick方法')
}
},
extends: extend,
mixins: [mixin2, mixin]
})
</script>
</html>
结果
这是extend的beforeCreate方法
这是mixin2的beforeCreate方法
这是mixin的beforeCreate方法
这是vue实例里的beforeCreate方法
这是extend的created方法
这是mixin2的created方法
这是mixin的created方法
这是vue实例里的created方法
这是extend的beforeMount方法
这是mixin2的beforeMount方法
这是mixin的beforeMount方法
这是vue实例里的beforeMount方法
这是extend的mounted方法
这是mixin2的mounted方法
这是mixin的mounted方法
这是vue实例里的mounted方法
这是vue实例里的handleClick方法
vue实例中没有重名方法和重名变量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/vue/2.5.17-beta.0/vue.min.js"></script>
</head>
<body>
<div id="app">
<p>mixin的data值为:{{mixinData}}</p>
<button @click="handleClick()">点我触发handleClick方法</button>
</div>
</body>
<script>
var extend = {
data: {extendData: '我是extend的data'},
beforeCreate(){
console.log('这是extend的beforeCreate方法')
},
created() {
console.log('这是extend的created方法')
},
beforeMount(){
console.log('这是extend的beforeMount方法')
},
mounted(){
console.log('这是extend的mounted方法')
},
beforeUpdate(){
console.log('这是extend的beforeUpdate方法')
},
updated(){
console.log('这是extend的updated方法')
},
methods: {
handleClick() {
console.log('这是extend的handleClick方法')
}
}
}
var mixin = {
data: {mixinData: '我是mixin的data'},
beforeCreate(){
console.log('这是mixin的beforeCreate方法')
},
created() {
console.log('这是mixin的created方法')
},
beforeMount(){
console.log('这是mixin的beforeMount方法')
},
mounted(){
console.log('这是mixin的mounted方法')
},
beforeUpdate(){
console.log('这是mixin的beforeUpdate方法')
},
updated(){
console.log('这是mixin的updated方法')
},
methods: {
handleClick() {
console.log('这是mixin的handleClick方法')
}
}
}
var mixin2 = {
data: {mixinData: '我是mixin2的data'},
beforeCreate(){
console.log('这是mixin2的beforeCreate方法')
},
created() {
console.log('这是mixin2的created方法')
},
beforeMount(){
console.log('这是mixin2的beforeMount方法')
},
mounted(){
console.log('这是mixin2的mounted方法')
},
beforeUpdate(){
console.log('这是mixin2的beforeUpdate方法')
},
updated(){
console.log('这是mixin2的updated方法')
},
methods: {
handleClick() {
console.log('这是mixin2的handleClick方法')
}
}
}
var vm = new Vue({
el: '#app',
beforeCreate(){
console.log('这是vue实例里的beforeCreate方法')
},
created() {
console.log('这是vue实例里的created方法')
},
beforeMount(){
console.log('这是vue实例里的beforeMount方法')
},
mounted(){
console.log('这是vue实例里的mounted方法')
},
beforeUpdate(){
console.log('这是vue实例里的beforeUpdate方法')
},
updated(){
console.log('这是vue实例里的updated方法')
},
extends: extend,
mixins: [mixin2, mixin]
})
</script>
</html>
结果:
这是extend的beforeCreate方法
这是mixin2的beforeCreate方法
这是mixin的beforeCreate方法
这是vue实例里的beforeCreate方法
这是extend的created方法
这是mixin2的created方法
这是mixin的created方法
这是vue实例里的created方法

这是extend的beforeMount方法
这是mixin2的beforeMount方法
这是mixin的beforeMount方法
这是vue实例里的beforeMount方法
这是extend的mounted方法
这是mixin2的mounted方法
这是mixin的mounted方法
这是vue实例里的mounted方法
这是vue实例里的handleClick方法
这是mixin的handleClick方法
总结:
- 先执行extends,再执行mixins,然后才是vue实例的生命周期;
- 放入多个mixins,按mixins引用的顺序执行;
- 不能放入两个乃至多个extends;
- mixins/extends/vue实例生命周期执行顺序都是一样的,都是先一起执行完beforeCreate,然后在到created等生命周期;
- vue实例里的方法会覆盖mixins和extends的重名方法和重名变量,如果vue实例中没有重名方法和重名变量,那么最后被引用的mixins会覆盖之前的mixins和extends方法和变量.
最后,别忘了给这个项目点一个star哦,谢谢支持。
下面是小编的公众号
一个学习编程技术的公众号。每天推送高质量的优秀博文、开源项目、实用工具、面试技巧、编程学习资源等等。目标是做到个人技术与公众号一起成长。欢迎大家关注,一起进步,走向全栈大佬的修炼之路