摘要:翻譯瘋狂的技術(shù)宅作者英文標題英文地址說明本文首發(fā)于公眾號在本文中,我將向你展示如何使用和庫中的生命周期方法來實現(xiàn)頁面的過渡效果。我們還用創(chuàng)建了一個變量,可以用它來對封裝的子組件中的的不同樣式屬性實現(xiàn)動畫效果。用渲染,并且或者插入動畫狀態(tài)值。
翻譯:瘋狂的技術(shù)宅
作者:Martin Haagensli
英文標題:Animated page transitions with React Router 4, ReactTransitionGroup and Animated
英文地址:https://hackernoon.com/animat...
說明:本文首發(fā)于公眾號:jingchengyideng
在本文中,我將向你展示如何使用 ReactTransitionGroup 和 Animated 庫中的生命周期方法來實現(xiàn)頁面的過渡效果。
你可以通過這個視頻 http://animate.mhaagens.me 來觀看演示效果。
讓我們看看該怎樣設置一些簡單的路由動畫!
1、安裝React首先安裝 React 并創(chuàng)建一個 React 應用程序,很簡單的就能創(chuàng)建一個 React 項目并讓它運行。
如果你還沒有安裝 Create React App 就先裝好(如果你已經(jīng)安裝,就跳過這一步):
npm install -g create-react-app
然后創(chuàng)建我們的項目:
create-react-app animatedroutes && cd animatedroutes
接下來安裝 routes 和 animation 包:
yarn add react-router-dom animated react-transition-group
現(xiàn)在用你喜歡的編輯器打開項目,并運行它:
npm start2、添加 React 路由
打開 src/index.js 文件,給 React 添加 BrowserRouter
import React from "react"; import ReactDOM from "react-dom"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; import registerServiceWorker from "./registerServiceWorker"; import "./index.css"; ReactDOM.render(, document.getElementById("root") ); registerServiceWorker();
然后添加兩個需要渲染的組建,首先是 src/Home.js :
import React, { Component } from "react"; export default class Home extends Component { render() { return () } }Home
Hello from the home page!
接著是 src/Subpage.js:
import React, { Component } from "react"; export default class Subpage extends Component { render() { return () } }Subpage
Hello from a sub page!
下面打開src/App.js 文件并修改內(nèi)容為:
import React, { Component } from "react"; import { Route, Link } from "react-router-dom"; import Home from "./Home"; import Subpage from "./Subpage"; class App extends Component { render() { return (); } } export default App;Home Subpage
最后刪除 src/App.css 的內(nèi)容,并把下面的代碼復制到src/index.css 文件中:
html, body, #root { height: 100%; width: 100%; } body { margin: 0; padding: 0; font-family: sans-serif; } .App { position: relative; display: flex; flex-flow: column; } .TopBar { position: fixed; top: 0; left: 0; display: flex; flex-flow: row nowrap; align-items: center; width: 100%; height: 62px; padding: 0 24px; } .TopBar a { margin-right: 18px; text-decoration: none; } .animated-page-wrapper { position: absolute; top: 62px; left: 0; width: 100%; height: 100%; } .page { padding: 0 24px; }
好了,現(xiàn)在可以通過路由在主頁面和子頁面之間進行導航了。
3、添加 TransitionGroup現(xiàn)在開始添加動畫效果。我們需要做一些微不足道的工作來實現(xiàn)它。
現(xiàn)在,我們不再用默認的方式設置路由,而是要使用路由渲染方法來去渲染前面的組件,并將其封裝到一個
首先把TransitionGroup導入你的 src/App.js,像這樣:
import TransitionGroup from "react-transition-group/TransitionGroup";
然后我們必須為 TransitionGroup 添加一個特殊的函數(shù)來渲染子組件。在 src/App.js 文件中class App extends ... 的前面添加這個函數(shù):
const firstChild = props => { const childrenArray = React.Children.toArray(props.children); return childrenArray[0] || null; };
然后刪除你的路由,并替換成下面的代碼:
( {match && )}/>} ( {match && )}/>}
您現(xiàn)在可以訪問新的生命周期方法了,比如 componentWillAppear(),componentWillEnter()和componentWillLeave()。
讓我們用它們來制作一個更高級的組件來實現(xiàn)我的的動畫路由效果,現(xiàn)在好戲開場了!
4、創(chuàng)建Animated Wrapper 并用 Animated 實現(xiàn)動畫創(chuàng)建src/AnimatedWrapper.js文件并復制下面的代碼到文件中:
import React, { Component } from "react"; import * as Animated from "animated/lib/targets/react-dom"; const AnimatedWrapper = WrappedComponent => class AnimatedWrapper extends Component { constructor(props) { super(props); this.state = { animate: new Animated.Value(0) }; } render() { return (); } }; export default AnimatedWrapper;
這里有很多東西,我來解釋一下。
我們用component來包裝我們的路由組件。它將從 TransitionGroup 接收生命周期方法,我們可以用它來實現(xiàn)動畫效果。
我們還用 Animated 創(chuàng)建了一個變量,可以用它來對封裝的子組件中的 div 的不同樣式屬性實現(xiàn)動畫效果。
讓我們添加一些生命周期方法給組件添加動畫效果。用Animated.template渲染,并且/或者插入動畫狀態(tài)值。
按照下面的代碼修改src/AnimatedWrapper.js文件內(nèi)容:
import React, { Component } from "react"; import * as Animated from "animated/lib/targets/react-dom"; const AnimatedWrapper = WrappedComponent => class AnimatedWrapper extends Component { constructor(props) { super(props); this.state = { animate: new Animated.Value(0) }; } componentWillAppear(cb) { Animated.spring(this.state.animate, { toValue: 1 }).start(); cb(); } componentWillEnter(cb) { setTimeout( () => Animated.spring(this.state.animate, { toValue: 1 }).start(), 250 ); cb(); } componentWillLeave(cb) { Animated.spring(this.state.animate, { toValue: 0 }).start(); setTimeout(() => cb(), 175); } render() { const style = { opacity: Animated.template`${this.state.animate}`, transform: Animated.template` translate3d(0,${this.state.animate.interpolate({ inputRange: [0, 1], outputRange: ["12px", "0px"] })},0) ` }; return (); } }; export default AnimatedWrapper;
然后我們需要在每個路由組件中導入它,然后像這樣將它們封裝起來:
修改 src/Home.js 如下:
import React, { Component } from "react"; import AnimatedWrapper from "./AnimatedWrapper"; class HomeComponent extends Component { render() { return () } } const Home = AnimatedWrapper(HomeComponent); export default Home;Home
Hello from the home page!
修改 src/Subpage.js 如下:
import React, { Component } from "react"; import AnimatedWrapper from "./AnimatedWrapper"; class SubpageComponent extends Component { render() { return () } } const Subpage = AnimatedWrapper(SubpageComponent); export default Subpage;Subpage
Hello from a sub page!
就這樣,現(xiàn)在你的頁面切換效果應該是動態(tài)的了!
擴展閱讀我建議通過Animated文檔來學習,但是現(xiàn)在相關(guān)文檔很少。我們實用的Animated.template函數(shù)在 Github-issues 以外的地方幾乎找不到。它的文檔在這里:http://animatedjs.github.io/i...。
你可以通過下面的鏈接下載Demo的演示視頻:
http://animate.mhaagens.me/
或者:
https://github.com/mhaagens/a...
也可以關(guān)注我在Medium的博客或者我的Twitter,來學習更多 React 相關(guān)的內(nèi)容。
https://twitter.com/mhaagens
歡迎掃描二維碼關(guān)注公眾號,每天第一時間推送我翻譯的國外最新技術(shù)文章。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/84706.html
摘要:前端日報精選一行代碼的逆向工程譯只需四個步驟使用實現(xiàn)頁面過渡動畫如何實現(xiàn)一個基于的模板引擎解剖組件的多種寫法與演進深入理解筆記擴展對象的功能性中文基礎系列一之實現(xiàn)抽獎刮刮卡橡皮擦掘金小游戲個人文章和最常用的特征眾成翻譯常用語法總 2017-08-08 前端日報 精選 一行 JavaScript 代碼的逆向工程【譯】只需四個步驟:使用 React 實現(xiàn)頁面過渡動畫如何實現(xiàn)一個基于 DOM...
摘要:一個完成入門篇二搭建主框架通過第一課的學習,你已經(jīng)掌握了如何通過調(diào)試器來跟上的設計器聯(lián)調(diào)來實時查看設計效果調(diào)試代碼了,接下來通過一系列的開發(fā)教學你將很快上手學習到如何開發(fā)一個真正的。 一個App完成入門篇(二)-搭建主框架 通過第一課的學習,你已經(jīng)掌握了如何通過debug調(diào)試器來跟PC上的設計器聯(lián)調(diào)來實時查看UI設計效果、調(diào)試代碼了,接下來通過一系列的demo開發(fā)教學你將很快上手學習到...
摘要:一個完成入門篇二搭建主框架通過第一課的學習,你已經(jīng)掌握了如何通過調(diào)試器來跟上的設計器聯(lián)調(diào)來實時查看設計效果調(diào)試代碼了,接下來通過一系列的開發(fā)教學你將很快上手學習到如何開發(fā)一個真正的。 一個App完成入門篇(二)-搭建主框架 通過第一課的學習,你已經(jīng)掌握了如何通過debug調(diào)試器來跟PC上的設計器聯(lián)調(diào)來實時查看UI設計效果、調(diào)試代碼了,接下來通過一系列的demo開發(fā)教學你將很快上手學習到...
摘要:一個完成入門篇二搭建主框架通過第一課的學習,你已經(jīng)掌握了如何通過調(diào)試器來跟上的設計器聯(lián)調(diào)來實時查看設計效果調(diào)試代碼了,接下來通過一系列的開發(fā)教學你將很快上手學習到如何開發(fā)一個真正的。 一個App完成入門篇(二)-搭建主框架 通過第一課的學習,你已經(jīng)掌握了如何通過debug調(diào)試器來跟PC上的設計器聯(lián)調(diào)來實時查看UI設計效果、調(diào)試代碼了,接下來通過一系列的demo開發(fā)教學你將很快上手學習到...
摘要:正在失業(yè)中的課多周刊第期我們的微信公眾號,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。是一種禍害譯本文淺談了在中關(guān)于的不好之處。淺談超時一運維的排查方式。 正在失業(yè)中的《課多周刊》(第3期) 我們的微信公眾號:fed-talk,更多精彩內(nèi)容皆在微信公眾號,歡迎關(guān)注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的...
閱讀 1346·2021-09-23 11:51
閱讀 1518·2021-09-04 16:45
閱讀 680·2019-08-30 15:54
閱讀 2125·2019-08-30 15:52
閱讀 1677·2019-08-30 11:17
閱讀 3155·2019-08-29 13:59
閱讀 2080·2019-08-28 18:09
閱讀 432·2019-08-26 12:15