博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react动画难写?试试react版transformjs
阅读量:6916 次
发布时间:2019-06-27

本文共 3566 字,大约阅读时间需要 11 分钟。

简介

在非react领域用得风生水起,那么react技术栈的同学能用上吗?答案是可以的。junexie童鞋已经造了个。

动画实现方式

传统 web 动画的两种方式

  1. 纯粹的CSS3 :如:transition/animation+transform(大名鼎鼎的animate.css)
  2. JS + CSS3 transition或者animation:这里第一种一样,只是通过js里add class和remove class去增加或者移除对应的动画
  3. 纯粹JS控制时间轴:第一和第二种都是自带时间轴,使用 setInterval / setTimeout / requestAnimationFrame 不断地修改 DOM 的 style 属性产生动画

对应在react中

使用CSS3

  • 使用 ReactCSSTransitionGroup 来实现
  • 相关动画的class都有对应的state,修改state相当于增加或者移除class,也就相当于js里add class和remove class去增加或者移除对应的动画

纯粹JS控制时间轴

  • 仍然使用 setInterval / setTimeout / requestAnimationFrame,修改某个 state 值,然后映射到 component 的 style 上。

这里很明显,方案1和方案2可应对简单场景(如没有prop change 回调等),方案3可编程性最大,最灵活,可以适合复杂的动画场景或者承受复杂的交互场景。

安装

npm install css3transform-react

API

//set "translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ"render() {    return (        
sth
);}// you can also use other porps, such as "className" or "style"render() { return (
sth
);}

通过上面的声明,就可以设置或者读取"translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ"!

方便吧!

使用姿势

import React, { Component } from 'react';import { render } from 'react-dom';import Transform from '../../transform.react.js';class Root extends Component {  constructor(props, context) {    super(props, context);    this.state = {      el1: {rotateZ: 0},      el2: {rotateY: 0}    };    this.animate = this.animate.bind(this);  }  animate() {    this.setState({      el1: {rotateZ: this.state.el1.rotateZ + 1},      el2: {rotateY: this.state.el2.rotateY + 1}    }, () => {      requestAnimationFrame(this.animate);    });  }  componentDidMount() {    setTimeout(this.animate, 500);  }  render() {    return (      
transformjs
transformjs
); }}render(
, document.getElementById('root'));

更加复杂的详细的使用代码可以看这里:

在线演示

性能对比

因为react版本会有diff过程,然后apply diff to dom的过程,state改变不会整个innerHTML全部替换,所以对浏览器渲染来说还是很便宜,但是在js里diff的过程的耗时还是需要去profiles一把,如果耗时严重,不在webworker里跑还是会卡住UI线程导致卡顿,交互延缓等。所以要看一看CPU的耗时还是很有必要的。

主要是那上面的演示和传统的对比。就是下面这种传统的方式:

var element1 = document.querySelector("#test1");Transform(element1);......function animate() {    element1.rotateZ++;    ...    requestAnimationFrame(animate);}animate();

对两种方式使用chrome profiles了一把。

先看总耗时对比

react:

105416-20161219093619916-74108507.png

传统方式:

105416-20161219093636291-1750787495.png

  • react在8739秒内CPU耗时花费了近似1686ms
  • 传统方式在9254ms秒内CPU耗时花费近似700ms

在不进行profiles就能想象到react是一定会更慢一些,因为state的改变要走把react生命周期走一遍,但是可以看到react的耗时还是在可以接受的范围。但是,我们还是希望找到拖慢的函数来。

那么在使用transformjs react版本中,哪个函数拖了后腿?展开profiles tree可以看到:

105416-20161219093641494-1359005044.png

就是它了。

/**       * Reconciles the properties by detecting differences in property values and       * updating the DOM as necessary. This function is probably the single most       * critical path for performance optimization.       *       * TODO: Benchmark whether checking for changed values in memory actually       *       improves performance (especially statically positioned elements).       * TODO: Benchmark the effects of putting this at the top since 99% of props       *       do not change for a given reconciliation.       * TODO: Benchmark areas that can be improved with caching.       *       * @private       * @param {object} lastProps       * @param {object} nextProps       * @param {?DOMElement} node       */      _updateDOMProperties: function (lastProps, nextProps, transaction) {

打开对应的代码可以看到。注释里已经写了这是优化重点。

开始使用吧

官方网站:

Github地址:

任何问题和意见欢迎给我们。

转载地址:http://scacl.baihongyu.com/

你可能感兴趣的文章
富文本编辑器summernote使用
查看>>
马哥2016全新Linux+Python高端运维班第三周作业
查看>>
linux后台进程启动springboot
查看>>
Seo界神话 360好搜
查看>>
JavaScript闭包
查看>>
datatables服务器端分页
查看>>
用PL/SQL Developer导出表数据的时候,窗口一闪而过解决办法
查看>>
杨辉三角
查看>>
将 Log4j 配置文件放在项目外面
查看>>
nginx日志切割
查看>>
以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(二)
查看>>
客户端bug测试贴
查看>>
java web 开发 编码问题详解
查看>>
python写的发邮件的小程序!
查看>>
Linux入门(四)
查看>>
org.tinygroup.dbfilter
查看>>
实战 MDT 2012(三)---捕获镜像
查看>>
这九份信,送给十八九岁的自己
查看>>
Linux命令汇总之正则表达式
查看>>
VirtualBox 网络互连
查看>>