首页 > 编程语言 >vue源码阅读—13—扩展之transition

vue源码阅读—13—扩展之transition

时间:2022-08-16 19:22:56浏览次数:74  
标签:13 vue transition 源码 fade enter active data css


 

 

    <style>
      .fade-enter-active,
      .fade-leave-active {
        transition: opacity 5s;
      }
      .fade-enter,
      .fade-leave-to {
        opacity: 0;
      }
    </style>    


<script>
      let vm = new Vue({
        el: "#app",
        template:
          '<div id="demo">' +
          '<button v-on:click="show = !show">' +
          "Toggle" +
          "</button>" +
          '<transition :appear="true" name="fade">' +
          '<p v-if="show">hello</p>' +
          "</transition>" +
          "</div>",
        data() {
          return {
            show: true,
          };
        },
      });
 </script>

 

 transition组件功能:本身不提供动画,动画需要用户自己写;主要是在不同的情况下自动调用css,实现过渡效果;

 

 

一、流程

在transition组件的render阶段,执行render阶段,先通过插槽,拿到transition组件里的子节点;

 

 拿到第一个子节点;

判断transition是否是一个组件的根节点

 

给p标签添加一个key属性_transition-1-p;

 

通过extractTransitionData方法获取一个值,并赋值给child.data.transition属性; 

 

 extractTransitions方法主要是,定义一个data对象,这个把所有vm.options.propsData(就是我们在占位符组件上定义的属性)都重新赋值给data。

如果有._partentListeners就是我们在占位符组件上调用的监听事件,也可以说是钩子函数,before-enter、enter、after-enter、enter-cancelled等等;

 

 

 最后一个返回一个子节点的vnode,vnode.data.transition是有值的;

 

 然后我们会执行invokeCreateHooks方法,然后就会调用_enter函数,然后因为vnode.data.show是undefined,所以执行enter(vnode);

 

 在enter方法中,会执行resolveTransition方法,它会给这个对象拓展很多属性,比如enterAcitveClass;

 

 

 拿到过渡动画,即我们定义的css;

"fade-enter"

fade-enter-active"

"fade-enter-to"

 

然后开始获取钩子函数,但是因为我们没有定义transition组建的钩子函数,所以都为undefined; 

 

 先执行beforeEnterHook,因为没有定义钩子函数,所以不执行;

 

 

 然后给el也就是p标签添加startSlass, 也就是我们自己定义的fade-enter  css属性,

 

 然后再添加fade-enter-active属性;

 

然后会执行nextFrame,

先把startClass 即fade-start给删除掉,因为已经到了active的时候了。

然后再吧toClass添加进去; 

然后等到css属性里的transition执行完,开始执行whenTRansitionEnd方法;

所以说呀,动画过渡这些效果还是css本生提供的,vue只是帮助我们自动在合适的时机调动这个css而已;

 

 

 这个方法主要是执行我们定义的cb回调函数;

然后这个回调函数把toClass和activeClass都删除掉;

 

 然后如果有afterEnterHook钩子还会调用;

 

 然后结束;

 

 

 

 

 

 

二、总结

 

标签:13,vue,transition,源码,fade,enter,active,data,css
From: https://www.cnblogs.com/EricShen/p/16592676.html

相关文章

  • antd-vue table 表头同时存在sorter,Slots 排序升序失效“”解决“”
     产品给出的需求是这个客户数同时有提示跟升序于是乎我用了 Slots自定义表头但是发现排序只能降序无法升序 后来发现是排序的事件绑定到了自定义表头上面去了 ......
  • vue 上传文件并读取文件内容(支持txt,xlsx,doc)
        安装依赖npminstallxlsxnpmimammoth--save引入importXLSXfrom'xlsx'import*asmammothfrom'mammoth' <divstyle="display:fl......
  • java线程池源码阅读
    说明简单理解和使用可以参考:https://www.cnblogs.com/LQBlog/p/8735356.html类图接口Executor接口publicinterfaceExecutor{/***代表提交了一个任......
  • idea中jar包关联源码
    1、问题描述idea中jar包关联源码,方便查看了解源码,记录下。2、问题说明springboot源码包,直接zip下载就好了。下载地址:https://github.com/spring-projects/spring-boot......
  • C++primer练习13.49-54
    练习13.49为你的String类添加一个移动构造函数和一个移动赋值运算符String(String&&a):elements(std::move(a.elements)),first_free(std::move(a.first_free)),cap(st......
  • vue学习之------兄弟组件通过EventBus共享数据
    1、先安装mitt依赖包npmimitt@2.1.02、写一个公共的引入mitt的js文件 3、父组件 4、发送数据:BroOnebus.emit(" 约定好的事件名称",要发送的数据) 5......
  • vue3引入axios
    1.下载axiosnpminstallaxios--save2.在scr目录下自定义一个request文件夹  3.在刚刚建的文件夹中创建一个引入axios的api.js文件4.api.js里......
  • vue 白屏问题汇总及解决方案
    常见的出现白屏的原因有哪些vue项目打包的路径问题解决:vue.config.js中publicPath:''./"路由重复或者没有配置路由(1)由于把路由模式mode设置成history了,默认是ha......
  • VUE+Django前后端分离-第四部分【后台数据如何展示在前端table表格中】
    一、后端返回数据后端返回的数据格式如下:{"msg":"success","data":[{"rule":1,"result":"exception",......
  • Dubbo源码(八) - 负载均衡
    前言本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo负载均衡,英文名称为LoadBalance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行......