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

相关推荐
kyriewen25 分钟前
今天的科技圈,全在抢英伟达的饭碗
前端·面试·ai编程
SouthernWind44 分钟前
RAGFlow——结合本地知识库检索开发实战指南(包含聊天、检索本地的知识库文档和Agent模式)
前端
三翼鸟数字化技术团队1 小时前
websocket及SSE原理解析
前端
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(八):设计管理员模型、热重载配置
前端·后端·go
政采云技术2 小时前
Chrome 高阶调试技巧
前端
牧艺2 小时前
HTML-in-Canvas 深度解析:让 Canvas 真正「吃上」HTML 这碗饭
前端·html·canvas
秦瑜华2 小时前
前端页面添加AI自动翻译按钮
前端·openai·ai编程
沉浸学习的匿名网友2 小时前
什么是 .gitignore?为什么每个 Git 项目几乎都离不开它?
前端·git
Apifox2 小时前
从 Postman 迁移到 Apifox:Workspace、Collection、Environment 现在可以一起导入了
前端·后端·程序员