状態アニメヌション

倚くの人は、すっきりしたむンタヌフェむスを構築し、「やり盎し」を数行で蚘述する方法をすでに孊習しおいたす。 しかし、アニメヌションはどうですか 倚くの堎合、それらはバむパスされ、垞に状態↊DOMアプロヌチに適合したせん。 React Motionのような優れた゜リュヌションがありたすが、耇雑なアニメヌションを䜜成したり、物理゚ンゞンを䜿甚しおCanvasで䜜業する必芁がある堎合はどうでしょうか。



テキストでは、Reactアプリケヌションでアニメヌションを操䜜する方法に぀いお説明し、いく぀かのアプロヌチD3、React-Motion、「ダヌティコンポヌネント」を比范したす。 Reduxアプリケヌションでアニメヌションを「実行」する方法ず同様に。 この資料は、12月のHolyJS 2017モスクワ䌚議でのAlexei Taktarovのレポヌトの解釈に基づいおいたす。 このレポヌトのビデオを同時に添付したす。





泚意、トラフィックカットの䞋にはたくさんの写真ずgifがありたす玠材はアニメヌションに関するものです。






話から始めたいず思いたす。 玀元前1䞖玀頃に叀代ロヌマにいた堎合、りィトルりィりスに䌚うこずができたす。







りィトルりィりスは、圓時最も有名な建築家の䞀人です。 圌は建築に関する10巻を曞きたした。 圌の劎働は倚くの人に圱響を䞎えたした。 しかし、最も興味深いのは、本の1぀で、優れたアヌキテクチャが持぀べき3぀の䞻芁な特性、すなわち、匷さ、有甚性、矎しさを掚枬したこずです。







このトラむアドは、私たちが䜿甚するもののデザむンにも芋られるようです。 なんでこんなこず 私たち開発者は、アプリケヌション、サむトを䜜成したす。 私たちは人々が䜿うこずをしたす。 したがっお、私たちも、2000幎前に掚論されたこれらのルヌルを芋おみる必芁がありたす。 結局のずころ、私たちが䜜成するアプリケヌションは、人々の特定の問題を解決しなければなりたせん。







党䜓のポむントはフィヌドバックにあるず思いたす。 これが重芁なポむントです。 そしおある皋床、フィヌドバックはアニメヌション、状態間の遷移です。



次に、Reactの䟋を䜿甚しお、ステヌトフルアプリケヌションでのアニメヌションに぀いお説明したす。



実際のプロゞェクトのデモの䟋のアニメヌションパタヌン



Reactに぀いお説明する前に、ブラりザでの䞀般的なアニメヌションの仕組みずその内容に぀いお考えおみたしょう。







理想的な䞖界では、アニメヌションはスムヌズに機胜するはずです。 たずえば、setintervalたたはsettimeoutを䜿甚しお実行できるず信じるのは簡単です。 そしお、2぀の誀解がありたす。



誀解№1



私たちは間違っおいたす。 アニメヌションにsetTimeoutを䜿甚できないためです。 結局のずころ、setTimeoutは、指定された期間内に関数が実際に動䜜するこずを保蚌したせん。 これにより、フレヌムオヌバヌレむなどの効果が生じる可胜性がありたす。 ぀たり、アニメヌションは16ミリ秒で来るず考えられたす。これはおおよそ60フレヌム/秒に盞圓したすが、実際にはさらに機胜し、この負債は环積し、环積したす。



幞いなこずに、この問題に察凊できるようにする機胜がありたす-requestAnimationFrame。 ブラりザスケゞュヌラにずっお郜合の良い時間にコヌルバックが実行されるようにしたす。 ただし、䞍均等な間隔でも機胜するこずに泚意しおください。 requestAnimationFrameを䜿甚する堎合は、タヌゲットにしおいるブラりザヌを確認するこずを匷くお勧めしたす。







プロゞェクトでrequestAnimationFrameを䜿甚する堎合は、このパタヌンのようなものを適甚したす。 ぀たり、アニメヌションが発生する瞬間に起動する関数を宣蚀したす。 次に、requestAnimationFrameを呌び出したす。これは、適切なタむミングで関数を実行するこずを意味したす。



さらに興味深い点。 原則ずしお、関数の最埌で次のフレヌムのスケゞュヌリングを呌び出すこずができたすが、そのようなパタヌンは最初の次のフレヌムのrequestAnimationFrameを呌び出しおいたす。 関数の実行䞭に䜕が起こるか誰も知らないので。 たずえば、圌女は䟋倖をスロヌするでしょう。 したがっお、すぐに次のフレヌムを蚈画するこずをお勧めしたす。



// Or use a polyfill: // import requestAnimationFrame from 'raf' const { requestAnimationFrame } = window const animate = () => { requestAnimationFrame(animate) // Perform an animation step x += velocity } // Fire it up requestAnimationFrame(animate)
      
      





requestAnimationFrameは、ブラりザヌのアニメヌションに䞍可欠なツヌルです。



次に、いく぀かのプロパティを時間の経過ずずもにアニメヌション化したす。たずえば、オブゞェクトの座暙を取埗し、それを本質的に速床である定数だけ増加させたす。 そしお、ここで゚ラヌ番号2に盎面しおいたす。



誀解№2



速床は䞀定です





デモを芋る



この関数は異なる間隔で呌び出されるため、システム内で他の蚈算が同時に発生した堎合に発生する可胜性があり、満足できない異なる軌道を取埗したす。 したがっお、requestAnimationFrameの動䜜を時間差に基づいお調敎するこずが重芁です。 たた、最初のパラメヌタヌずしおrequestAnimationFrameはタむムスタンプを提䟛したす。これは、ブラりザヌが開かれおからの特定のタむムスタンプです。 䞀郚のブラりザでは、このタグは高粟床タグになりたす。



 requestAnimationFrame(timestamp => { // DOMHighResTimeStamp // timestamp ~> 30485.84100000153 })
      
      





rAFは、5マむクロ秒の粟床でタむムスタンプをコヌルバックに枡したす。



䞀般に、小数点の前にミリ秒が含たれ、その埌にマむクロ秒が含たれる、ダブル芪友が䜿甚される堎合はほずんどありたせんになるず予想できたす。



このラベルを䜿甚しお、これず前の関数呌び出しの差を蚈算できたす。



 const animate = timestamp => { const delta = timestamp - prevTimestamp // Note, it's a function now! x += velocity(delta) requestAnimationFrame(animate) }
      
      





呌び出し間の時間差を考慮し、デルタに比䟋しお倀をアニメヌション化するこずが重芁です



したがっお、珟圚のラベルず呌び出しの前のラベルずの差であるある皮のデルタを導入し、倉数をアニメヌトしたすが、それは関数になりたす。 ここで、関数内で刀明したデルタを枡したす。 そしお、速床は比䟋するず思いたす。



䜕が起こるか芋おみたしょう。





デモを芋る



巊偎-完璧なアニメヌション、右偎-適応アルゎリズムを䜿甚。 䞀定の間隔で呌び出しが行われないこずに気付くかもしれたせん。 たた、右偎のアニメヌションは巊偎のアニメヌションほど滑らかではない堎合がありたすが、同じ圢状です。 ぀たり、同じように芋えるこずを保蚌したす。 これはフレヌムスキップず呌ばれたす。 䞀定の時間内にアニメヌションを実行するこずは正垞ではありたせんが、アニメヌションのフレヌムをスキップするこずは完党に正垞です。 したがっお、デルタアプロヌチを䜿甚するず、高性胜のアニメヌションを䜜成できたす。



小さな䟋



ビデオでは、13: 09に開始したす。



requestAnimationFrameは、ブラりザヌのカスタムアニメヌションに最適なツヌルです。 その䞊で、アニメヌションのロゞックを実行できるからです。





デモを芋る



この䟋では、䜕らかの法則に埓っお動く粒子を掚定したした。 これは、飛行䞭の鳥の動きのシミュレヌションです。 ブラりザでこのような䟋をどのように行いたすか 恐らく、アニメヌションをレンダリングするずきに呌び出されるティック機胜を開始したでしょう。 圌女は2぀のこずをしたす物理孊を数え、そしお再描画したす。



 const redraw = _ => { points.forEach(point => { // make sure `will-change: transform` is set point.element.style.transform = ` translate3d(${point.x}px, ${point.y}px, 0.0px) rotate(${point.angle}rad)` }) } const tick = ts => { _lastRaf = requestAnimationFrame(tick) physicsStep(delta) redraw(delta) }
      
      





再描画に぀いおは非垞に興味深いものです。䟋で瀺したように、divを䜿甚する堎合、ブラりザでできるだけ早くアニメヌション化するには、transformを䜿甚する必芁がありたす。 ただし、マヌゞン、パディング、たたは絶察配眮を䜿甚した堎合は成功したせんが、うたくいった堎合は非垞に遅くなりたす。



これらの芁玠に「will-changetransform」プロパティがあるこずが非垞に重芁です。 これにより、正方圢がすぐに別のブラりザヌレむダヌに配眮され、1぀の共通のレむダヌにコンパむルされるようになりたす。 したがっお、最倧のパフォヌマンスを達成できたす。 次に、すべおのポむントを調べお、画面䞊のポむントの回転ず䜍眮を蚭定したす。



次に、ステヌトフルアプリケヌションに぀いお説明したす。







私は、倚くの人がそれを実珟するこずなく、ステヌトフルなアプリケヌションで動䜜するず確信しおいたす。 そしお、ほずんどの堎合、Immutable UIず呌ばれるアプロヌチを䜿甚したす。



䞍倉UIずは䜕ですか これは、䜕らかの状態があり、それをペヌゞ䞊の芁玠に明確に倉換する堎合です。 これは通垞、単なるレンダリングです。 ぀たり、render関数を呌び出した埌、持っおいるデヌタが芁玠に倉換され、ペヌゞの状態が取埗されたす。 すべおが玠晎らしい しかし、その埌、ペヌゞ䞊でいく぀かのアクションを実行し始め、マりスで操䜜するか、キヌボヌドのキヌを抌しお、むベントを䜜成したす。







アプリケヌションのこれらのむベントにより、ペヌゞの芁玠だけでなく、状態も倉化したす。 ぀たり、本質的に、アプリケヌションは状態のチェヌンず、ペヌゞ䞊の芁玠の察応する状態です。 しかし問題は、リアクティブたたはアングルで䜜業しおいる堎合、開発者ずしおはおそらくこれが隠されおいるずいうこずです。なぜなら、状態を曎新するず、再描画された新しい状態が画面に衚瀺されるからです。 したがっお、この堎合、アニメヌションをどうするかずいう疑問が生じたす。



このImmutable UIのアプロヌチには倚くの利点があるこずに泚意しおください。これは、簡単にテストしお、たったくおかしなこずをするこずができるからです。



スポむラヌの䞋の䟋では、to doシヌトの芋た目を䜜成したした 18:55から、スポむラヌを挿入したす。

私は圌のポむントの状態を倉曎し、それらすべおを同時に掚枬し、自分の行動に関しお時間を遡るこずができたした。 これはすべお非垞にクヌルです。







䞍倉アプリケヌションでアニメヌションを䜜成する最も簡単な方法









ここで、䞍倉アプリケヌションでアニメヌションを䜜成する最も簡単な方法を芋おみたしょう。 これらはcss遷移です。



 // CSS property // transition: transform is ease; // Conditional state change <div className ={isVisible ? 'is-visible' : 'is-hidden'} /> // Direct style manipulation <div style={{ transform: `translate(${scale})` }} />
      
      





ReactのCSSアニメヌションはそのたた䜿甚できたす。 遷移プロパティ+状態倉化=アニメヌション。



圌らはあなたが持っおいるほがすべおのタスクに適しおいるずいう点で良いです。 これらは、状態ベヌスのアプリケヌションずたったく同じように機胜したす。 プロパティを定矩し、それをどのようにアニメヌション化したいか、ある状態から別の状態にどのように移行するかを蚀いたす。 さらに、Reactやその他のラむブラリでアニメヌションを操䜜するためのパタヌンがありたす。



パタヌンの1぀は、あるクラスを別のクラスに眮き換えるこずです。 さお、芁玠のスタむルを手動で倉曎できたす。 これですべおが明確になりたした。



 <div> <div style="transform: translate(42.00px, 165.00px)" /> ... </div
      
      







デモを芋る



ReactアプリケヌションでCSS遷移がどのように機胜するかを瀺すための䟋を䜜成したした。 特定の法則に埓っお、ポむントのセットがあり、それらを座暙に倉換しお描画したす。 これは、異なるプロパティを持぀芁玠の配列です。 すべおのデヌタを完党に倉曎するず、画像が即座に倉曎され、ブラりザ自䜓が移行を完了したす。



堎合によっおは、CSS遷移は非垞に自然に動䜜したせん。 たずえば、あるアニメヌションを実行するず同時に別のアニメヌションを実行した堎合、ブラりザは停止しお新しい状態に移行する方法を知っおいるため、䜕も壊れたせん。 しかし、実際のプログラムはそのようには動䜜したせん。



幞いなこずに、Reactの堎合、React-Motionラむブラリがありたす。 そしお、その䞊で2番目のデモ 21:25 を䜜成したした。 同じ䟋を取り䞊げたした。点の配列があり、その状態を倉曎したすが、Motionずいうラッパヌがありたす。 すべおが同じように起こり、ラむブラリ自䜓が手動で移行を行いたす。



 <div> <Motion style={{x: spring(42.00, y: spring(165.00))}}> <div style="transform: translate(42.00px, 165.00px)" /> </Motion> ... </div>
      
      







デモを芋る



React-Motionは、物理゚ンゞンに䌌たものを䜿甚したす。 ぀たり、アニメヌションを互いに重ね合わせるず、動きがバネ匏になり、党䜓的に芋た目が良いこずに気付くでしょう。



Reactでは、このように芋えたす。



 <Motion> {interpolated => <div style={{ opacity: interpolated.x }} /> } </Motion>
      
      





React-Motionは、優れた機胜ずしおの機胜パタヌンを䜿甚したす。 コンポヌネントがあり、ボディずその子がある堎合、これらの子は芁玠である必芁はありたせん。 䜕らかの状態を取り、芁玠を返す関数など、任意のタむプのデヌタを䜿甚できたす。 このような蚘録は初心者には少し怖いですが、ずおもクヌルに機胜したす。 React-MotionはDOMに忍び蟌み、いく぀かのプロパティを倉曎するず考えるかもしれたせん。 これは実際にはそうではありたせん。



これは、最初に説明したrequestAnimationFrameず同じものであり、アニメヌションの各ステップで状態を曎新するだけです。 ぀たり、各フレヌムは新しい状態、新しいレンダヌです。 驚くべきこずに、これは機胜したす。





デモを芋る



1぀のヒント-どこでもReact-Motionを䜿甚しないでください。







残念ながら、すべおの堎合に適しおいるわけではありたせん。 春のアニメヌションは時間に制限がありたせん。぀たり、10秒間動䜜を開始するアニメヌションを䜜成する必芁がある堎合、React-Motionはここでのアシスタントではありたせん。



たた、1぀の芁玠が最初にアニメヌション化され、次に2番目の芁玠がアニメヌション化される耇雑なアニメヌションを扱うこずも困難です。 原則ずしお、これはラむブラリによっお実行できたすが、あたり䟿利ではありたせん。



そしお最埌に、パフォヌマンス。 ずにかく、手動アニメヌションず比范できるものはありたせん。 芁玠に登り、その倉換を倉曎するずき。 したがっお、堎合によっおは、React-Motionは「食いしん坊」になりたすが、うたく機胜したす。



ダヌティアニメヌション







ダヌティアニメヌションは、すべおが垞に状態に基づいお構築できるわけではないアニメヌションです。



 class Dialog extends Component{ componentDidMount(){ const node = findDOMNode(this) // Or $.animate, anime.js, GSAP, D3 ... Velocity(node, {scale: 1.5}, {duration: 1000}) } render(){ ... } }
      
      





「入力アニメヌション」パタヌンは、componentDidMountフックを介しお機胜し、芁玠に盎接アクセスしたす。



ダむアログボックスの䟋を芋おみたしょう。 ダむアログボックスを衚瀺たたは非衚瀺にする必芁がある堎合は、これに遭遇しおいる必芁がありたす。 これは、ほずんどの堎合、componentDidMountパタヌンを䜿甚しお行われたした。぀たり、Reactには、コンポヌネントがDOMに远加された埌に呌び出されるフックがありたす。 ただし、問題がありたす。アニメヌションが終了する前にダむアログボックスがDOMを離れる堎合がありたす。 したがっお、これも監芖する必芁がありたす。



ダヌティな入力アニメヌションで䜜業する堎合、぀たり入力で䜕かをアニメヌトする堎合、アニメヌションハンドルを保持し、コンポヌネントが事前にDOMから離れる堎合はキャンセルするこずをお勧めしたす。 これは、VelocityたたはjQueryのアニメヌションラむブラリを䜿甚する堎合に可胜です。



 class Dialog extends Component{ componentDidMount(){ const node = findDOMNode(this) // animate returns a cancellable // promise-like object this._anim = animate(node, { ... }) } componentWillUnmount(){ this._anim && this._anim.cancel() } }
      
      





぀たり、ここでは、アニメヌションが終了する前にコンポヌネントを抜出できたす。





デモを芋る



この䟋では、ダむアログボックスはすぐに消え、原則ずしお、出力をアニメヌション化する方法はありたせん。 通垞、りィンドりを衚瀺するかどうかを決定する特定のフラグを開始し、オプションでこのコンポヌネントをレンダリングしたす。 たた、コンポヌネントがDOMを離れるずすぐにアニメヌション化できないため、終了アニメヌションを䜜成するこずはできたせん。 そしお、あなたはそれに぀いお䜕かをする必芁がありたす。



 <div> {this.state.showDialog && <Dialog />} </div>
      
      





それでは、同様に動䜜し、終了アニメヌションを実行できるラッパヌを䜜成したしょう。 私たちの堎合、私はそれをアニメヌションず呌びたした。



 <Animated> {this.state.showDialog && <Dialog />} </Animated>
      
      





子芁玠が内郚に衚瀺されたら、入力アニメヌションを開始し、それらが消えたらすぐに出力アニメヌションを䜜成し、゚ッゞケヌスを確認したす。







コンポヌネントがどのように機胜するかを想像するず、そのようなカヌドが手に入りたす。 コンポヌネントが特定の瞬間に存圚する可胜性のある4぀の状態がありたす。アニメヌション化されたずき、画面䞊、終了したずき、すでに終了したずきです。 最初の2぀の状態ではすべおが明確入力、入力ですが、コンポヌネントが終了したずきに状態終了をどうするかが問題です。 私たちに䞎えられた子䟛はもういたせん。 䜕かを描かなければなりたせん。 したがっお、ここではghostChildrenず呌ばれるトリックを䜿甚できたす。぀たり、アニメヌションが機胜するたで芁玠ずコンポヌネントに残したす。



 const element = <Dialog size="medium" /> // => { type: Dialog, props: { size: 'medium' }, ... } const element = React.createElement(Dialog, { size: 'medium'})
      
      





JSXの背埌には䜕がありたすか



終了アニメヌションを䜜成する必芁がある堎合は、子を取埗しお保存し、状態に远加しお終了アニメヌションを実行したす。 䞀般的に、コヌドはあたり快適ではありたせん。



新しい子䟛を埗るず、圌らが倉わったこずがわかりたす。 この関数では、どの状態に行きたいか、どのような远加オプションを受け入れるかを芋たす。 最も重芁なこずは、コンポヌネントぞのリンクを䜿甚しお、その䞊で出力アニメヌション関数を呌び出しお、正しい遷移を行うこずができるこずです。



 componentWillReceiveProps(nextProps){ // Exit transition if(this.props.children && !nextProps.children){ return this.transitionState(st.EXITING, {children: this.props.children}) } } transitionState(transitionTo, opt = {}){ // .. FSM logic .. // Wait for `this._content.animateExit()` }
      
      





出力アニメヌションをサポヌトするアニメヌション化されたヘルパヌコンポヌネント。



䜕が起こったのか芋おみたしょう 31:33のビデオで。





デモを芋る



興味深いこずに、状態の倉曎が速すぎるず、アニメヌションは正しく動䜜したす。 トランゞションは完党にアニメヌション化されず、時間内に画面を離れたす。



ただし、Reactで蚘述する堎合は、react-transition-groupラむブラリを䜿甚できるため、珟圚行うこずをすべお行う必芁はありたせん。 圌女は以前Reactのアドオンでした。 私は、新しいバヌゞョンに移行ず呌ばれる䟿利なヘルパヌがあるこずを気に入っおいたす。 䞀般に、これは先ほどずほが同じこずを゚ミュレヌトする䜎レベルのコンポヌネントです。



 import Transition from 'react-transition-group/Transition' // `state` is 'entered', 'entering', 'exited' etc. <Transition in={isVisible} timeout={duration}> {state => <ModalDialog animationState={state} />} </Transition>
      
      





React-transition-group@2.0は、入力/出力アニメヌション甚の宣蚀的なコンポヌネントです。



いわゆるダヌティコンポヌネントを䜿甚しお、状態が倉化する耇雑なコンポヌネントを䜜成できたす。





デモを芋る



別の䟋 32:57のビデオでは、倀が倉化するヒストグラムを䜜成したした。 実際、これは、ネットワヌクおよびwebsocketからの状態が自動的に来る倧きなコンポヌネントです。 アニメヌションがそれ自䜓を実行する必芁があるため、私のコンポヌネントは通垞のコンポヌネントのように芋えたすが、内郚ではダヌティアニメヌションで状態をアニメヌション化したす。 この堎合、D3を䜿甚したした。



芁玠にアクセスできず、Web APIを䜿甚する必芁がある堎合や、いわゆるダヌティコンポヌネントがCanvasである堎合など、この堎合、パタヌン-責任の傍受を適甚できたす。



 render(){ return <canvas /> } // Render only once! shouldComponentUpdate() { return false } componentWillReceiveProps(nextProps){ if(this.props.color != nextProps.color){ // Animate on canvas... } }
      
      





フックを䜿甚するず、レンダリングの責任を完党に把握できたす。 たずえば、Canvas、WebGL、WebAudioなどを䜿甚したす。



したがっお、䞀床レンダリングしたす。 さらに、責任をむンタヌセプトし、特別な関数でfalseを返すため、このコンポヌネントをレンダリングしないず蚀いたす。 さらにcomponentWillReceivePropsフックで、来たプロパティ、倉曎されたかどうかを確認し、必芁なアニメヌションを実行したす。 簡単に聞こえたすが、実際にはアニメヌション化は必ずしも䟿利ではないこずがわかりたす。 理由を芋おみたしょう。



WebGLでそのようなコンポヌネントを䜜成したした。 これは二十面䜓です。 䞊から2぀のプロパティを介しお圌に枡したす=瞊ず暪にねじる方法。 そしお、componentWillReceiveProps関数内で、ナゲットを比范し、必芁な倉換を行いたす。





デモを芋る



この回転は完党に自然なものではなく、荒く芋え、ゞャヌクを䌎いたす。 しかし、スムヌズなアニメヌションを䜜成できるようにするコントロヌラヌず呌ばれるトリックがありたす。







違いは䜕ですか 䞊から来るものを芋る前に、内郚状態を曎新したので、反転は瞬時でした。 たた、コントロヌラヌの動䜜は少し異なりたす。 コントロヌラヌは、制埡理論からの抂念です。 私たちの堎合、これはP-controller、PIDコントロヌラヌの特殊なケヌスです。 これは、ロボットの手を制埡する領域です。



私たちの堎合、これは単玔なコントロヌラヌであり、そのアクションは次の効果に基づいおいたす。



 // Limit delta to avoid divergence const delta = Math.min(100.0, ts - prevTs) const P = 0.001 + delta this.x = P + (this.target - x)
      
      





Pコントロヌラヌは、スムヌズでタむムレスなアニメヌションに䟿利です。



文字列があり、倀this.xがあり、それをタヌゲットに倉換する必芁がありたす。 適切な堎所からどれだけ離れおいるかを芋お、係数を掛けおこのポむントに移動したす。 䞀般的に、匏はフックの法則ずスプリングの堎合ず同じです。 アニメヌションでrequestAnimationFrameずコントロヌラヌを䜿甚する堎合、デルタを远加するのが最適であるこずに泚意しおください。 requestAnimationFrame呌び出しの間に受け取ったもの。 そしお、この堎合、別のブラりザタブに切り替えおから戻るず、非垞に倧きなデルタになるため、これを制限したした。 これにより、倀が非垞に倧きくなり、スプリングが砎損したす。 したがっお、それを制限し、ある定数を掛けお䜿甚したす。



「責任の傍受」パタヌンを䜿甚しお、物理孊を扱うこずができたす。





デモを芋る







汚れたコンポヌネントを䜜成する堎合、次のこずを確認する必芁がありたす。



  1. コンポヌネントにはきれいなむンタヌフェヌスがありたした。

  2. 副䜜甚は隠されおいた







原則ずしお、これらのルヌルは反察方向に機胜したす。 たずえば、ステヌトフルアプリケヌションで䜜業し、アニメヌションを実行する必芁がありたす。 次に、䜕らかのトリガヌ状態の倉曎などを蚭定し、コンポヌネント内でこの倉曎を監芖しお、アニメヌションを開始する必芁がありたす。



 import { Actuator, actuate } from 'redux-actuator' // Inside the component <Actuator on={{ animateBadge: this.animateBadge }} /> // Where the business logic is store.dispatch(actuate('animateBadge')) store.dispatch(actuate('highlighUser', { id: 1 }))
      
      





このパタヌンは、グロヌバル状態が通信する唯䞀の方法であるReduxアプリケヌションで䟿利に䜿甚されたす。



私たちはしばしばReduxず連携し、アニメヌションを䜜成するために、珟圚のモゞュヌルに䟝存しないすべおのものがアプリケヌションでアニメヌション化されるようにする必芁がある堎合がありたす。



私は小さなオヌプン゜ヌスナヌティリティredux-actuatorを公開したした。 コンポヌネント内でむベントをトリガヌできるようなアクチュ゚ヌタがありたす。





デモを芋る



どのように芋えるか、 4027からビデオを芋るこずができたす。 事実、私たちは自分の状態にある特定のキヌを取り、それを別のキヌに倉曎したす。 ぀たり、状態が本圓に倉化するこずを確認する必芁がありたす。 アクチュ゚ヌタの堎合、次のように進みたす。特定のid event'aを取埗し、衝突を避けるために珟圚の時刻ずカりンタヌから䜜成したす。 したがっお、アニメヌションを呌び出すこずができたす。





デモを芋る

耇雑なアニメヌションを䜜成する方法に぀いお質問があるかもしれたせん䟋は41:27のビデオで芋るこずができたす。 私はこれを蚀いたす、コヌドのアニメヌションはほずんどい぀もいように芋えたす。 — . , , , . , , , item'. , , , FLIP. FLIP, . FLIP — , , , . , , DOM, . , , DOM. , , React , , . — .







. . . , . : , DOM. , , . Canvas, WebGL, . , .



, .







参照資料





:



React, 16.3, componentWillReceiveProps deprecated, .. . , state props, . React componentWillReceiveProps getDerivedStateFromProps. , , props state , .



.



, , npm , . , react-canvas.



high-performant React Native. API . <Animated />, . , . : RN, setState react-native — , , RN .. «». ぀たり JS , View ( iOS) . low-level . <Animated />, , , . , , .. , — JS, , ( ). : https://github.com/motiz88/animated.macro



API, web . , . , «--». - React - .






, . JS , , HolyJS 2018 Piter , :






All Articles