0.背景
假设定义有两个组件,每个组件内都有一个方法 sayHello(),这两个方法是一模一样的,这个时候就考虑把这样公共的东西抽离出来做成一个混入对象。实际上这就跟工具类有点类似,不过vue有它自己的想法。
1.过程
在前面的一些文章中,我们介绍过组件的基本使用方式,这里不做过多赘述,直接开始。
我们创建两个组件Student.vue和School.vue,初始代码如下:
Student.vue
<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
<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:
<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
然后添加的代码如下:
export const hunhe1={ methods: { showName(){ alert("我是谁!混合 ") } }, }
分别在Student.vue和School.vue中引入这个,并添加混合配置项。
<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>
<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中基础用法。它的触发逻辑可以用下面过程表示。
我们在混合中加入如下如下代码:
//minxin.js export const hunhe1={ methods: { showName(){ alert("我是谁!混合 ") } }, mounted() { console.log('我是混合!') }, }
School.vue:
<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
<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>
程序运行后,打开控制台,可以看到触发效果:
可以看到,混合中和组件中都触发了。
如果组件中的方法和混合中的方法同名怎么办?
答案是,会触发组件中的方法而不触发混合中的方法。
当然,混合中除了写方法外,也可以对外暴露数据,比如下面这种写法:
//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这个变量了。
如果组件中本身就有这个变量或者跟混合中的变量重名了呢?
答案是,以组件中的为准。也就是说,组件中没有才会去混合中寻找这个值。