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

相关推荐
等咸鱼的狸猫9 分钟前
# JS 核心六大主题:闭包内存模型、原型链查找、事件流机制与 Promise / Event Loop 实现视角复盘
前端·javascript
袋鱼不重44 分钟前
乐观锁与悲观锁:原理、选型与前后端实践
前端·后端
Charonmomo1 小时前
react/antd - 不能正确打开标签页问题记录
前端·react.js·前端框架
冬枳1 小时前
基于OpenSeagragon封装的前端病理切片展示组件
前端·typescript
爱勇宝2 小时前
《道德经》第6章:别把团队的创造力用到枯竭
前端·后端
无双_Joney2 小时前
[四期 - 4] NestJS专栏 - 征召一下大家的意见,非常想知道大家都想看看Nest的哪些方面
前端·后端·nestjs
彭亚川Allen2 小时前
停更的这一年,All In AI、陪媳妇生娃、还考了个研
前端·后端·产品经理
爱分享的程序猿-Clark3 小时前
【前端开发】前端开发者如何使用 Claude Code 快速搭建 React 项目!(小白都能学会的教程)
前端·react.js
_kerneler3 小时前
cgroup :限制cpu原理
java·服务器·前端
yingyima4 小时前
AWK 速查手册:不仅仅是文本处理,更是性能与简洁的抉择
前端