Vue CLI $nextTick 过渡与动画

news2024/11/27 2:39:49

3.12.$nextTick

这是一个生命周期钩子

**this.$nextTick(回调函数)**在下一次DOM更新结束后执行其指定的回调

什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行

使用 $nextTick 优化 Todo-List

src/components/MyItem.vue

<template>
    <li>
       <label>
           <!-- 如下代码也能实现功能,但是不太推荐,因为有点违反原则,因为修改了props -->
           <!-- <input type="checkbox" v-model="todo.done"/> -->
           <input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)">
           <span v-show="!todo.isEdit">{{todo.title}}</span>
           <input
                   type="text"
                   v-show="todo.isEdit"
                   :value="todo.title"
                   @blur="handleBlur(todo, $event)"
                   ref="inputTitle"
           />
       </label>
        <button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
        <button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button>
    </li>
</template>

<script>
    import pubsub from 'pubsub-js';

    export default {
        name: "Item",
        // 声明接收todo
        props:['todo'],
        methods: {
            // 勾选or取消勾选
            handleCheck(id) {
                // 通知App组件将对应的todo对象的done值取反
                this.$bus.$emit('checkTodo',id);
            },
            // 删除
            handleDelete(id){
                if(confirm('确定删除吗?')) {
                    // 通知App组件将对应的todo对象删除
                    pubsub.publish('deleteTodo', id) // 发布消息
                }
            },
            // 编辑
            handleEdit(todo) {
                //  判断是否有isEdit属性
                if (todo.hasOwnProperty("isEdit")) {
                    todo.isEdit = true;
                } else {
                    console.log("todo身上没有isEdit")
                    this.$set(todo, "isEdit", true);
                }
                // 在下一次DOM更新借宿后执行其指定的函数
                this.$nextTick(function () {
                    this.$refs.inputTitle.focus();
                });
            },
            // 失去焦点回调(真正执行修改逻辑)
            handleBlur(todo, e) {
                todo.isEdit = false;
                if (!e.target.value.trim()) return alert("输入不能为空!");
                console.log(todo.id, e.target.value);
                this.$bus.$emit('updateTodo', todo.id, e.target.value);
            }
        }
    }
</script>

在这里插入图片描述

3.13.过渡与动画

Vue封装的过度与动画:在插入、更新或移除DOM元素时,在合适的时候给元素添加样式类名

在这里插入图片描述

写法

  1. 准备好样式
    1. 元素进入的样式
      1. **v-enter ** 进入的起点
      2. v-enter-active 进入过程中
      3. **v-enter-to ** 进入的终点
    2. 元素离开的样式
      1. **v-leave ** 离开的起点
      2. **v-leave-active ** 离开过程中
      3. v-leave-to 离开的终点
  2. 使用<transition>包裹要过度的元素,并配置name属性,此时需要将上面样式名的v换为name
  3. 要让页面一开始就显示动画,需要添加appear
    <transition name="hello" appear> 
      <h1 v-show="isShow">你好啊!</h1>
    </transition> 
    <style> 
      .hello-enter-active { 
        animation: hello 0.5s linear; 
      }
      .hello-leave-active { 
        animation: hello 0.5s linear reverse; 
      }
      @keyframes hello { 
        from { 
          transform: translateX(-100%); 
        } 
        to { 
          transform: translateX(0px); 
        }
      }
    </style>
    
  4. 备注:若有多个元素需要过度,则需要使用<transition-group>,且每个元素都要指定key
    <transition-group name="hello" appear> 
      <h1 v-show="!isShow" key="1">你好啊!</h1> 
      <h1 v-show="isShow" key="2">尚硅谷!</h1> 
    </transition-group>
    
  5. 第三方动画库Animate.css
    <transition-group appear 
      name="animate__animated animate__bounce" 
      enter-active-class="animate__swing"
      leave-active-class="animate__backOutUp">
      <h1 v-show="!isShow" key="1">你好啊!</h1> 
      <h1 v-show="isShow" key="2">尚硅谷!</h1> 
    </transition-group>
    

src/App.vue

<template>
    <div> 
        <Test/>
        <Test2/>
        <Test3/>
    </div>
</template> 

<script> 
    // 引入组件
    import Test from './components/Test';
    import Test2 from './components/Test2';
    import Test3 from './components/Test3';

    export default { 
        name:'App',
        components: {
            Test,
            Test2,
            Test3
        }
    }
</script>

src/components/test.vue

<template>
    <div>
        <button @click="isShow = !isShow">显示/隐藏</button>
        <transition name="hello" appear>
            <h1 v-show="isShow">你好啊!</h1>
        </transition>
    </div>
</template>

<script>
    export default {
        name: 'Test',
        data() {
            return {
                isShow: true
            }
        }
    }
</script>

<style scoped>
    h1 {
        background-color: orange;
    }
    .hello-enter-active { 
        animation: atguigu 0.5s linear; 
    }
    .hello-leave-active { 
        animation: atguigu 0.5s linear reverse; 
    }
    @keyframes atguigu { 
        from {
            transform: translateX(-100%);
        } 
        to {
            transform: translateX(0px);
        } 
    }
</style>

src/components/test2

<template>
    <div>
        <button @click="isShow = !isShow">显示/隐藏</button>
        <transition-group name="hello" appear>
            <h1 v-show="!isShow" key="1">你好啊!</h1>
            <h1 v-show="isShow" key="2">尚硅谷!</h1>
        </transition-group>
    </div>
</template>

<script>
    export default {
        name: 'Test2',
        data() {
            return {
                isShow: true
            }
        }
    }
</script>

<style scoped>
    h1 {
        background-color: orange;
        /* transition: 0.5s linear; */
    }
    /* 进入的起点、离开的终点 */
    .hello-enter,.hello-leave-to { 
        transform: translateX(-100%);
    }
    .hello-enter-active,.hello-leave-active{ 
        transition: 0.5s linear; 
    }
    /* 进入的终点、离开的起点 */ 
    .hello-enter-to,.hello-leave { 
        transform: translateX(0); 
    }
</style>

在这里插入图片描述

src/components/test3

<template>
    <div>
        <button @click="isShow = !isShow">显示/隐藏</button>
        <transition-group
                appear
                name="animate__animated animate__bounce"
                enter-active-class="animate__bounce"
                leave-active-class="animate__backOutUp"
        >
            <h1 v-show="!isShow" key="1">你好啊!</h1>
            <h1 v-show="isShow" key="2">尚硅谷!</h1>
        </transition-group>
    </div>
</template>

<script>
    import "animate.css";
    
    export default {
        name: 'Test3',
        data() {
            return {
                isShow: true
            }
        }
    }
</script>

<style scoped>
    h1 {
        background-color: orange;
        /* transition: 0.5s linear; */
    }
</style>

使用动画优化 Todo-List

src/components/MyList.vue

<template>
    <ul class="todo-main">
        <transition-group name="todo" appear>
            <MyItem v-for="todoObj in todos" :key="todoObj.id" :todo="todoObj"/>
        </transition-group>
    </ul>
</template>

<script>
    import MyItem from './MyItem';
    
    export default {
        name: "List",
        components: {
            MyItem
        },
        props:['todos']
    }
</script>

<style scoped>
    .todo-main {
        margin-left: 0px;
        border: 1px solid #ddd;
        border-radius: 2px;
        padding: 0px;
    }
    .todo-empty {
        height: 40px;
        line-height: 40px;
        border: 1px solid #ddd; 
        border-radius: 2px;
        padding-left: 5px;
        margin-top: 10px;
    }
    .todo-enter-active {
        animation: liqb 0.5s linear;
    }
    .todo-leave-active {
        animation: liqb 0.5s linear reverse;
    }
    @keyframes liqb {
        from {
            transform: translateX(-100%);
        }
        to {
            transform: translateX(0px);
        }
    }
</style>

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

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

相关文章

【UE 从零开始制作坦克】2-控制坦克移动(简单的移动效果)

效果 步骤 1. 新建蓝图类&#xff0c;父类选择“VehicleWheel&#xff08;载具车轮&#xff09;” 这里就命名为“TankWheel” 双击打开“TankWheel”&#xff0c;设置形状半径为40 2. 打开 “BP_West_Tank_M1A1Abrams” 选中“网格体&#xff08;VehicleMesh&#xff09;&…

DeepSurvk部署教程

DeepSurvk部署教程 作者:千树、Totoro github项目地址 https://github.com/arturomoncadatorres/deepsurvk Pypi项目地址 https://pypi.org/project/deepsurvk/ 一、DeepSurvk简介 项目作者原话(翻译) DeepSurv 是一种 Cox 比例风险深度神经网络&#xff0c;用于模拟患者协变…

某网站指纹反爬处理

一、问题分析 【疑惑】&#xff1a;使用python的requests库发起get或post请求返回403代码错误&#xff0c;使用postman发起请求发现状态码<200>竟然成功了。这是什么原因&#xff1f;首先排除ip问题&#xff0c;ip有问题的话postman也访问不了。难道是headers出现了问题…

VanillaNet实战:使用VanillaNet实现图像分类

文章目录 摘要安装包安装timm安装 grad-cam 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文翻译&#xff1a;https://blog.csdn.net/m0_47867638/article/details/131057152 官方源码&#xff1a;https://github.com/huawei-noah/VanillaNet VanillaNet…

【送书福利-第十二期】机工社Python与AI好书来袭!~

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、认识AI…

SQL Server 数据加密功能解析

数据加密是数据库被破解、物理介质被盗、备份被窃取的最后一道防线&#xff0c;数据加密&#xff0c;一方面解决数据被窃取安全问题&#xff0c;另一方面有关法律要求强制加密数据。SQL Server的数据加密相较于其他数据库&#xff0c;功能相对完善&#xff0c;加密方法较多。通…

技术背后的温度,夸克App升级智能、普惠、公益高考服务

夸克2023高考信息服务进行了全面升级&#xff0c;通过信息查询、填报工具及专家指导等多维度产品及内容&#xff0c;给考生打造个性化、全周期、全链路的智能信息服务&#xff0c;以提升考生和家长志愿决策的效率。 6月14日&#xff0c;夸克App升级智能选志愿、志愿表等高考信息…

【Java基础学习打卡06】编程语言

目录 引言一、计算机语言是什么&#xff1f;二、计算机语言分类三、计算机语言介绍1.C语言2.C语言3.Java语言4.Python语言 总结 引言 本文主要是理解计算机语言是什么&#xff0c;有哪些分类&#xff0c;分类下有哪些编程语言&#xff0c;以及了解主流的编程语言。 一、计算机…

【源码可分享】教你用Python制作自动答题脚本,实现自动答题,100%正确率!

文章目录 前言一、自动答题的原理二、自动答题的步骤三、Python实现自动答题的方法总结 前言 当今社会&#xff0c;人们的生活越来越依赖于计算机技术&#xff0c;而Python作为一种高级编程语言&#xff0c;已经成为了众多程序员的首选语言。Python具有简单易学、代码简洁、可…

【Java基础学习打卡08】Java语言跨平台原理

目录 引言一、Java程序运行机制二、Java虚拟机三、Java跨平台总结 引言 Java语言编程的一大优势便是跨平台&#xff0c;本文将介绍Java语言是如何实现跨平台的。 一、Java程序运行机制 计算机高级语言按照程序的执行方式可以分为编译型语言和解释型语言。 编译型语言&#x…

一、PyTorch基础

一、PyTorch基本操作 1&#xff0c;导包 import torch2&#xff0c;查看版本号 torch.__version__ """ 2.0.1cpu """3&#xff0c;初始化(全零)矩阵 x torch.empty(3,2) x """ tensor([[7.2868e-44, 8.1275e-44],[6.7262e-4…

教你用Fiddler捕获HTTPS请求

安装Fiddler 这里不特别说明了&#xff0c;网上搜索一大把&#xff0c;根据安装引导一步步安装即可。&#xff08;这里采用的是fiddler v4.6&#xff09; 配置Fiddler 1、打开fiddler配置Tools –>Telerik Fiddler Options。 如果你想学习Fiddler抓包工具&#xff0c;我这…

vue基础--重点

&#xff01;1、vue的特性 &#xff01;2、v-model 双向数据绑定指令 &#xff08;data数据源变化&#xff0c;页面变化&#xff1b; 页面变化&#xff0c;data数据源也变化&#xff09; 1、v-model 会感知到 框中数据变化 2、v-model 只有在表单元素中使用&#xff0c;才能…

CSS体验透视效果

CSS体验透视效果 使用css视距属性perspective结合动画效果实现透视效果。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…

金融数字化转型将驶向何处?存储如何保驾护航?

文 | 螳螂观察 作者 | 李永华 “XX行业数字化进入深水区”&#xff0c;经常被谈及。 在金融行业&#xff0c;“深水区”说法却很少出现——这里的数字化始终在“深水区”。 作为数字经济的重要组成部分&#xff0c;金融行业一直走在数字化转型的前沿&#xff0c;总是有新的…

11-执行上下文和执行栈

一、执行上下文 &#x1f35f;&#x1f35f;&#x1f35f;是一种对js代码执行环境的抽象概念 只要有js代码运行&#xff0c;一定是运行在执行上下文中 执行上下文的类型分为三种&#xff1a; 全局执行上下文&#xff1a;只有一个&#xff0c;浏览器中的全局对象就是 window对…

汽车电子Autosar之DTC

目录 一、DTC基本介绍 1、DTC基本组成 2、DTC故障类型 3、DTC与event区别与联系 4、 DTC状态位 5. DTC信息存储 6. DTC信息及状态读取 本文将聚焦于大家都耳熟能详的DTC&#xff08;Diagnostic Trouble Code&#xff09;技术点来聊一聊。 一、DTC基本介绍 DTC顾名思义即…

List of MediaTek systems on chips

这里写目录标题 ARMv7Single coreDual-coreQuad-coreHexa-core and octa-core(六核和八核) ARMv8Quad-coreOcta coreHelio X Series (2014–2017)Helio A Series (2018–2020)Helio P Series (2015–2020)Helio G Series (2019–present)Dimensity Series (2020–present)Dimen…

SimpleCG绘图函数(8)--绘制多边形

在这里将展示多边形的绘制&#xff0c;多边形可以绘制从三角形到任意多边形。绘制函数如下所示: //多边形以一组POINT表示的点坐标数组ptPoints为顶点&#xff0c;nNum表示数组中的点数量//画无填充多边形 void polygon( const POINT *ptPoints, int nNum );//画无边框填充多边…

Android进阶 四大组件的工作过程(三):广播的注册,发送和接收过程

Android进阶 四大组件的工作过程&#xff08;三&#xff09;&#xff1a;广播的注册&#xff0c;发送和接收过程 导语 本篇文章是介绍四大组件工作过程的第三篇文章&#xff0c;在前两篇文章里我们已经介绍了Activity和Service的工作流程。而本篇文章&#xff0c;我们将介绍广…