【问题标题】:Trying to set window height but it gives an error in react.js [duplicate]尝试设置窗口高度,但它在 react.js [重复]
【发布时间】:2021-06-29 21:37:45
【问题描述】:

我使用 useState 来获取窗口高度,但它给出了一个运行时错误,提示窗口未定义。你知道为什么

代码如下:

let [winHeight,setWinHeight] = useState(window.innerHeight)
useEffect(() => {
          const list = []
          for (var i=0;i<datas.length;i++){
               const t = datas[i].title
               const res = handleResize(i + 2)
               list.push(<li ref={resl[i + 1]} style={{top: "20px",left: res + "px"}}><Anchor href={datas[i].link || `/${t.replace(/ /g, "_")}`}><a onClick={() => closeNav()} onMouseOver={() => setHovering(i)}>{t}</a></Anchor></li>)
          }
          setWinHeight(window.innerHeight)
          setLinks(list)
     }, [winHeight])

【问题讨论】:

标签: javascript reactjs typescript react-native use-state


【解决方案1】:

你在运行 RN 吗?那你可以试试这个来获取高度~

import { Dimensions } from 'react-native';

const windowHeight = Dimensions.get('window').height;

上次发帖

添加resizeevent listener

按照这个,当你改变窗口高度时它会更新winHeight

  const lastHeight = useRef(window.innerHeight);

  const [winHeight, setWinHeight] = useState(lastHeight.current);

  useEffect(() => {
    window.addEventListener('resize', (e) => {
      const curHeight = e.currentTarget?.innerHeight;
      if (lastHeight.current !== curHeight) {
        lastHeight.current = curHeight;
        setWinHeight(curHeight);
      }
    });
  }, []);

【讨论】:

  • 窗口本身是未定义的,所以不能调用包含窗口对象的任何东西
  • 所以调整大小不起作用
【解决方案2】:

在 UseEffect 的依赖数组中使用 [window.innerHeight] 而不是 [winHeight]

【讨论】:

    【解决方案3】:

    试试这个:

    let [winHeight,setWinHeight] = useState(0)
    
    useEffect(()=> {
    setWinHeight(window.innerHeight)
    },[])
    

    你还需要从'react'导入useEffect。

    没有定义窗口,因为在您尝试访问窗口对象时组件不是渲染器。

    【讨论】:

    【解决方案4】:

    你试过在useEffect的依赖数组中添加window.height吗?

    useEffect(() => {
          const list = []
          for (var i=0;i<datas.length;i++){
               const t = datas[i].title
               const res = handleResize(i + 2)
               list.push(<li ref={resl[i + 1]} style={{top: "20px",left: res + "px"}}><Anchor href={datas[i].link || `/${t.replace(/ /g, "_")}`}><a onClick={() => closeNav()} onMouseOver={() => setHovering(i)}>{t}</a></Anchor></li>)
          }
          setLinks(list)
     }, [window.innerHeight])
    

    【讨论】:

    • 试过了,但它给出了另一个错误,说没有定义窗口
    • 尝试使用 useState 调用它,但没有任何改变
    • stackoverflow.com/a/19014495/11038519你可以试试这个解决方案
    • 现在我的代码可以工作了,但唯一要做的就是让它开始运行。由于它只在 window.innerHeight 发生变化时运行 useEffect 挂钩内的代码,所以它最初不会运行
    • 通过返回函数调用初始值做到了,非常感谢您的帮助。我正在验证此回复
    猜你喜欢
    • 2012-07-30
    • 2015-02-26
    • 2021-06-29
    • 2021-06-22
    • 2011-06-04
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多