中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分析React Hooks響應式布局

發布時間:2021-11-05 11:43:28 來源:億速云 閱讀:236 作者:iii 欄目:web開發

本篇內容主要講解“分析React Hooks響應式布局”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“分析React Hooks響應式布局”吧!

1. 方案一:innerWidth

一個很簡單粗略的方案,是個前端都知道:

const MyComponent = () => {    // 當前窗口寬度    const width = window.innerWidth;    // 鄰介值    const breakpoint = 620;    // 寬度小于620時渲染手機組件,反之桌面組件    return width < breakpoint ? <MobileComponent /> : <DesktopComponent />;  }

這個簡單的解決方案肯定會起作用。根據用戶設備的窗口寬度,我們可以呈現桌面視圖或手機視圖。

但是,當調整窗口大小時,未解決寬度值的更新問題,可能會渲染錯誤的組件。

2. 方案二:Hooks+resize

說著也簡單,監聽resize事件時,觸發useEffect改變數據。

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

但精通Hooks的你,一定知道這里存在內存性能消耗問題:resize事件沒移除!

優化版本:

const useViewport = () => {    const [width, setWidth] = React.useState(window.innerWidth);    React.useEffect(() => {      const handleWindowResize = () => setWidth(window.innerWidth);      window.addEventListener("resize", handleWindowResize);      return () => window.removeEventListener("resize", handleWindowResize);    }, []);    return { width };  }

3. 方案三:構建useViewport

自定義React Hooks,可以將組件/函數最大程度的復用。構建一個也很簡單:

const useViewport = () => {    const [width, setWidth] = React.useState(window.innerWidth);    React.useEffect(() => {      const handleWindowResize = () => setWidth(window.innerWidth);      window.addEventListener("resize", handleWindowResize);      return () => window.removeEventListener("resize", handleWindowResize);    }, []);    return { width };  }

精簡后的組件代碼:

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

分析React Hooks響應式布局

但是這里還有另一個性能問題:

響應式布局影響的是多個組件,如果在多處使用useViewport,這將浪費性能。

分析React Hooks響應式布局

這時就需要另一個React親兒子:React Context(上下文) 來幫忙。

4.終極方案:Hooks+Context

我們將創建一個新的文件viewportContext,在其中可以存儲當前視口大小的狀態以及計算邏輯。

const viewportContext = React.createContext({});  const ViewportProvider = ({ children }) => {    // 順帶監聽下高度,備用    const [width, setWidth] = React.useState(window.innerWidth);    const [height, setHeight] = React.useState(window.innerHeight);    const handleWindowResize = () => {      setWidth(window.innerWidth);      setHeight(window.innerHeight);    }    React.useEffect(() => {      window.addEventListener("resize", handleWindowResize);      return () => window.removeEventListener("resize", handleWindowResize);    }, []);    return (      <viewportContext.Provider value={{ width, height }}>        {children}      </viewportContext.Provider>    );  };  const useViewport = () => {    const { width, height } = React.useContext(viewportContext);    return { width, height };  }

緊接著,你需要在React根節點,確保已經包裹住了App:

const App = () => {    return (      <ViewportProvider>        <AppComponent />      </ViewportProvider>    );  }

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

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

分析React Hooks響應式布局

到此,相信大家對“分析React Hooks響應式布局”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南皮县| 周至县| 建始县| 秭归县| 江华| 神池县| 全椒县| 定陶县| 上思县| 阳曲县| 永宁县| 芷江| 汉寿县| 咸宁市| 营口市| 久治县| 醴陵市| 邢台市| 东方市| 连云港市| 左云县| 姜堰市| 湖北省| 洛浦县| 公主岭市| 盐津县| 都江堰市| 若羌县| 台南县| 措勤县| 乌鲁木齐县| 尖扎县| 温泉县| 贞丰县| 湘阴县| 栖霞市| 东港市| 翁牛特旗| 阿鲁科尔沁旗| 垫江县| 辽源市|