摘要:翻譯瘋狂的技術(shù)宅作者英文標(biāo)題英文地址說(shuō)明本文首發(fā)于公眾號(hào)在本文中,我將向你展示如何使用和庫(kù)中的生命周期方法來(lái)實(shí)現(xiàn)頁(yè)面的過(guò)渡效果。我們還用創(chuàng)建了一個(gè)變量,可以用它來(lái)對(duì)封裝的子組件中的的不同樣式屬性實(shí)現(xiàn)動(dòng)畫效果。用渲染,并且或者插入動(dòng)畫狀態(tài)值。
翻譯:瘋狂的技術(shù)宅
作者:Martin Haagensli
英文標(biāo)題:Animated page transitions with React Router 4, ReactTransitionGroup and Animated
英文地址:https://hackernoon.com/animat...
說(shuō)明:本文首發(fā)于公眾號(hào):jingchengyideng
在本文中,我將向你展示如何使用 ReactTransitionGroup 和 Animated 庫(kù)中的生命周期方法來(lái)實(shí)現(xiàn)頁(yè)面的過(guò)渡效果。
你可以通過(guò)這個(gè)視頻 http://animate.mhaagens.me 來(lái)觀看演示效果。
讓我們看看該怎樣設(shè)置一些簡(jiǎn)單的路由動(dòng)畫!
1、安裝React首先安裝 React 并創(chuàng)建一個(gè) React 應(yīng)用程序,很簡(jiǎn)單的就能創(chuàng)建一個(gè) React 項(xiàng)目并讓它運(yùn)行。
如果你還沒(méi)有安裝 Create React App 就先裝好(如果你已經(jīng)安裝,就跳過(guò)這一步):
npm install -g create-react-app
然后創(chuàng)建我們的項(xiàng)目:
create-react-app animatedroutes && cd animatedroutes
接下來(lái)安裝 routes 和 animation 包:
yarn add react-router-dom animated react-transition-group
現(xiàn)在用你喜歡的編輯器打開項(xiàng)目,并運(yù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();
然后添加兩個(gè)需要渲染的組建,首先是 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)容,并把下面的代碼復(fù)制到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)在可以通過(guò)路由在主頁(yè)面和子頁(yè)面之間進(jìn)行導(dǎo)航了。
3、添加 TransitionGroup現(xiàn)在開始添加動(dòng)畫效果。我們需要做一些微不足道的工作來(lái)實(shí)現(xiàn)它。
現(xiàn)在,我們不再用默認(rèn)的方式設(shè)置路由,而是要使用路由渲染方法來(lái)去渲染前面的組件,并將其封裝到一個(gè)
首先把TransitionGroup導(dǎo)入你的 src/App.js,像這樣:
import TransitionGroup from "react-transition-group/TransitionGroup";
然后我們必須為 TransitionGroup 添加一個(gè)特殊的函數(shù)來(lái)渲染子組件。在 src/App.js 文件中class App extends ... 的前面添加這個(gè)函數(shù):
const firstChild = props => { const childrenArray = React.Children.toArray(props.children); return childrenArray[0] || null; };
然后刪除你的路由,并替換成下面的代碼:
( {match && )}/>} ( {match && )}/>}
您現(xiàn)在可以訪問(wèn)新的生命周期方法了,比如 componentWillAppear(),componentWillEnter()和componentWillLeave()。
讓我們用它們來(lái)制作一個(gè)更高級(jí)的組件來(lái)實(shí)現(xiàn)我的的動(dòng)畫路由效果,現(xiàn)在好戲開場(chǎng)了!
4、創(chuàng)建Animated Wrapper 并用 Animated 實(shí)現(xiàn)動(dòng)畫創(chuàng)建src/AnimatedWrapper.js文件并復(fù)制下面的代碼到文件中:
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;
這里有很多東西,我來(lái)解釋一下。
我們用component來(lái)包裝我們的路由組件。它將從 TransitionGroup 接收生命周期方法,我們可以用它來(lái)實(shí)現(xiàn)動(dòng)畫效果。
我們還用 Animated 創(chuàng)建了一個(gè)變量,可以用它來(lái)對(duì)封裝的子組件中的 div 的不同樣式屬性實(shí)現(xiàn)動(dòng)畫效果。
讓我們添加一些生命周期方法給組件添加動(dòng)畫效果。用Animated.template渲染,并且/或者插入動(dòng)畫狀態(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;
然后我們需要在每個(gè)路由組件中導(dǎo)入它,然后像這樣將它們封裝起來(lái):
修改 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)在你的頁(yè)面切換效果應(yīng)該是動(dòng)態(tài)的了!
擴(kuò)展閱讀我建議通過(guò)Animated文檔來(lái)學(xué)習(xí),但是現(xiàn)在相關(guān)文檔很少。我們實(shí)用的Animated.template函數(shù)在 Github-issues 以外的地方幾乎找不到。它的文檔在這里:http://animatedjs.github.io/i...。
你可以通過(guò)下面的鏈接下載Demo的演示視頻:
http://animate.mhaagens.me/
或者:
https://github.com/mhaagens/a...
也可以關(guān)注我在Medium的博客或者我的Twitter,來(lái)學(xué)習(xí)更多 React 相關(guān)的內(nèi)容。
https://twitter.com/mhaagens
歡迎掃描二維碼關(guān)注公眾號(hào),每天第一時(shí)間推送我翻譯的國(guó)外最新技術(shù)文章。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/84706.html
摘要:前端日?qǐng)?bào)精選一行代碼的逆向工程譯只需四個(gè)步驟使用實(shí)現(xiàn)頁(yè)面過(guò)渡動(dòng)畫如何實(shí)現(xiàn)一個(gè)基于的模板引擎解剖組件的多種寫法與演進(jìn)深入理解筆記擴(kuò)展對(duì)象的功能性中文基礎(chǔ)系列一之實(shí)現(xiàn)抽獎(jiǎng)刮刮卡橡皮擦掘金小游戲個(gè)人文章和最常用的特征眾成翻譯常用語(yǔ)法總 2017-08-08 前端日?qǐng)?bào) 精選 一行 JavaScript 代碼的逆向工程【譯】只需四個(gè)步驟:使用 React 實(shí)現(xiàn)頁(yè)面過(guò)渡動(dòng)畫如何實(shí)現(xiàn)一個(gè)基于 DOM...
摘要:一個(gè)完成入門篇二搭建主框架通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)調(diào)試器來(lái)跟上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看設(shè)計(jì)效果調(diào)試代碼了,接下來(lái)通過(guò)一系列的開發(fā)教學(xué)你將很快上手學(xué)習(xí)到如何開發(fā)一個(gè)真正的。 一個(gè)App完成入門篇(二)-搭建主框架 通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)debug調(diào)試器來(lái)跟PC上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看UI設(shè)計(jì)效果、調(diào)試代碼了,接下來(lái)通過(guò)一系列的demo開發(fā)教學(xué)你將很快上手學(xué)習(xí)到...
摘要:一個(gè)完成入門篇二搭建主框架通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)調(diào)試器來(lái)跟上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看設(shè)計(jì)效果調(diào)試代碼了,接下來(lái)通過(guò)一系列的開發(fā)教學(xué)你將很快上手學(xué)習(xí)到如何開發(fā)一個(gè)真正的。 一個(gè)App完成入門篇(二)-搭建主框架 通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)debug調(diào)試器來(lái)跟PC上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看UI設(shè)計(jì)效果、調(diào)試代碼了,接下來(lái)通過(guò)一系列的demo開發(fā)教學(xué)你將很快上手學(xué)習(xí)到...
摘要:一個(gè)完成入門篇二搭建主框架通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)調(diào)試器來(lái)跟上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看設(shè)計(jì)效果調(diào)試代碼了,接下來(lái)通過(guò)一系列的開發(fā)教學(xué)你將很快上手學(xué)習(xí)到如何開發(fā)一個(gè)真正的。 一個(gè)App完成入門篇(二)-搭建主框架 通過(guò)第一課的學(xué)習(xí),你已經(jīng)掌握了如何通過(guò)debug調(diào)試器來(lái)跟PC上的設(shè)計(jì)器聯(lián)調(diào)來(lái)實(shí)時(shí)查看UI設(shè)計(jì)效果、調(diào)試代碼了,接下來(lái)通過(guò)一系列的demo開發(fā)教學(xué)你將很快上手學(xué)習(xí)到...
摘要:正在失業(yè)中的課多周刊第期我們的微信公眾號(hào),更多精彩內(nèi)容皆在微信公眾號(hào),歡迎關(guān)注。若有幫助,請(qǐng)把課多周刊推薦給你的朋友,你的支持是我們最大的動(dòng)力。是一種禍害譯本文淺談了在中關(guān)于的不好之處。淺談超時(shí)一運(yùn)維的排查方式。 正在失業(yè)中的《課多周刊》(第3期) 我們的微信公眾號(hào):fed-talk,更多精彩內(nèi)容皆在微信公眾號(hào),歡迎關(guān)注。 若有幫助,請(qǐng)把 課多周刊 推薦給你的朋友,你的支持是我們最大的...
閱讀 1272·2021-09-23 11:51
閱讀 1391·2021-09-04 16:45
閱讀 632·2019-08-30 15:54
閱讀 2083·2019-08-30 15:52
閱讀 1602·2019-08-30 11:17
閱讀 3106·2019-08-29 13:59
閱讀 2020·2019-08-28 18:09
閱讀 387·2019-08-26 12:15