react動畫難寫?試試react版transformjs

来源:http://www.cnblogs.com/iamzhanglei/archive/2016/12/19/6196328.html
-Advertisement-
Play Games

簡介 "transformjs" 在非react領域用得風生水起,那麼react技術棧的同學能用上嗎?答案是可以的。junexie童鞋已經造了個 "react版本" 。 動畫實現方式 傳統 web 動畫的兩種方式 : 1. 純粹的CSS3 :如:transition/animation+transf ...


簡介

transformjs在非react領域用得風生水起,那麼react技術棧的同學能用上嗎?答案是可以的。junexie童鞋已經造了個react版本

動畫實現方式

傳統 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 (
        <Transform
          translateX={100}
          scaleX={0.5}
          originX={0.5}>
          <div>sth</div>
        </Transform>
    );
}

// you can also use other porps, such as "className" or "style"
render() {
    return (
        <Transform
          translateX={100}
          className="ani"
          style={{width: '100px', background: 'red'}}
          <div>sth</div>
        </Transform>
    );
}

通過上面的聲明,就可以設置或者讀取"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 (
      <div>
        <Transform rotateZ={this.state.el1.rotateZ} className="test" style={{'backgroundColor': 'green'}}>
          transformjs
        </Transform>

        <Transform rotateY={this.state.el2.rotateY} className="test" style={{'backgroundColor': 'red', 'left': '200px'}}>
          transformjs
        </Transform>

      </div>
    );
  }
}

render(
    <Root />,
    document.getElementById('root')
);

更加複雜的詳細的使用代碼可以看這裡:https://github.com/AlloyTeam/AlloyTouch/blob/master/transformjs/react/example/src/index.jsx

線上演示

http://alloyteam.github.io/AlloyTouch/transformjs/react/example/

性能對比

因為react版本會有diff過程,然後apply diff to dom的過程,state改變不會整個innerHTML全部替換,所以對瀏覽器渲染來說還是很便宜,但是在js里diff的過程的耗時還是需要去profiles一把,如果耗時嚴重,不在webworker里跑還是會卡住UI線程導致卡頓,交互延緩等。所以要看一看CPU的耗時還是很有必要的。
主要是那上面的演示和傳統的直接操作dom的方式對比。就是下麵這種傳統的方式:

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

animate();

對兩種方式使用chrome profiles了一把。
先看總耗時對比

react:

傳統方式:

  • react在8739秒內CPU耗時花費了近似1686ms
  • 傳統方式在9254ms秒內CPU耗時花費近似700ms

在不進行profiles就能想象到react是一定會更慢一些,因為state的改變要走把react生命周期走一遍,但是可以看到react的耗時還是在可以接受的範圍。但是,我們還是希望找到拖慢的函數來。
那麼在使用transformjs react版本中,哪個函數拖了後腿?展開profiles tree可以看到:

就是它了。

/**
       * 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) {

打開對應的代碼可以看到。註釋里已經寫了這是優化重點。

開始使用吧

官方網站:http://alloyteam.github.io/AlloyTouch/transformjs/

Github地址:https://github.com/AlloyTeam/AlloyTouch/tree/master/transformjs
任何問題和意見歡迎new issue給我們。



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <filter>: 過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將立即被拋棄不再經過其他過濾器;返回NEUTRAL,有序列表裡的下個過濾器過接著處理日誌;返回ACCEPT,日誌會被立即處理,不再經過剩餘過濾器。 過濾器被添加到<Appe ...
  • 1.假設我們要輸出張三,李四兩個人的基本信息,包括姓名,年齡,可以用以下的C程式實現: eg: 2.假設要輸出很多人的信息,那麼用上面這樣的程式思路實現起來很不方便,可以用數組來實現: eg: 3.假設基本信息的屬性有很多個,還有工作,婚姻狀況等等的屬性,按上面的程式思想,我們就得增加很多用於保存屬 ...
  • 微盤系統,微盤搭建,微盤源碼,微交易系統搭建,微交易源碼,微交易系統, 本公司微交易系統,是基於微信端開發的交易平臺。平臺適用於貴金屬、外匯、原油、期貨…等多個交易品種的投資者,並對接多個移動支付介面,輕鬆解決出入金問題。程式說明:2017新版微交易系統建設,採用新浪數據介面,非常穩定,直接運營版本 ...
  • 閱讀目錄 架構的定義 如何開始設計一個架構 一個好架構的特點 做架構中的誤區 結語 一、架構的定義 所謂一千個架構師中有一千種“最好的架構”模式。 “架構”是我們這行業種一個很常見的詞,表明其必然也是經歷了很長的歲月打磨所形成的一個詞。架構的這個詞出現的意義是什麼?為瞭解決什麼問題?只有把這2個問題 ...
  • 引子 前幾天看到微信後臺團隊分享了TLS相關文章,正好gRPC里TLS數據加密是很重要的一塊,於是整理出了這篇文章。 在gRPC里,如果僅僅是用來做後端微服務,可以考慮不加密。本文太長,先給個大綱。 1. HTTPS,HTTP/2介紹 2. TLS加密原理、實現庫 3. HTTP/2協議協商機制 4 ...
  • 一、Angular特點: 1、雙向數據綁定,主打賣點 2、MVVM 模型,把視圖和邏輯分開 3、依賴註入 個人感覺,在Angular中,視圖對應 HTML 模板,視圖邏輯對應directive 和 controller。 二、模塊 Angular 中通過模塊來管理命名空間,可以通過不同的模塊來隔離不 ...
  • 本文轉載自 http://www.mynawang.com/ 相關代碼可訪問 https://github.com/mynawang/Design-Pattern-Learning 什麼是設計模式 設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的 ...
  • <html> ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...