我试图访问React.js组件中的Window对象,因为我想创建一个保存Window对象的动态innerWidth值的状态.当页面被刷新时,我可以让它工作,但当我使用dev工具动态调整页面大小时却不能.

以下是我在刷新时使用的代码:

const About = () => {

  const [bioType, setBioType] = useState("");

  const truncateText = () =>
    window.innerWidth > 1024 ? setBioType("desktop") : setBioType("mobile");

  useEffect(() => {
    truncateText();
  });

  return ({
    bioType === 'desktop' ? ... : ....
  })

}

然而,当我使用开发工具调整网页大小时,它不起作用.有谁能给我个提示吗?谢谢.`

推荐答案

更改窗口宽度不会导致Reaction对更改做出react 并重新渲染.您需要使用事件处理程序来监听resize event、使用ResizeObserver或使用MatchMedia,并监听更改.

MatchMedia为例:

const { useState, useEffect } = React;

const MIN_WIDTH = 600;

const getBioType = matches => matches ? 'desktop' : 'mobile';

const About = () => {
  const [bioType, setBioType] = useState(() => getBioType(window.innerWidth > MIN_WIDTH));

  useEffect(() => {
    const mql = window.matchMedia(`(min-width: ${MIN_WIDTH}px)`);
    
    const handler = e => setBioType(getBioType(e.matches));
    
    mql.addEventListener('change', handler);
    
    return () => {
      mql.removeEventListener('change', handler);
    };
  }, []);

  return bioType;
}

ReactDOM
  .createRoot(root)
  .render(<About />);
<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>

<div id="root"></div>

Reactjs相关问答推荐

在此上下文中如何在缓冲(隐藏)视频和渲染视频之间切换?

条件索引路由

Reaction路由的问题-在Effect使用API调用响应设置状态之前呈现页面

根据另一个Select中的选定值更改Select中的值

在React中映射对象数组时,如何正确呈现JSX.Element或React.ReactNode类型?

为什么我的react 简单计时器项目不起作用?

无法在 NextJS 中获取嵌套对象

当 URL 与我声明的任何路由都不匹配时,如何使用不会重定向到错误页面的动态 URL? - react 路由 dom

FabricJS反序列化问题

在react的useEffect钩子中,我的函数被调用,但只有第一个函数能够改变状态,第二个函数无法改变状态.

ReactJS on AWS Amplify与EC2上的Spring boot服务之间的混合内容错误

根据其中的值不同地react setState 更新状态

Recharts 笛卡尔网格 - 垂直线和水平线的不同样式

文本的几个词具有线性渐变 colored颜色 - React native

使用 axios 响应路由 Dom 操作

单元测试 useLoaderData() react-router v6 加载器函数

react-markdown 不渲染 Markdown

如何在 react-router-dom v6 中实现监听功能?

您无权使用阻止 webRequest 侦听器.请务必在 list 中声明 webRequestBlocking 权限

如何在 NavBar 中设置动态标题