精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

前端精神小伙:React Hooks響應(yīng)式布局

開(kāi)發(fā) 前端
本文除了介紹React Hooks的響應(yīng)式布局實(shí)現(xiàn),還介紹了如何自定義hooks與使用Context上下文,來(lái)復(fù)用,以達(dá)到性能最佳優(yōu)化。

前言

現(xiàn)在稍微大型的站點(diǎn)都會(huì)采用H5/PC端 并行,通過(guò)nignx獲取瀏覽器的UA信息來(lái)切換站點(diǎn)。

但這對(duì)于一些企業(yè)站點(diǎn)或人手不足的小型項(xiàng)目來(lái)說(shuō),就很難實(shí)現(xiàn)。

通過(guò)CSS媒體查詢實(shí)現(xiàn)響應(yīng)式布局,是主流方式。

但是,有時(shí)在 React 程序中,需要根據(jù)屏幕大小有條件地渲染不同的組件(寫媒體查詢太麻煩了,還不如另寫組件),其實(shí)使用React Hooks,可以更靈活實(shí)現(xiàn)。

[[318739]]

本文的實(shí)現(xiàn)來(lái)自: 

  1. Developing responsive layouts with React Hooks 

1. 方案一:innerWidth

一個(gè)很簡(jiǎn)單粗略的方案,是個(gè)前端都知道: 

  1. const MyComponent = () => {  
  2.   // 當(dāng)前窗口寬度  
  3.   const width = window.innerWidth;  
  4.   // 鄰介值  
  5.   const breakpoint = 620 
  6.   // 寬度小于620時(shí)渲染手機(jī)組件,反之桌面組件  
  7.   return width < breakpoint ? <MobileComponent /> : <DesktopComponent /> 

這個(gè)簡(jiǎn)單的解決方案肯定會(huì)起作用。根據(jù)用戶設(shè)備的窗口寬度,我們可以呈現(xiàn)桌面視圖或手機(jī)視圖。

但是,當(dāng)調(diào)整窗口大小時(shí),未解決寬度值的更新問(wèn)題,可能會(huì)渲染錯(cuò)誤的組件。

[[318740]]

2. 方案二:Hooks+resize

說(shuō)著也簡(jiǎn)單,監(jiān)聽(tīng)resize事件時(shí),觸發(fā)useEffect改變數(shù)據(jù)。 

  1. const MyComponent = () => { 
  2.    const [width, setWidth] = React.useState(window.innerWidth);  
  3.   const breakpoint = 620 
  4.   React.useEffect(() => {  
  5.     window.addEventListener("resize", () => setWidth(window.innerWidth));  
  6.   }, []);  
  7.   return width < breakpoint ? <MobileComponent /> : <DesktopComponent /> 

但精通Hooks的你,一定知道這里存在內(nèi)存性能消耗問(wèn)題:resize事件沒(méi)移除!

優(yōu)化版本: 

  1. const useViewport = () => {  
  2.   const [width, setWidth] = React.useState(window.innerWidth);  
  3.   React.useEffect(() => {  
  4.     const handleWindowResize = () => setWidth(window.innerWidth);  
  5.     window.addEventListener("resize", handleWindowResize);  
  6.     return () => window.removeEventListener("resize", handleWindowResize);  
  7.   }, []);  
  8.   return { width };  

[[318741]]

3. 方案三:構(gòu)建useViewport

自定義React Hooks,可以將組件/函數(shù)最大程度的復(fù)用。構(gòu)建一個(gè)也很簡(jiǎn)單: 

  1. const useViewport = () => {  
  2.   const [width, setWidth] = React.useState(window.innerWidth);  
  3.   React.useEffect(() => {  
  4.     const handleWindowResize = () => setWidth(window.innerWidth);  
  5.     window.addEventListener("resize", handleWindowResize);  
  6.     return () => window.removeEventListener("resize", handleWindowResize);  
  7.   }, []);  
  8.   return { width };  

精簡(jiǎn)后的組件代碼: 

  1. const MyComponent = () => {  
  2.   const { width } = useViewport();  
  3.   const breakpoint = 620 
  4.   return width < breakpoint ? <MobileComponent /> : <DesktopComponent /> 

[[318742]]

但是這里還有另一個(gè)性能問(wèn)題:

響應(yīng)式布局影響的是多個(gè)組件,如果在多處使用useViewport,這將浪費(fèi)性能。

這時(shí)就需要另一個(gè)React親兒子:React Context(上下文) 來(lái)幫忙。

4.終極方案:Hooks+Context

我們將創(chuàng)建一個(gè)新的文件viewportContext,在其中可以存儲(chǔ)當(dāng)前視口大小的狀態(tài)以及計(jì)算邏輯。 

  1. const viewportContext = React.createContext({});  
  2. const ViewportProvider = ({ children }) => {  
  3.   // 順帶監(jiān)聽(tīng)下高度,備用  
  4.   const [width, setWidth] = React.useState(window.innerWidth);  
  5.   const [height, setHeight] = React.useState(window.innerHeight);  
  6.   const handleWindowResize = () => {  
  7.     setWidth(window.innerWidth);  
  8.     setHeight(window.innerHeight);  
  9.   }  
  10.   React.useEffect(() => {  
  11.     window.addEventListener("resize", handleWindowResize);  
  12.     return () => window.removeEventListener("resize", handleWindowResize);  
  13.   }, []);  
  14.   return (  
  15.     <viewportContext.Provider value={{ width, height }}>  
  16.       {children}  
  17.     </viewportContext.Provider>  
  18.   );  
  19. };  
  20. const useViewport = () => {  
  21.   const { width, height } = React.useContext(viewportContext);  
  22.   return { width, height };  

緊接著,你需要在React根節(jié)點(diǎn),確保已經(jīng)包裹住了App: 

  1. const App = () => {  
  2.   return (  
  3.     <ViewportProvider>  
  4.       <AppComponent />  
  5.     </ViewportProvider>  
  6.   );  

在往后的每次useViewport(),其實(shí)都只是共享Hooks。 

  1. const MyComponent = () => {  
  2.   const { width } = useViewport();  
  3.   const breakpoint = 620 
  4.   return width < breakpoint ? <MobileComponent /> : <DesktopComponent /> 

后記

github上面的響應(yīng)式布局hooks,都是大同小異的實(shí)現(xiàn)方式。

本文除了介紹React Hooks的響應(yīng)式布局實(shí)現(xiàn),還介紹了如何自定義hooks與使用Context上下文,來(lái)復(fù)用,以達(dá)到性能最佳優(yōu)化。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2023-08-20 12:37:44

前端開(kāi)發(fā)

2019-08-20 15:16:26

Reacthooks前端

2020-06-29 15:20:31

前端React Hooks面試題

2021-03-18 08:00:55

組件Hooks React

2016-12-21 14:35:46

響應(yīng)式網(wǎng)頁(yè)布局實(shí)現(xiàn)方法原理

2023-11-06 08:00:00

ReactJavaScript開(kāi)發(fā)

2019-03-13 10:10:26

React組件前端

2022-06-27 08:21:05

CSS布局

2025-03-13 00:01:00

2022-03-31 17:54:29

ReactHooks前端

2020-10-28 09:12:48

React架構(gòu)Hooks

2020-09-19 17:46:20

React Hooks開(kāi)發(fā)函數(shù)

2022-07-18 09:01:58

React函數(shù)組件Hooks

2022-08-21 09:41:42

ReactVue3前端

2021-05-19 14:25:19

前端開(kāi)發(fā)技術(shù)

2023-06-01 19:19:41

2024-06-26 09:51:23

2022-04-16 20:10:00

React Hookfiber框架

2023-05-11 08:57:49

ReactHooks

2022-03-22 09:09:17

HookReact前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美另类交人妖| 欧美日韩美少妇| 国产专区一区二区| 一级特黄免费视频| 婷婷综合社区| 亚洲国产日韩欧美在线99| 成人黄色片视频| 黄色的网站在线观看| www..com久久爱| 国产免费一区二区三区香蕉精| 黑人巨大精品一区二区在线| 少妇精品导航| 欧美精品丝袜中出| 熟女少妇在线视频播放| 欧美精品hd| 国产三级一区二区| 国产伦精品一区| 一本色道久久综合无码人妻| 亚洲国产日本| 久久av资源网站| 白白色免费视频| 一区二区视频| 欧美日本一区二区| 91看片就是不一样| 欧美精品videosex| 国产精品乱码一区二区三区软件| 精品国产乱码久久久久| 国产丰满美女做爰| 六月丁香婷婷色狠狠久久| 97在线精品国自产拍中文| 麻豆天美蜜桃91| 日韩欧美精品综合| 亚洲午夜精品久久久久久久久久久久 | 日本美女视频一区| 粉嫩一区二区三区| 欧美日韩国产精品一区二区不卡中文| 免费的av在线| 免费人成在线观看播放视频 | 欧美一区二区三区免费| 久久久久久久久久久久91| 在线天堂新版最新版在线8| 一区二区欧美国产| 日韩中文字幕亚洲精品欧美| 麻豆传媒视频在线| 中文字幕日韩欧美一区二区三区| 日韩免费电影一区二区三区| 欧美日韩国产综合视频| 久久综合九色综合久久久精品综合| 成人免费视频网站| 国产ts变态重口人妖hd| 国产精一区二区三区| 国产精品国产三级国产| 日韩一区二区三区视频在线观看| 亚洲成人福利在线| jizz久久久久久| 欧美视频在线观看一区| www.com黄色片| 国产极品一区| 欧美巨大另类极品videosbest | 国产av第一区| 91cn在线观看| 亚洲成a人片综合在线| 800av在线免费观看| 国产黄色大片在线观看| 亚洲福中文字幕伊人影院| 欧美又粗又长又爽做受| 久草在线资源站手机版| 一本到不卡免费一区二区| 日韩免费高清在线| 亚洲午夜剧场| 精品成人免费观看| 丰满少妇一区二区三区| 精品国产99| 俺也去精品视频在线观看| 美国黄色小视频| 在线观看的日韩av| 国产精品精品久久久久久| 一区二区久久精品66国产精品| 国内精品国产成人| 好吊妞www.84com只有这里才有精品 | 久草这里只有精品视频| 亚洲专区在线视频| 少妇喷水在线观看| 久久久久久麻豆| 国产美女视频免费| 91老司机福利在线| 在线中文字幕不卡| 亚洲成人福利视频| 国产一卡不卡| 久久av.com| 日本免费精品视频| 国产在线不卡一卡二卡三卡四卡| 国产亚洲欧美另类一区二区三区| 成年网站在线| 亚洲一二三级电影| 高清一区二区视频| 超碰成人97| 中文亚洲视频在线| 豆国产97在线 | 亚洲| 日韩电影一区二区三区| 岛国视频一区| 岛国视频免费在线观看| 亚洲综合清纯丝袜自拍| xx欧美撒尿嘘撒尿xx| 99精品国产一区二区三区2021 | 亚洲综合影视| 在线一区二区三区四区五区| 亚洲熟女乱综合一区二区| 在线一级成人| 久久99视频免费| 中文字幕免费在线看| 成人国产免费视频| 少妇熟女一区二区| 亚洲精品一级二级| 亚洲高清一二三区| www.xxxx日本| 另类小说欧美激情| 日本不卡二区高清三区| 91jq激情在线观看| 91精品国产欧美一区二区18| 日本美女xxx| 国产午夜久久| 粉嫩av四季av绯色av第一区| 欧美午夜电影一区二区三区| 91精品1区2区| 污污内射在线观看一区二区少妇| 亚洲激情五月| 国产有码一区二区| 国产日产精品久久久久久婷婷| 午夜久久久久久电影| 四虎1515hh.com| 日韩欧美国产精品综合嫩v| 啪一啪鲁一鲁2019在线视频| 日批视频免费播放| 亚洲一区自拍偷拍| www.偷拍.com| 在线看片不卡| 91久久久亚洲精品| 麻豆视频在线| 欧美高清性hdvideosex| 成年人视频软件| 免费在线视频一区| 亚洲第一导航| 欧美日韩尤物久久| 国产亚洲精品一区二区| 乱子伦一区二区三区| 国产欧美精品日韩区二区麻豆天美| 成人午夜视频免费在线观看| 天天躁日日躁成人字幕aⅴ| 欧美性视频网站| 青青操在线视频| 色婷婷综合久久久久中文一区二区| 菠萝菠萝蜜网站| 国产偷自视频区视频一区二区| 久久99精品久久久久久青青日本| 日本不卡1234视频| 亚洲欧洲一区二区三区在线观看| 中文字幕亚洲乱码熟女1区2区| 91蝌蚪porny| 国产成人av影视| 日本欧美国产| 91夜夜揉人人捏人人添红杏| 伊人影院在线视频| 亚洲精品国偷自产在线99热| 久久国产黄色片| 国产精品系列在线| 色18美女社区| 欧美区亚洲区| 久久久久久九九九九| 免费日韩电影| 久久精品久久久久久| 亚洲精品喷潮一区二区三区| 午夜精品久久久久久久99水蜜桃| 久久国产精品无码一级毛片| 日韩一区精品字幕| 超碰成人在线免费观看| www.神马久久| 国产精品ⅴa在线观看h| 成人在线直播| 精品亚洲一区二区三区| 最近中文字幕免费观看| 依依成人综合视频| 人妻少妇精品视频一区二区三区| 另类综合日韩欧美亚洲| 妞干网视频在线观看| 久久99国产成人小视频| 成人日韩av在线| 爱搞国产精品| 色偷偷88888欧美精品久久久| 精品国产va久久久久久久| 欧美日韩国产精品一区| 成人三级视频在线观看| av电影在线观看一区| 色播五月激情五月| 99精品视频免费观看| 亚洲高清在线观看一区| www.久久东京| 国产日本欧美在线观看| 韩国精品一区| 久久成人综合视频| 久久经典视频| 精品国精品国产尤物美女| 欧美特级黄色片| 亚洲国产视频a| 波多野结衣家庭教师在线观看| 成人免费黄色在线| 欧美激情第3页| 久久狠狠婷婷| 全黄性性激高免费视频| 日韩一级毛片| 欧美日韩系列| 高潮久久久久久久久久久久久久 | 日本一区二区综合亚洲| 69xxx免费视频| 韩国三级中文字幕hd久久精品| 国产成人久久婷婷精品流白浆| 欧美激情1区| 伊人久久大香线蕉精品| 国产精品欧美日韩一区| 国产亚洲一区二区三区在线播放| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 精品在线播放| 国产亚洲一区在线播放 | 美女免费视频一区| 日本久久久精品视频| 亚洲黄色视屏| 天天做天天躁天天躁| 999视频精品| 亚欧洲精品在线视频免费观看| 亚欧日韩另类中文欧美| 国产女主播一区二区| 97视频一区| 成人h在线播放| 日日夜夜精品视频| 亚洲自拍中文字幕| 国产精品日韩精品在线播放| 91精品久久久久久久久久久久久久| 日韩免费电影| 国产成人精品一区二区| 久久爱91午夜羞羞| 日本精品久久久久影院| 松下纱荣子在线观看| 欧美亚洲一级片| 擼擼色在线看观看免费| 26uuu亚洲国产精品| 一二三四视频在线中文| 777777777亚洲妇女| av成人福利| 国产91精品高潮白浆喷水| av漫画网站在线观看| 国内精品模特av私拍在线观看| 成全电影大全在线观看| 午夜精品一区二区三区在线| 九色91在线| 91国产精品91| 不卡一二三区| 国产精品久久久久久久久久久久 | 日本婷婷久久久久久久久一区二区| 日韩三级av| 久久综合一区二区三区| 精品国产视频| 一区二区91美女张开腿让人桶| 91视频久久| 亚洲乱码日产精品bd在线观看| 国产精品大片| 黄www在线观看| 日韩国产成人精品| 日本不卡一区在线| 国产精品性做久久久久久| 国产十八熟妇av成人一区| 2024国产精品| 黑人狂躁日本娇小| 亚洲一区精品在线| 国产免费av一区| 欧美日本国产视频| 亚洲精品视频专区| 亚洲男人天堂2023| 黄色网址视频在线观看| 久久久久免费精品国产| 日韩精品99| 91九色单男在线观看| 好吊妞视频这里有精品| 欧美亚洲另类在线一区二区三区| 欧美国产美女| 免费av手机在线观看| 日日夜夜精品免费视频| 久久久久亚洲av无码麻豆| 99精品视频在线观看免费| 一本色道久久88| 亚洲国产精品天堂| 免费在线不卡av| 精品久久久久久久久久久院品网 | 亚洲同性gay激情无套| 一区二区三区免费高清视频 | 国产精品人妻一区二区三区| 亚洲国产精品高清久久久| 国产高清美女一级毛片久久| 欧美极品美女电影一区| 天天综合网天天| 翡翠波斯猫1977年美国| 欧美第一精品| 能在线观看的av| 国产a精品视频| 成人黄色短视频| 狠狠躁夜夜躁人人爽超碰91| av中文字幕免费在线观看| 亚洲日本中文字幕| 97人澡人人添人人爽欧美| 成人国产精品日本在线| 综合亚洲自拍| 97在线国产视频| 国产剧情在线观看一区二区| 一级在线观看视频| 富二代精品短视频| 亚洲h视频在线观看| 色偷偷偷综合中文字幕;dd| 丝袜诱惑一区二区| 国产精品一区二区a| 中国精品18videos性欧美| 久久久精品麻豆| 久久久.com| 六月丁香在线视频| 精品免费日韩av| av大大超碰在线| 国产女人精品视频| 伊人久久大香线蕉av不卡| 亚洲熟妇国产熟妇肥婆| 高清国产午夜精品久久久久久| 我要看黄色一级片| 欧美日韩一级视频| 888av在线| 国产精品一区二区三区免费视频| 最新亚洲精品| 又粗又黑又大的吊av| 成人高清视频在线| 久久精品国产亚洲av香蕉| 日韩天堂在线观看| 自拍亚洲图区| 51蜜桃传媒精品一区二区| 91精品福利| 精品人妻一区二区乱码| 亚洲免费av高清| www.日韩一区| 欧洲亚洲国产日韩| 精品av中文字幕在线毛片| 69久久夜色精品国产69乱青草| 精品久久ai电影| 波多野结衣综合网| 99免费精品在线观看| 欧美日韩综合在线观看| 亚洲精品视频网上网址在线观看| 少妇在线看www| 蜜桃成人在线| 久色成人在线| 色欲AV无码精品一区二区久久| 欧美亚洲综合色| 日本中文字幕在线看| 91九色蝌蚪国产| 国内精品亚洲| 精品无码在线视频| 色婷婷精品大在线视频| av色图一区| 92看片淫黄大片看国产片| 欧美日韩国产一区精品一区| 在线观看免费视频黄| 午夜久久久久久| 精品99又大又爽又硬少妇毛片 | 91蜜桃视频在线观看| 日韩成人av网址| 亚洲第一会所| 四虎免费在线观看视频| 国产69精品久久777的优势| 久久黄色精品视频| 色av吧综合网| av在线亚洲色图| 久久精品99国产| 国产精品国产三级国产aⅴ入口 | 成人小视频免费在线观看| 四虎精品永久在线| 中文字幕国内精品| 亚洲无线观看| 老头吃奶性行交视频| 亚洲女性喷水在线观看一区| 人妻妺妺窝人体色www聚色窝| 国产成人亚洲综合| 亚洲精品久久| 久久无码人妻精品一区二区三区 | 97成人精品区在线播放| 欧美手机在线| 四虎永久免费观看| 欧美日韩一级二级三级| av最新在线| 性刺激综合网| 99久久精品免费精品国产| 97成人免费视频| 国模私拍视频一区| 99久久99久久精品国产片果冰| 91玉足脚交白嫩脚丫| 欧美乱熟臀69xxxxxx| 黑人巨大精品|