1.mixin
1.1 使用
// mixin文件
export default {
data() {
return {
msg: "这是默认值",
};
},
methods: {
changeMsg(val) {
this.msg = val;
},
},
created() {
console.log("这是mixin的created", this.msg);
this.changeMsg("这是mixin的created");
},
mounted() {
console.log("这是mixin的mounted", this.msg);
},
};
// 组件内部
<template>
<div class="hello">
<h1>{{ msg }}</h1>
</div>
</template>
<script>
import MsgMixin from "@/mixins/msg";
export default {
name: "HelloWorld",
mixins: [MsgMixin],
data() {
return {
msg: "121212",
};
},
methods: {
changeMsg() {},
},
created() {
console.log("这里是组件内部的created");
},
mounted() {
console.log("这里是组件内部的mounted");
},
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
</style>
1.2 执行规则
mixin和组件中存在冲突时,如生命周期、data中的变量、methods方法时,执行顺序如下
- 生命周期
- 会优先执行mixin中的生命周期,然后再执行组件的生命周期
- watch监听
- 会优先执行mixin中的watch,然后再执行组件中的watch
- data中的变量
- mixin和组件中的data变量冲突时,组件的变量会覆盖mixin的变量,然后其余的变量进行合并
- methods方法
- mixin和组件中的methods方法冲突时,组件的方法会覆盖mixin的方法,然后其余的方法进行合并
1.3 优缺点
- 优点
- 代码复用
- 定制化不同的mixin,根据组件需求灵活的添加删除mixin
- 分离关注点,通过将特定功能的代码封装到 Mixin 中,你可以将不同关注点的代码分离开来,提高代码的可维护性和可读性。
- 缺点
- 命名冲突
- 隐性依赖
- 使用mixin可能会引入隐式依赖,因为组件行为可能会依赖于多个mixin中的选项,这可能会增加代码的复杂性,降低代码的可维护性
- 溯源困难(复杂性增加)
- 当项目中大量使用mixin时,可能会导致代码复杂性增加
- 组件耦合
- 过度使用mixin可能会导致组件之间的耦合增加,因为它们共享了一些逻辑,可能会导致组件难以维护和理解
2.动画
2.1 原生动画和动画过渡事件
<template>
<div class="hello">
<div id="demo">测试动画</div>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {};
},
mounted() {
const demo = document.querySelector("#demo");
// 动画开始事件
demo.addEventListener("transitionstart", () => {
console.log("动画开始");
});
// 动画结束事件
demo.addEventListener("transitionend", () => {
console.log("动画结束");
demo.remove();
});
},
};
</script>
<style scoped>
#demo {
width: 200px;
height: 200px;
background-color: red;
line-height: 200px;
text-align: center;
/* 动画 */
transition: all 1s;
}
#demo:hover {
transform: translate(200px);
}
</style>
2.2 vue动画
vue动画 使用transition标签对需要进行动画效果的组件或标签进行包裹
<template>
<div class="hello">
<button @click="isShow = !isShow">显示/隐藏</button>
<transition name="fade">
<div id="demo" v-if="isShow">测试动画</div>
</transition>
</div>
</template>
<script>
export default {
name: "HelloWorld",
data() {
return {
isShow: true,
};
},
};
</script>
<style scoped>
#demo {
width: 200px;
height: 200px;
line-height: 200px;
background-color: red;
}
#demo.fade-enter,
#demo.fade-leave-to {
width: 400px;
}
#demo.fade-enter-active,
#demo.fade-leave-active {
transition: all 0.5s;
}
</style>
2.3 vue动画原理
当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:
- 官方解释
- 自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。
- 如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。
- 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的
nextTick概念不同)
- 理解
- 通过v-if控制元素的显示隐藏
- 通过transition的name属性,定义过渡动画的class
- 通过css定义过渡动画的样式
- 即:
- 首先组件在即将出现时,vue将其添加到dom中,然后绑定对应的class,实现进场过渡
- 元素退场执行完毕后(transitonend),vue会将其从dom中删除