前言
数据混入------mixin,混入一般分为局部混入和全局混入。混入的选项是常见的api,比如data,created mounted....
定义基础文件mixin1.js
mixin1.js
javascript
export const mix1 = {
data() {
return{
name: '昨日晴天'
}
},
methods:{
},
created() {
console.log(111)
}
}
export const mix2 = {
data(){
return{
age:2
}
},
methods:{
},
created() {
console.log(2222)
}
}
全局的引入方式如下:
javascript
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
import {mix2} from "@/mixin1";
new Vue({
render: h => h(App),
mixins:[mix2]
}).$mount('#app')
打开控制台如下:
这里是混入了全局的created,如果是在我们的app.vue加入了created之后结果是这样的:
xml
<script>
import HelloWorld from './components/HelloWorld.vue'
import {mix1} from "@/mixin1";
export default {
name: 'App',
mixins:[mix1],
components: {
HelloWorld
},
created() {
console.log('组建内的created')
}
}
</script>
控制台输出如下:
这里我们可以看出,无论是组建内部的created的还是混入的created都已经有打印出来,而且顺序还是先是全局的,后是局部的。
xml
<script>
import HelloWorld from './components/HelloWorld.vue'
import {mix1} from "@/mixin1";
export default {
name: 'App',
mixins:[mix1],
components: {
HelloWorld
},
created() {
console.log('组建内的created');
console.log("如果存在混入的函数,先执行全局的混入,再执行局部的混入函数,最后执行内的函数")
}
}
</script>
打印如下:
所以我们得出一个结论:
如果存在混入的函数,先执行全局的混入,再执行局部的混入函数,最后执行内的函数
data中的变量名冲突混入
我们mixin1.js中有name,app中我们也加入一个name,这时候就会有一个冲突
javascript
export const mix1 = {
data() {
return{
name: '昨日晴天'
}
},
methods:{
},
created() {
console.log(111)
}
}
xml
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<p>{{name}}</p>
<HelloWorld msg="Welcome to Your Vue.js App" v-if="false"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
import {mix1} from "@/mixin1";
export default {
name: 'App',
mixins:[mix1],
components: {
HelloWorld
},
data(){
return{
name:'今天下雨了'
}
},
created() {
console.log('组建内的created');
console.log("如果存在混入的函数,先执行全局的混入,再执行局部的混入函数,最后执行内的函数")
}
}
</script>
打印结果如下:
是的,如果在存在冲突的情况下,组件的优先级是大于混入的。
对于函数也是如此:
比如下面的例子,函数getColor:
javascript
export const mix2 = {
data(){
return{
age:2
}
},
methods:{
getColor(){
return '全局颜色'
}
},
created() {
console.log(2222)
}
}
xml
<template>
<div id="app">
<img alt="Vue logo" src="./assets/logo.png">
<p>{{name}}</p>
{{getColor()}}
<HelloWorld msg="Welcome to Your Vue.js App" v-if="false"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
import {mix1} from "@/mixin1";
export default {
name: 'App',
mixins:[mix1],
components: {
HelloWorld
},
data(){
return{
name:'今天下雨了'
}
},
methods: {
getColor() {
return '组件函数颜色'
}
},
created() {
console.log('组建内的created');
console.log("如果存在混入的函数,先执行全局的混入,再执行局部的混入函数,最后执行内的函数")
}
}
</script>
打印结果如下:
Vue的混入各有好坏
优点:
1.提高代码复用性
2.维护方便,只需要修改一个地方
3.无需传递状态
缺点:
1.不清晰的数据来源,不好追溯源
2.不同的开发者使用混入,会存在命名空间冲突
3.乱用的话后期不好维护