首页 > 其他分享 >vue-mixin(混合)

vue-mixin(混合)

时间:2024-11-13 09:43:56浏览次数:1  
标签:vue name 混合 hunhe1 mixin 组件 showName

原文链接:vue-mixin(混合) – 每天进步一点点

 

0.背景

假设定义有两个组件,每个组件内都有一个方法 sayHello(),这两个方法是一模一样的,这个时候就考虑把这样公共的东西抽离出来做成一个混入对象。实际上这就跟工具类有点类似,不过vue有它自己的想法。

1.过程

在前面的一些文章中,我们介绍过组件的基本使用方式,这里不做过多赘述,直接开始。

我们创建两个组件Student.vue和School.vue,初始代码如下:

Student.vue

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <template>   <div>     <h2 @click="showName">姓名:{{name}}</h2>     <h2>年龄:{{age}}</h2>   </div> </template>   <script> export default {   name: "Student",   data() {     return {       msg: "我是学生组件",       name:'张三',       age:13,     };   },   methods: {     showName(){       alert("我是谁!")     }   },    }; </script>

School.vue

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <template>   <div>     <h2 @click="showName">学校名称:{{name}}</h2>     <h2>学校地址:{{address}}</h2>   </div> </template>   <script> export default {   name: "School",   data() {     return {       msg: "我是学校组件",       name:'家里蹲大学',       address:'青青草原',     };   },   methods: {     showName(){       alert("我是谁!")     }   },    }; </script>

App.vue:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <template>   <div id="app">     <Student/>     <School/>   </div> </template>   <script>   import Student from './components/Student' import School from  './components/School'   export default {   name: 'App',   components: {     Student,School   },    } </script>   <style> #app {   font-family: Avenir, Helvetica, Arial, sans-serif;   -webkit-font-smoothing: antialiased;   -moz-osx-font-smoothing: grayscale;   text-align: center;   color: #2c3e50;   margin-top: 60px; } </style>

默认效果如下:

从上面的代码中就可以简单看出两个子组件中有重复的内容,就是showName方法, 那么我们考虑把它抽离出来,进行混合。

我们新建一个文件,取名为minxin.js

然后添加的代码如下:

1 2 3 4 5 6 7 export const hunhe1={     methods: {         showName(){             alert("我是谁!混合 ")         }     }, }

分别在Student.vue和School.vue中引入这个,并添加混合配置项。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <template>   <div>     <h2 @click="showName">学校名称:{{name}}</h2>     <h2>学校地址:{{address}}</h2>   </div> </template>   <script> //引入一个混合 import {hunhe1} from './minxin' export default {   name: "School",   data() {     return {       msg: "我是学校组件",       name:'家里蹲大学',       address:'青青草原',     };   }, //   methods: { //     showName(){ //       alert("我是谁!") //     } //   },   //混合配置项   mixins:[hunhe1]     }; </script>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <template>   <div>     <h2 @click="showName">姓名:{{name}}</h2>     <h2>年龄:{{age}}</h2>   </div> </template>   <script> import {hunhe1} from './minxin' export default {   name: "Student",   data() {     return {       msg: "我是学生组件",       name:'张三',       age:13,     };   },   // methods: {   //   showName(){   //     alert("我是谁!")   //   }   // },   mixins:[hunhe1]    }; </script>

注意,我们为了显示效果,把原先的methods先注释掉,后面再演示多个触发效果。

效果如下:

2.混合的逻辑

上面的过程中,我们演示了vue中基础用法。它的触发逻辑可以用下面过程表示。

我们在混合中加入如下如下代码:

1 2 3 4 5 6 7 8 9 10 11 //minxin.js export const hunhe1={     methods: {         showName(){             alert("我是谁!混合 ")         }     },     mounted() {         console.log('我是混合!')     }, }

School.vue:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <template>   <div>     <h2 @click="showName">学校名称:{{ name }}</h2>     <h2>学校地址:{{ address }}</h2>   </div> </template>   <script> //引入一个混合 import { hunhe1 } from "./minxin"; export default {   name: "School",   data() {     return {       msg: "我是学校组件",       name: "家里蹲大学",       address: "青青草原",     };   },   //   methods: {   //     showName(){   //       alert("我是谁!")   //     }   //   },   //混合配置项   mixins: [hunhe1],   mounted() {     console.log("我是学校组件!");   }, }; </script>

Student.vue

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <template>   <div>     <h2 @click="showName">姓名:{{ name }}</h2>     <h2>年龄:{{ age }}</h2>   </div> </template>   <script> import { hunhe1 } from "./minxin"; export default {   name: "Student",   data() {     return {       msg: "我是学生组件",       name: "张三",       age: 13,     };   },   // methods: {   //   showName(){   //     alert("我是谁!")   //   }   // },   mixins: [hunhe1],   mounted() {     console.log("我是学生组件!");   }, }; </script>

程序运行后,打开控制台,可以看到触发效果:

可以看到,混合中和组件中都触发了。

如果组件中的方法和混合中的方法同名怎么办?

答案是,会触发组件中的方法而不触发混合中的方法。

当然,混合中除了写方法外,也可以对外暴露数据,比如下面这种写法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 //minxin.js export const hunhe1={     methods: {         showName(){             console.log("我是混合组件的showName")         }     },     mounted() {         console.log('我是混合!')     }, }   export const hunhe2={     data() {         return {             x:100         }     }, }

hunhe2 这个对外暴露了x这个变量,值是100。那么我在其他组件中引入hunhe2就可以使用x这个变量了。

如果组件中本身就有这个变量或者跟混合中的变量重名了呢?

答案是,以组件中的为准。也就是说,组件中没有才会去混合中寻找这个值。

 

标签:vue,name,混合,hunhe1,mixin,组件,showName
From: https://www.cnblogs.com/longkui-site/p/18543154

相关文章

  • Vue自定义指令详解——以若依框架中封装指令为例分析
    自定义指令在Vue.js中,自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释:一、自定义指令的基本概念自定义指令允许开发者直接对DOM元素进行低层次操作,而无需编写大量的模板或者JavaScript代码。它们可以响应Vue的响应式系统,从而在数据......
  • 揭秘!Vue3.5响应式重构如何让内存占用减少56%
    前言Vue3.5版本又将响应式给重构了,重构后的响应式系统主要有两部分组成:双向链表和版本计数。我们在前两篇文章中我们已经讲过了双向链表和版本计数,这篇文章我们来讲讲为什么这次重构能够让内存占用减少56%。欧阳年底也要毕业了,加入欧阳的面试交流群(分享内推信息)、高质量vue......
  • vue
    Vue.js是一个流行的前端JavaScript框架,用于构建用户界面和单页面应用。1.a.响应式系统Vue的核心是其响应式系统。通过data对象,Vue能够追踪依赖关系,并在数据变化时自动更新视图。b.组件组件是Vue的基本构建块。每个Vue应用都是由一棵组件树构成的。组件可以嵌套......
  • 基于SpringBoot+Vue+uniapp的大学生志愿者信息管理系统的详细设计和实现(源码+lw+部署
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • flask基于SpringBoot和vue的酒吧运营系统(毕设源码+论文)
    校园二手货物交易平台m1a2o本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于酒吧运营系统的研究,现有研究主要以酒吧的营销策略、服务体验等为主,专门针对酒吧运营系统全面功能架构......
  • 基于SpringBoot+Vue的新闻资讯系统+万字论文+Mp4演示
    系统简介:基于SpringBoot+Vue的新闻资讯系统+万字论文+Mp4演示资源描述:是否有万字论文:有是否有论文视频:有是否有PPT:没有是否有Mp4演示:有是否有演示站:有是否前后端分离:是技术栈:Java:JDK8主要编程语言,用于后端开发MySQL:数据库管理系统,用于存储和......
  • vue前端利用ofd.js实现ofd类型在线预览
    1.安装:npmiofd.js2.axios封装注意事项,responseType:'arraybuffer'//电子证件照exportfunctiongetXkzOriginal(data){returnreq({url:'/bigdata/getXkzOriginal',method:'POST',params:data,res......
  • 在vue3中使用甘特图动态渲染失败
    最终删除了<stylescoped>的scoped后解决。 在Vue.js中使用DHTMLXGantt是可行的,但要注意某些细节,以确保样式和模板正常工作。Vue的组件体系和样式作用域可能会影响Gantt图的样式应用。以下是一些解决方案:1.检查CSS作用域如果您的CSS使用了<stylescoped>,那么这......
  • swiper vue-awesome-swiper基本使用以及注意事项
    本文中使用vue来演示1.安装swiper下载插件(最新版本的swiper可能会出现未知bug,所以这里使用5.4.5)[email protected]@4.1.0-seve注意!!安装swiper和vue-awesome-swiper一定要对应上版本,否则引入,或者语法会出报错,每一个swiper版本都有对应的vue-awe......
  • 基于SSM+Vue智慧在线考试平台【提供源码+答辩PPT+文档+项目部署】
    作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:......