前端小白的学习之路(Vue2 四)

提示:学习vue2的第四天,笔记记录:混入(mixins),插槽(slot),过渡与动画(transition)

目录

一、混入(mixins)

二、插槽(solt)

1.匿名插槽

2.具名插槽

三、过渡与动画(transition) 

1.过渡

1)单元素过渡

Ⅰ.通用类名

Ⅱ.指定类名

2)多元素过渡 

2.动画 

1.自定义动画

2.使用动画库 


一、混入(mixins)

混入(Mixin)是一种重用 Vue 组件中可复用功能的方法,它允许你在多个组件之间共享相同的代码逻辑。通过混入,你可以将一组选项合并到组件中,这些选项可以包括数据、计算属性、方法等。

基本步骤:

1.创建混入对象:首先,创建一个包含要复用的选项的混入对象。这个对象可以包含任何 Vue 组件中可用的选项。

const options = {data() {return {num: 100}},methods: {add() {this.num++;}},watch: {num(nValue) {console.log("值:", nValue);}},created() {console.log("初始化...")}
}

2.在组件中使用混入:在你想要使用混入的组件中,通过 mixins 选项将混入对象添加到组件中。 

// 组件A
const CompA = {data() {return {num: 1}},// 混入语法mixins: [options],template: `<div><h3>组件A</h3><p>{{num}}</p><button @click="add">按钮</button></div>`,
}
// 组件B
const CompB = {// 混入语法mixins: [options],template: `<div><h3>组件B</h3><p>{{num}}</p><button @click="add">按钮</button></div>`,
}

: 当组件data选项中的数据和mixins选项中的属性和方法相同的情况,优先使用的是组件的属性和方法等 。虽然混入提供了一种方便的重用代码的方法,但过度使用混入可能导致代码变得难以理解和维护。因此,应该谨慎使用混入,避免滥用。

二、插槽(solt)

组件插槽(slot)是一种机制,允许组件接受额外的内容作为其子组件,并且可以在组件内部的特定位置渲染这些内容。插槽使得组件更加灵活,可以根据需要插入不同的内容。

1.匿名插槽

匿名插槽是最简单的一种插槽,不需要任何特定的名称。当在组件中写入内容时,如果没有为插槽指定名称,那么这个内容会被放置到子组件中的默认插槽位置。在子组件中,可以使用 <slot> 元素来标记默认插槽的位置。

<!DOCTYPE html>
<html lang="zh-cn">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><style>* {padding: 0;margin: 0;}.header {width: 100%;box-sizing: border-box;padding: 0 15px;height: 60px;background-color: #ccc;display: flex;align-items: center;margin-bottom: 10px;}.header .left {width: 80px;height: 40px;background-color: red;text-align: center;line-height: 40px;}.header .left a , .header .left span {color: #fff;text-decoration: none;}</style>
</head>
<body><div id="app"><comp-header><span>搜狐  </span></comp-header><comp-header><span>淘宝  </span></comp-header><comp-header><span>京东  </span></comp-header><comp-header><span>拼多多</span></comp-header></div><script src="./libs/vue@2.7.16/vue.js"></script><script>// 匿名插槽// <slot></slot>// 编写头部组件const CompHeader = {template: `<header class="header"><!-- 插槽 --><div class="left"><slot></slot></div></header>`}//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 注册组件components: {CompHeader}})</script>
</body>
</html>

在上面的案例中<comp-header> 组件中的<span>搜狐</span>等内容就会被插入匿名插槽中

2.具名插槽

与匿名插槽不同,在组件中写入的内容会根据name属性插入到用v-solt绑定了相同名称的插槽中

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><style>* {padding: 0;margin: 0;}.header {width: 100%;box-sizing: border-box;padding: 0 15px;height: 60px;background-color: deepskyblue;display: flex;align-items: center;margin-bottom: 10px;}.header .left {width: 80px;height: 40px;/* background-color: red; */text-align: center;line-height: 40px;}.header .left a,.header .left span {color: #fff;text-decoration: none;}.header .center {flex-grow: 1;}.header .center input {width: 100%;height: 40px;border-radius: 20px;border: 0;outline: none;box-sizing: border-box;padding-left: 15px;}.header .right {width: 50px;height: 40px;/* background-color: blue; */text-align: center;line-height: 40px;}.header .right a {color: #fff;text-decoration: none;}</style>
</head><body><div id="app"><comp-header><!-- 代表left插槽 --><template v-slot:left><span>LOGO</span></template><!-- 代表center插槽 --><template v-slot:center><input type="text" placeholder="请输入关键字"></template><!-- 代表right插槽 --><template #right><a href="#">登录</a></template></comp-header></div><script src="./libs/vue@2.7.16/vue.js"></script><script>// 具名插槽// <slot name="left"></slot>// 编写头部组件const CompHeader = {template: `<header class="header"><!-- 插槽 --><div class="left"><slot name="left"></slot></div><div class="center"><slot name="center"></slot></div><div class="right"><slot name="right"></slot></div></header>`}//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 注册组件components: { CompHeader }})</script>
</body></html>

在上面的案例中,v-solt:left中的logo就会 被插入到name='left'的插槽中去 

三、过渡与动画(transition) 

1.过渡

过渡(Transition)是一种在元素在插入、更新或删除时,在其内部进行过渡的方式,就是为元素的行为增加过渡效果。

1)单元素过渡

通过内置组件<transition> 可以对单个元素进行过渡动画,可以在元素插入、更新或删除时触发动画效果。它通过设置不同的 CSS 类名来实现动画效果。

Ⅰ.通用类名

没有设置name属性的<transition>组件过渡效果都会执行 .v- 开头的类名中设置的过渡效果。

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css"><style>/* 入场类名 *//* 入场之前的样式 */.v-enter {transform: translateX(-100%);opacity: 0;}/* 入场过程中的样式 */.v-enter-active {transition: all .5s;}.v-enter-to {transform: translateX(0px);opacity: 1;}/* 离场类名 *//* 离场之前的样式 */.v-leave {transform: translateY(0px);opacity: 1;}/* 离场过程中的样式 */.v-leave-active {transition: all .5s;}/* 离场后的样式 */.v-leave-to {transform: translateY(-100%);opacity: 0;}</style>
</head><body><div id="app"><div class="container mt-2"><div class="btn btn-success" @click="isShow=true">入场(显示)</div><div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div><transition><div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div></transition></div></div><script src="./libs/vue@2.7.16/vue.js"></script><script>//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 数据data(){return {isShow: true }},})</script>
</body></html>
Ⅱ.指定类名

通过在<transition>中设置name属性可以调用 .name-  开头的专属类名中的过渡效果。

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css"><style>/* 设置transition组件的name属性为demo后 *//* 入场类名 *//* 入场之前的样式 */.demo-enter {transform: translateX(-100%) rotate(180deg);opacity: 0;}/* 入场过程中的样式 */.demo-enter-active {transition: all .5s;}.demo-enter-to {transform: translateX(0px)  rotate(0deg);opacity: 1;}/* 离场类名 *//* 离场之前的样式 */.demo-leave {transform: translateY(0px)  rotate(0deg);opacity: 1;}/* 离场过程中的样式 */.demo-leave-active {transition: all .5s;}/* 离场后的样式 */.demo-leave-to {transform: translateY(-100%) rotate(180deg);opacity: 0;}</style>
</head><body><div id="app"><div class="container mt-2"><div class="btn btn-success" @click="isShow=true">入场(显示)</div><div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div><transition name="demo"><div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div></transition></div></div><script src="./libs/vue@2.7.16/vue.js"></script><script>//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 数据data(){return {isShow: true }},})</script>
</body></html>

2)多元素过渡 

通过内置组件<transition-group> 组件用于对多个相同类型的元素进行过渡动画,例如列表中的项。它也通过设置不同的 CSS 类名来实现动画效果。使用方法与 <transition> 类似,主要区别在于添加了 tag 属性指定了渲染元素的标签,默认为 span

<template><div><transition-group name="list" tag="ul"><li v-for="(item, index) in items" :key="index">{{ item }}</li></transition-group><button @click="addItem">添加项</button></div>
</template><script>
export default {data() {return {items: ['Item 1', 'Item 2', 'Item 3']};},methods: {addItem() {this.items.push(`Item ${this.items.length + 1}`);}}
};
</script><style>
/* 定义过渡效果的 CSS 类 */
.list-enter-active, .list-leave-active {transition: transform 0.5s;
}
.list-enter, .list-leave-to {transform: translateY(30px);opacity: 0;
}
</style>

2.动画 

1.自定义动画

通过@keyframes来自定义动画,利用enter-active,leave-active这些属性设置过渡

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css"><style>/* 入场类名 */.enter-box {animation: enter-ani .5s  forwards;}/* 离场类名 */.leave-box {animation: leave-ani .5s  forwards;}/* 自定义动画 *//* 入场动画 */@keyframes enter-ani {0% {transform: scale(.5) rotate(180deg);opacity: 0;}100% {transform: scale(1) rotate(0deg);opacity: 1;}}/* 离场动画 */@keyframes leave-ani {0% {transform: scale(1) rotate(0deg);opacity: 1;}100% {transform: scale(.5) rotate(180deg);opacity: 0;}}</style>
</head><body><div id="app"><div class="container mt-2"><div class="btn btn-success" @click="isShow=true">入场(显示)</div><div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div><!-- 处理动画,利用enter-active,leave-active这些属性设置 --><!-- 1) 自定义动画 --><transitionenter-active-class="enter-box"leave-active-class="leave-box"><div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div></transition></div></div><script src="./libs/vue@2.7.16/vue.js"></script><script>//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 数据data(){return {isShow: true }},})</script>
</body></html>

2.使用动画库 

使用别人设置好的动画可以轻松实现好看的动画效果。

动画库:https://animate.style/

<!DOCTYPE html>
<html lang="zh-cn"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Vue</title><!-- 动画库 --><link rel="stylesheet" href="./libs/animate.min.css"></head><body><div id="app"><div class="container mt-2"><div class="btn btn-success" @click="isShow=true">入场(显示)</div><div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div><!-- 2) 使用动画库 --><transitionenter-active-class="animate__animated  animate__backInLeft"leave-active-class="animate__animated  animate__fadeOutUp"><div v-if="isShow" class="bg-warning mt-2" style="height: 200px;"></div></transition></div></div><script src="./libs/vue@2.7.16/vue.js"></script><script>//禁止控制台输出日志信息Vue.config.productionTip = false;new Vue({//挂载容器el: "#app",// 数据data(){return {isShow: true }},})</script>
</body></html>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天学点儿Python(6) -- 列表和枚举

列表是Python中内置的可变序列&#xff0c;类使用C/C中的数组&#xff0c;使用 [ ] 定义列表&#xff0c;列表中的元素与元素之间用英文逗号&#xff08; , &#xff09;分隔&#xff0c; 但是Python中列表可以存储任意类型的数据&#xff0c;且可以混存&#xff08;即类型可以…

图层、窗口、画布、视图

本文内容主要参考《Android图形显示系统》 图形显示系统会涉及到图层、窗口、画布和视图等概念&#xff0c;下面分别对它们进行简单介绍。 1&#xff09;图层&#xff1a;图层是SurfaceFlinger中的概念&#xff0c;使用Layer表示&#xff0c;SurfaceFlinger在合成最终显示的图…

项目管理-人情世故

综述&#xff1a;对于事业生活&#xff0c;人情世故我觉得在生活工作中比较重要&#xff0c;下面是我说的自己想法&#xff0c;有啥不对的&#xff0c;可以一起沟通确认。 事业上 总的来说&#xff0c;我们大多数为人情世故大家觉得没啥&#xff0c;实际上我觉得也挺重要的。…

Partisia Blockchain 何以落地隐私技术的高能场景应用?

致力于隐私保护、互操作性和可持续创新的 Layer1 区块链新星&#xff0c;Partisia Blockchain 以安全公平标榜&#xff0c;带给加密用户无忧交易的体验环境。对于这样一个融合零知识证明&#xff08;ZK&#xff09;技术和多方计算&#xff08;MPC&#xff09;的全新项目来说&am…

18_SPI通信外设

SPI通信外设 SPI通信外设SPI外设简介SPI框图SPI基本结构主模式全双工连续传输非连续传输 SPI通信外设 SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先…

TypeScript尚硅谷学习

第二章&#xff1a;面向对象 面向对象是程序中一个非常重要的思想&#xff0c;它被很多同学理解成了一个比较难&#xff0c;比较深奥的问题&#xff0c;其实不然。面向对象很简单&#xff0c;简而言之就是程序之中所有的操作都需要通过对象来完成。 举例来说&#xff1a; 操作…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

opc ua 环境构建(记录一)

1、准备 Siemens Simatic WinCC v7.5 二、配置 SIMATIC NET与S7-200 SMART 集成以太网口OPC 通信(TIA平台) 硬件: ①S7-200 SMART ②PC 机 ( 集成以太网卡) 软件: ① STEP 7-Micro/WIN SMART V2.1 ② STEP 7 Professional(TIA Portal V13 SP1 Upd 9) ③ SIMATIC NET …

在直播间卖云,云厂商终于“疯了”

图片&#xff5c;电影《疯狂的石头》截图 ©自象限原创 作者丨程心 云厂商们&#xff0c;在直播间打起来了&#xff01; 继阿里云在罗永浩直播间亮相、京东云硬刚友商之后&#xff0c;腾讯云也开始在“直播间”送起了福利。 4月8日&#xff0c;腾讯云发布新一代AIGC存…

设计基于锁的并发数据结构

1. 线程安全的栈容器 #include <exception> #include <memory> #include <mutex> #include <stack>struct empty_stack : std::exception {const char *what () const throw(); };template <typename T> class threadsafe_stack { private:std:…

记录vite打包并上传到npm

开始 起因&#xff1a;我们单位这个项目用的vitereact使用print打印 开发环境没问题、一到打包时就卡住、所以我就想单独打包成组件在引用看看还有问题么、结果还真可以&#xff01;又是离谱的一天 首先需要把npm的分支切换成官网地址、因为只有官网地址才能登陆npm账号 这里说…

FreeRTOS学习 -- 移植

一、添加FreeRTOS源码 在基础工程中新建一个名为FreeRTOS的文件夹&#xff0c;创建FreeRTOS文件夹以后将FreeRTOS的源码添加到这个文件夹中。 portable 文件夹&#xff0c;只需要保留keil、MemMang 和 RVDS这三个文件夹&#xff0c;其他的都可以删除掉。 移植FreeRTOSConfig…

SimOne协作版正式发布!“云+端”一体化,加速自动驾驶技术迭代!

创新的“云端”一体化方案 让11大于2 两端登录 场景共享 本地算法 云端并发 颠覆传统自动驾驶研发工作方式 加速自动驾驶算法迭代与优化 SimOne协作版正式发布&#xff01; 什么是SimOne协作版&#xff1f; SimOne协作版&#xff0c;一个创新的“云端”一体化产品。 它将…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

如何在rosbag中获取第一帧数据

文章目录 1. 找出感兴趣的话题名2. 在一个终端中启动rosbag play3. 在另一个终端中使用rostopic echo4. 继续播放bag文件&#xff1a; 1. 找出感兴趣的话题名 首先&#xff0c;你需要知道你感兴趣的话题名称。可以通过rosbag info your_bagfile.bag来查看bag文件中包含的话题。…

代码随想录-算法训练营day02【数组02:滑动窗口、螺旋矩阵】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议大家先独立做题&#xff0c;…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

【Vue3语法单文件——自用】

1. Vue3基础语法 <script setup> import { ref,computed } from vue// 定义响应式的变量 const count ref(0) const author ref({name: John Doe,books: [Vue 2 - Advanced Guide,Vue 3 - Basic Guide,Vue 4 - The Mystery] }) //定义props const props defineProps(…

为什么forEach中的await不起作用

在JavaScript的forEach方法中使用await是无效的&#xff0c;因为forEach方法不支持异步操作的等待。 forEach是一个数组的遍历方法&#xff0c;它会对数组中的每个元素依次执行提供的回调函数。而在JavaScript中&#xff0c;await关键字只能在异步函数(async函数)中使用&#…

[RK3399 Linux] 移植Linux 5.2.8内核详解

背景是在RK3399上面移植Rockchip官方提供的u-boot 2017.09 一、linux内核 1.1 源码下载 内核源码下载地址为:《https://www.kernel.org/》: 也可以到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速度更快。 如果下载速度太慢,无法下载,…