温故而知新(01)------数据混入

前言

数据混入------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.乱用的话后期不好维护

相关推荐
兰亭妙微UI设计公司15 分钟前
兰亭妙微ui设计公司分享:B端组件命名如何支持团队协作
前端·javascript·vue.js
云和数据.ChenGuang39 分钟前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
小大宇1 小时前
Vue知识点-ElementPlus-03提示框+询问+通知
前端·javascript·vue.js
步行cgn2 小时前
Axios 请求成功但页面不显示:两个前端错误的分析与修正
前端
时间的情敌2 小时前
WebGIS + OpenLayers + GeoServer + PostGIS #量算 #点聚合
前端·geoserver·openlayers
不可能片场3 小时前
Electron 发布 cookie 库先查明文再写解密
前端·electron
郭小李3 小时前
springmvc 拦截器
java·开发语言·前端
web打印社区3 小时前
Chrome-kiosk-printing能上生产吗
开发语言·前端·javascript·chrome·websocket
白帽攻防录3 小时前
某pc客户端app从xss到rce实战案例
前端·网络安全·黑客·xss·rce·src漏洞·app漏洞
志尊宝4 小时前
AI原生前端开发(041):AI辅助的状态管理(Zustand/Pinia)
前端·javascript·ai-native