国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

react動(dòng)畫難寫?試試react版transformjs

elarity / 1679人閱讀

摘要:童鞋已經(jīng)造了個(gè)版本。這里很明顯,方案和方案可應(yīng)對(duì)簡(jiǎn)單場(chǎng)景如沒(méi)有回調(diào)等,方案可編程性最大,最靈活,可以適合復(fù)雜的動(dòng)畫場(chǎng)景或者承受復(fù)雜的交互場(chǎng)景。主要是那上面的演示和傳統(tǒng)的直接操作的方式對(duì)比。注釋里已經(jīng)寫了這是優(yōu)化重點(diǎn)。

簡(jiǎn)介

transformjs在非react領(lǐng)域用得風(fēng)生水起,那么react技術(shù)棧的同學(xué)能用上嗎?答案是可以的。junexie童鞋已經(jīng)造了個(gè)react版本。

動(dòng)畫實(shí)現(xiàn)方式

傳統(tǒng) web 動(dòng)畫的兩種方式

純粹的CSS3 :如:transition/animation+transform(大名鼎鼎的animate.css)

JS + CSS3 transition或者animation:這里第一種一樣,只是通過(guò)js里add class和remove class去增加或者移除對(duì)應(yīng)的動(dòng)畫

純粹JS控制時(shí)間軸:第一和第二種都是自帶時(shí)間軸,使用 setInterval / setTimeout / requestAnimationFrame 不斷地修改 DOM 的 style 屬性產(chǎn)生動(dòng)畫

對(duì)應(yīng)在react中

使用CSS3

使用 ReactCSSTransitionGroup 來(lái)實(shí)現(xiàn)

相關(guān)動(dòng)畫的class都有對(duì)應(yīng)的state,修改state相當(dāng)于增加或者移除class,也就相當(dāng)于js里add class和remove class去增加或者移除對(duì)應(yīng)的動(dòng)畫

純粹JS控制時(shí)間軸

仍然使用 setInterval / setTimeout / requestAnimationFrame,修改某個(gè) state 值,然后映射到 component 的 style 上。

這里很明顯,方案1和方案2可應(yīng)對(duì)簡(jiǎn)單場(chǎng)景(如沒(méi)有prop change 回調(diào)等),方案3可編程性最大,最靈活,可以適合復(fù)雜的動(dòng)畫場(chǎng)景或者承受復(fù)雜的交互場(chǎng)景。

安裝
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
); }

通過(guò)上面的聲明,就可以設(shè)置或者讀取"translateX", "translateY", "translateZ", "scaleX", "scaleY", "scaleZ", "rotateX", "rotateY", "rotateZ", "skewX", "skewY", "originX", "originY", "originZ"!

方便吧!

使用姿勢(shì)
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") );

更加復(fù)雜的詳細(xì)的使用代碼可以看這里:https://github.com/AlloyTeam/AlloyTouch/blob/master/transformjs/react/example/src/index.jsx

在線演示

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

性能對(duì)比

因?yàn)閞eact版本會(huì)有diff過(guò)程,然后apply diff to dom的過(guò)程,state改變不會(huì)整個(gè)innerHTML全部替換,所以對(duì)瀏覽器渲染來(lái)說(shuō)還是很便宜,但是在js里diff的過(guò)程的耗時(shí)還是需要去profiles一把,如果耗時(shí)嚴(yán)重,不在webworker里跑還是會(huì)卡住UI線程導(dǎo)致卡頓,交互延緩等。所以要看一看CPU的耗時(shí)還是很有必要的。
主要是那上面的演示和傳統(tǒng)的直接操作dom的方式對(duì)比。就是下面這種傳統(tǒng)的方式:

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

animate();

對(duì)兩種方式使用chrome profiles了一把。
先看總耗時(shí)對(duì)比

react:

傳統(tǒng)方式:

react在8739秒內(nèi)CPU耗時(shí)花費(fèi)了近似1686ms

傳統(tǒng)方式在9254ms秒內(nèi)CPU耗時(shí)花費(fèi)近似700ms

在不進(jìn)行profiles就能想象到react是一定會(huì)更慢一些,因?yàn)閟tate的改變要走把react生命周期走一遍,但是可以看到react的耗時(shí)還是在可以接受的范圍。但是,我們還是希望找到拖慢的函數(shù)來(lái)。
那么在使用transformjs react版本中,哪個(gè)函數(shù)拖了后腿?展開(kāi)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) {

打開(kāi)對(duì)應(yīng)的代碼可以看到。注釋里已經(jīng)寫了這是優(yōu)化重點(diǎn)。

開(kāi)始使用吧

官方網(wǎng)站:http://alloyteam.github.io/AlloyTouch/transformjs/

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86540.html

相關(guān)文章

  • AlloyTouch 0.2.0發(fā)布--魚(yú)和熊掌兼得

    摘要:主要更新版本已經(jīng)支持事件回調(diào)了魚(yú)和熊掌兼得慢,什么是魚(yú)什么是熊掌魚(yú),性能。讀取當(dāng)觸發(fā)了之后,會(huì)去清除定時(shí)器。這里需要注意,當(dāng)用戶傳了配置,會(huì)延遲清除定時(shí)器,因?yàn)樾U倪^(guò)程需要。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司師姐昨日在KM發(fā)了篇長(zhǎng)文,主要結(jié)論RAF+transform3d就...

    csRyan 評(píng)論0 收藏0
  • AlloyTouch 0.2.0發(fā)布--魚(yú)和熊掌兼得

    摘要:主要更新版本已經(jīng)支持事件回調(diào)了魚(yú)和熊掌兼得慢,什么是魚(yú)什么是熊掌魚(yú),性能。讀取當(dāng)觸發(fā)了之后,會(huì)去清除定時(shí)器。這里需要注意,當(dāng)用戶傳了配置,會(huì)延遲清除定時(shí)器,因?yàn)樾U倪^(guò)程需要。 原文鏈接:https://github.com/AlloyTeam/AlloyTouch/wiki/AlloyTouch-0.2.0 背景 公司師姐昨日在KM發(fā)了篇長(zhǎng)文,主要結(jié)論RAF+transform3d就...

    shevy 評(píng)論0 收藏0
  • 關(guān)于單頁(yè)面應(yīng)用一些隨想

    摘要:前面不短時(shí)間持續(xù)投入了時(shí)間在做應(yīng)用架構(gòu)方面的考量一個(gè)是冒險(xiǎn)進(jìn)行了一次應(yīng)用架構(gòu)的調(diào)整另一個(gè)是跟進(jìn)了的進(jìn)展當(dāng)然實(shí)際上是同一個(gè)事情也許錯(cuò)過(guò)的比收獲的還多一些不過(guò)能走到現(xiàn)在也算幸運(yùn)了畢竟單頁(yè)面應(yīng)用還面臨很多不成熟之處國(guó)慶長(zhǎng)假過(guò)去不少現(xiàn)在的想法估計(jì)會(huì) 前面不短時(shí)間持續(xù)投入了時(shí)間在做 React 應(yīng)用架構(gòu)方面的考量一個(gè)是冒險(xiǎn)進(jìn)行了一次應(yīng)用架構(gòu)的調(diào)整, 另一個(gè)是跟進(jìn)了 Redux 的進(jìn)展當(dāng)然, 實(shí)際...

    AaronYuan 評(píng)論0 收藏0
  • 超級(jí)小的web手勢(shì)庫(kù)AlloyFinger發(fā)布

    摘要:擁有兩個(gè)版本,無(wú)依賴的獨(dú)立版和版本。除了對(duì)象,也可監(jiān)聽(tīng)內(nèi)元素的手勢(shì)需要引擎內(nèi)置對(duì)象支持綁定相關(guān)事件。據(jù)不完全統(tǒng)計(jì),目前服務(wù)于興趣部落群動(dòng)漫騰訊學(xué)院騰訊等多個(gè)部門團(tuán)隊(duì)和項(xiàng)目。也可以在事件回調(diào)里根據(jù)攜帶的信息使用去操作。 簡(jiǎn)介 針對(duì)多點(diǎn)觸控設(shè)備編程的Web手勢(shì)組件,快速幫助你的web程序增加手勢(shì)支持,也不用再擔(dān)心click 300ms的延遲了。擁有兩個(gè)版本,無(wú)依賴的獨(dú)立版和react版本。...

    ymyang 評(píng)論0 收藏0
  • CSS相關(guān)文章

    摘要:如何用獲取虛擬鍵盤高度前端早讀課月號(hào)早讀文章由湯谷投稿分享。大殺器和把動(dòng)畫轉(zhuǎn)換成原生動(dòng)畫初來(lái)乍到,本文搬運(yùn)自我月份在知乎發(fā)的文章。 前端面試之 CSS3 新特性 除了 HTML5 的新特性,CSS3 的新特性也是面試中經(jīng)常被問(wèn)到的。 如何用 js 獲取虛擬鍵盤高度?-前端早讀課 9月7號(hào)早讀文章由@湯谷投稿分享。正文從這開(kāi)始~ 這是一個(gè)存在很久的歷史問(wèn)題了,對(duì)于這樣一個(gè)具有普遍性的問(wèn)題...

    FrozenMap 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<