91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

分析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

河源市| 四平市| 太湖县| 新兴县| 安陆市| 北流市| 察隅县| 留坝县| 黄龙县| 朝阳市| 奎屯市| 浪卡子县| 渝北区| 怀远县| 冀州市| 陕西省| 东阿县| 永新县| 保定市| 郧西县| 黄山市| 綦江县| 唐海县| 静安区| 佛山市| 娱乐| 镇赉县| 上虞市| 句容市| 普陀区| 柳河县| 张家港市| 威海市| 金山区| 克什克腾旗| 富锦市| 龙江县| 阿克苏市| 湄潭县| 北安市| 临西县|