温故而知新(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.乱用的话后期不好维护

相关推荐
DFT计算杂谈1 分钟前
AMSET 设置多核并行计算
java·前端·css·html·css3
花椒技术5 分钟前
AI 协同开发落地复盘:1 小时生成首版后,为什么 Review 和修正又花了 2-3 天
前端·人工智能·架构
万少39 分钟前
万少用9个AI工具,帮朋友完成了一个"不可能"的项目
前端
小小小小宇41 分钟前
Vue `import` 为什么可以异步加载
前端
WMYeah1 小时前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
Unbelievabletobe1 小时前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
大哥,带带弟弟1 小时前
Grafana 前端嵌入与 JWT 鉴权实战
前端·grafana
小小小小宇1 小时前
前端 V8 引擎垃圾回收机制与内存问题排查
前端
前端老石人1 小时前
CSS 值定义语法
前端·css
sheeta19981 小时前
Vue 前端基础笔记
前端·vue.js·笔记