使用React hooks完成响应式组件开发

本文介绍如何利用React Hooks和Context API优雅地处理屏幕宽度变化,以实现响应式布局。通过创建一个viewportContext,监听窗口大小变化,并在不同设备尺寸下切换组件,避免大量使用媒体查询。代码示例展示了如何在组件中获取屏幕宽度并根据宽度切换PC和移动端组件,从而优化性能和代码复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没更新博客了,接触React已经有一段时间了,近期在做公司官网的开发。

技术要求使用React ,响应式布局。

开始准备使用css @media 来负责页面的响应布局。
当开发到一定程度时发现媒体查询并不能满足所有的情况。
当一个组件切换不同大小设备时只是改变宽度、边距或者排版时,媒体查询当然更好。
但是当一个组件在pc上的展示模式和在移动端展示的模式完全不同时,与其使用大量的媒体查询进行display:none;不如直接切换不同的组件来的优雅。

于是就想怎么在React中优雅的获取屏幕宽度,保证在动态改变屏幕尺寸的时候切换组件。

废话不多说直接贴代码
1.首先新建一个文件viewportContext.jsx

import React from 'react';
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>
  );
};
export default ViewportProvider;
export const useViewport = () => {
  const { width, height } = React.useContext(viewportContext);
  return { width, height };
}

2.然后找到你的根组件将ViewportContext包在外层

import ViewportContext from '../util/viewportContext';

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

3.在需要响应切换组件的地方引入

import { useViewport } from '../../util/viewportContext';

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

4.ok,到这里你的组件就可以根据设备宽度进行切换了。
实现主要是用到hooks + Context,能够最大的减少性能消耗,保证最大程度的复用性。

本文实现思路

Developing responsive layouts with React Hooks

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值