精品欧美一区二区三区在线观看 _久久久久国色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)

57pao精品| 精品亚洲一区二区三区在线观看| 正在播放一区| 国产丝袜在线视频| 在线欧美一区| 一区二区在线视频播放| 在线观看免费不卡av| 性欧美videos高清hd4k| 不卡视频一二三| 国产精品久久久久7777婷婷| 中文字幕在线观看2018| 网红女主播少妇精品视频| 欧美日韩在线不卡| 国产freexxxx性播放麻豆| 精品视频一二区| 国产在线不卡一区| 秋霞成人午夜鲁丝一区二区三区| 日韩一卡二卡在线观看| 欧美爱爱网站| 3d成人动漫网站| 中文字幕乱码人妻综合二区三区| 精品孕妇一区二区三区| 99精品久久只有精品| 成人国产亚洲精品a区天堂华泰| 国产亚洲成人av| 日韩精品91| 精品视频在线播放免| 久久精品无码一区二区三区毛片| 在线观看的黄色| 亚洲黄网站在线观看| 天堂一区二区三区 | 色婷婷精品大视频在线蜜桃视频| 韩国黄色一级大片| 狠狠狠综合7777久夜色撩人| 成人精品亚洲人成在线| 成人av番号网| 在线视频精品免费| 国产精品日韩久久久| 久久99精品久久久久久噜噜| 国产又粗又猛又爽又黄的视频四季 | 亚洲另类在线视频| 亚洲国产婷婷香蕉久久久久久99| 国产精品国产高清国产| 国产suv精品一区二区6| 国产精品私拍pans大尺度在线| 日韩大片免费在线观看| 欧美日本久久| 欧美精品一区二区三区国产精品| 黄色国产在线播放| 国产伦一区二区三区| 日韩精品免费在线观看| 99久久人妻精品免费二区| 91蜜桃臀久久一区二区| 日韩欧美中文字幕精品| 欧洲美女亚洲激情| 亚洲电影二区| 欧美福利一区二区| 在线观看av免费观看| 国产95亚洲| 日韩一区二区三区视频| 红桃视频一区二区三区免费| 精品国产亚洲一区二区三区在线| 7777精品伊人久久久大香线蕉超级流畅 | 免费av网站在线观看| 国产精品久久久久婷婷二区次| 先锋影音亚洲资源| 免费观看在线午夜影视| 综合久久久久综合| 国产一级大片免费看| 欧美1—12sexvideos| 亚洲福利视频三区| 国产精品50p| 在线一区av| 91国产丝袜在线播放| 亚洲欧美视频二区| 国产欧美视频在线| 亚洲国产成人久久综合| 国产肉体xxxx裸体784大胆| 亚洲欧美校园春色| 中文字幕日韩电影| 欧美人妻精品一区二区免费看| 欧美精品一级| 欧美亚洲成人xxx| 波多野结衣毛片| 九色porny丨国产精品| 91中文字幕在线观看| 内射无码专区久久亚洲| www国产成人| 一区二区三区四区不卡| 性欧美高清come| 日韩欧美精品在线观看| 日本特黄a级片| 亚洲免费一区三区| 亚洲欧美国产精品| 国产精品成人69xxx免费视频| 亚洲无线一线二线三线区别av| 26uuu亚洲伊人春色| 在线观看亚洲国产| 成人精品视频一区二区三区 | 亚洲成人免费在线| 亚洲成人福利在线观看| 欧洲一区在线| 亚洲精品综合精品自拍| 国产天堂av在线| 国产日本精品| 亚洲一区亚洲二区| 美州a亚洲一视本频v色道| 亚洲视频中文字幕| 欧美极品欧美精品欧美图片| 99热这里有精品| 日韩精品日韩在线观看| 国产免费美女视频| 噜噜爱69成人精品| 丁香婷婷久久久综合精品国产| 黄色在线视频观看网站| 亚洲一区二区四区蜜桃| 九九精品久久久| 亚洲另类春色校园小说| 久久精品国产免费观看| 在线观看日本视频| 成人高清伦理免费影院在线观看| 亚洲国产精品一区二区第一页| av中文字幕电影在线看| 7777精品久久久大香线蕉 | 亚洲欧美成人vr| 欧美激情一区二区三区久久久| 自拍偷拍福利视频| 91在线观看高清| 欧美极品少妇无套实战| 57pao成人永久免费| 亚洲午夜久久久影院| 国产无套在线观看| 国产乱淫av一区二区三区| 亚洲精品一区二区三| 91精品产国品一二三产区| 精品99999| 久久久久久久中文字幕| 久久99精品国产.久久久久久| 日本视频精品一区| 日韩电影免费观看高清完整版| 亚洲成人第一| 无码国产色欲xxxx视频| 亚洲精品国产a| 精品久久久99| 日韩精品永久网址| 国产福利精品av综合导导航| 亚洲欧美日韩成人在线| 亚洲一区二区精品视频| 两女双腿交缠激烈磨豆腐| 欧美韩国日本在线观看| 国产精品爽爽爽| 拍真实国产伦偷精品| 欧美日韩亚洲综合一区二区三区 | 91在线精品一区二区三区| www插插插无码视频网站| 一区二区三区四区精品视频| 欧美激情高清视频| 亚洲精品.www| 亚洲电影一级黄| 最新日本中文字幕| 激情六月综合| 国产日韩欧美一区二区| av岛国在线| 精品亚洲一区二区三区| 精品免费囯产一区二区三区| 久久久久久久性| 天天爱天天操天天干| 99久久精品网站| 亚洲影院污污.| av白虎一区| 亚洲欧美精品在线| 最近国语视频在线观看免费播放| 欧美韩日一区二区三区| 日本在线观看视频一区| 亚洲午夜黄色| 日本一区二区三区精品视频| 欧美成人免费全部网站| 欧美成人精品一区二区| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 色偷偷噜噜噜亚洲男人的天堂| 亚洲国产无线乱码在线观看| 亚洲另类一区二区| 久久亚洲AV成人无码国产野外| 日本中文在线一区| 黄色网络在线观看| 欧美a级网站| 国产精品自产拍在线观| 91中文在线| 亚洲精品视频在线播放| 一卡二卡三卡在线| 亚洲第一精品在线| b站大片免费直播| 国产综合久久久久久久久久久久| 99国产精品白浆在线观看免费| 美女扒开腿让男人桶爽久久动漫| 国产精品电影网站| 四虎亚洲精品| 一区二区三欧美| 亚洲男女视频在线观看| 91久久精品一区二区三区| 性欧美videos| 久久尤物电影视频在线观看| 美女被艹视频网站| 久久亚洲电影| 大荫蒂性生交片| 色乱码一区二区三区网站| 狠狠色综合欧美激情| 综合久久伊人| 日韩免费不卡av| 国产一线二线在线观看| 中文字幕日韩精品在线| 日韩美女一级视频| 日韩欧美国产一区二区在线播放| 综合久久中文字幕| 欧美日韩一区免费| 青青操视频在线播放| 亚洲国产高清在线| 久久偷拍免费视频| 国产aⅴ综合色| 波多野结衣国产精品| 美女国产精品| 国产成人在线免费看| 欧美成人高清| 超碰免费在线公开| 久久99国产成人小视频| 狠狠干一区二区| 97久久亚洲| 亚洲va电影大全| 欧美黄色成人| 日韩av免费看| 免费在线小视频| 欧美激情视频在线| 黄色免费在线观看| 中文字幕日韩欧美在线| 韩国三级在线观看久| 亚洲精品国产综合区久久久久久久| 国产精品怡红院| 欧美日韩一本到| 中文字幕在线观看欧美| 在线视频一区二区免费| 中文字幕国产在线观看| 午夜欧美大尺度福利影院在线看| 久久久久99精品成人片试看| 国产精品美女www爽爽爽| 欧美偷拍一区二区三区| 久久精品人人做人人爽97| 国产三级视频网站| www国产成人免费观看视频 深夜成人网| 中文字幕天堂av| 成人ar影院免费观看视频| 野战少妇38p| 岛国一区二区在线观看| www.555国产精品免费| 国产传媒日韩欧美成人| 在线观看一区二区三区四区| 成人在线一区二区三区| 欧美熟妇精品一区二区| 成人免费毛片a| 伊人网综合视频| 91在线视频播放地址| 91网站免费入口| 国产精品入口麻豆九色| 国产美女高潮视频| 亚洲精品久久久蜜桃| 成人免费看片98| 懂色av一区二区三区| www.久久精品视频| 欧美在线高清视频| 一级特黄aaa| 欧美xxxxxxxxx| 污污的视频网站在线观看| 亚洲男女性事视频| 9色在线观看| 操日韩av在线电影| 999精品网| 国产高清视频一区三区| 国产精品无码久久久久| 亚洲自拍高清视频网站| 大陆精大陆国产国语精品| 欧美日韩天天操| 日韩欧美视频在线播放| 黑人巨大国产9丨视频| 亚洲黄色精品| 丰满少妇在线观看| 国产乱色国产精品免费视频| 鲁大师私人影院在线观看| 国产精品美女久久久久久| 福利所第一导航| 欧美性猛交xxxx乱大交3| 亚洲无码精品在线播放| 精品欧美一区二区在线观看| 青青九九免费视频在线| xx视频.9999.com| av中文资源在线资源免费观看| 国产精品久久91| 波多野结衣欧美| 午夜精品亚洲一区二区三区嫩草| 欧美日本免费| 午夜视频你懂的| 99久久久久免费精品国产| 成人性视频免费看| 午夜视频在线观看一区二区 | 蜜臀av一区二区在线免费观看| 亚洲黄色片免费看| 2024国产精品视频| 男人av资源站| 色综合久久综合网97色综合| 国产成年妇视频| 一本一本久久a久久精品综合小说| 二区在线播放| 国产精品激情自拍| 青青草这里只有精品| 亚洲五码在线观看视频| 蜜芽一区二区三区| 日本xxxx裸体xxxx| 一区二区成人在线观看| 888奇米影视| 亚洲欧美日韩精品久久奇米色影视| 羞羞网站在线免费观看| 国产主播欧美精品| 国产一区二区三区电影在线观看| 国产91在线亚洲| 国产在线播精品第三| 男女男精品视频网站| 色av一区二区| 人人妻人人澡人人爽人人欧美一区 | 国产精品福利网站| 欧美一性一交| 国产精品久久..4399| 国产高清在线精品| 欧美一级特黄高清视频| 欧美午夜精品一区二区蜜桃| 日韩精品视频无播放器在线看 | 久久久久久久久久99| 69堂精品视频| 黄色网址视频在线观看| 国产视频福利一区| 欧美三级美国一级| 人妻久久久一区二区三区| 成人高清伦理免费影院在线观看| 青娱乐国产在线视频| 欧美一区二区视频在线观看2022| 天堂中文8资源在线8| 国产精品久久久久久久久免费看| 亚洲欧洲免费| 国产午夜福利视频在线观看| www.亚洲激情.com| 国产精品99精品| 亚洲成年人在线| 国产色婷婷在线| 国产精品久久久久免费| 在线观看一区| avtt香蕉久久| 日韩欧美成人免费视频| 深夜福利视频一区| 欧美一级片在线播放| 久久av综合| 精品少妇无遮挡毛片| 国产欧美日韩卡一| 中文字幕男人天堂| www国产精品com| 国产精品亚洲综合在线观看| 女人床在线观看| 成人激情视频网站| 成人午夜视频在线播放| 亚洲人精品午夜在线观看| 日日夜夜天天综合| 中文字幕日韩一区二区三区| 国产乱妇无码大片在线观看| 久久久久亚洲av片无码下载蜜桃| 精品国产乱码久久久久久久久| 色在线视频观看| 四虎永久国产精品| 国产呦萝稀缺另类资源| 久久久久久免费观看| 日韩av资源在线播放| 久久久人成影片一区二区三区在哪下载| 亚洲精品一区二| 国产99久久久久| 91青青草视频| 久久五月天综合| 欧美人妖在线观看| 色综合天天色综合| 一区二区三区美女| 日韩电影免费| 亚洲iv一区二区三区| 国产精品日本| 国产精品嫩草影院俄罗斯| 精品88久久久久88久久久| av在线日韩| 男女日批视频在线观看| 国产女人aaa级久久久级| 精品国产乱码久久久久久蜜臀网站| 7777免费精品视频| 97精品中文字幕| 内射中出日韩无国产剧情| 欧美精品黑人性xxxx| 国产自产自拍视频在线观看| 一本一本a久久| 97精品久久久午夜一区二区三区|