首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应+钩子:改变状态在ESC出版社,而在全屏?

反应+钩子:改变状态在ESC出版社,而在全屏?
EN

Stack Overflow用户
提问于 2022-01-25 13:41:18
回答 2查看 641关注 0票数 1

我正在尝试创建一个简单的应用程序,在按钮上进入全屏,然后将全屏放在另一个上。

虽然我已经知道了这一点,但当我按下ESC离开全屏时,我无法更新状态。

代码语言:javascript
复制
import { useState } from "react"

export default function Home() {
  const [isFullscreen, setFullscreen] = useState(false)

  const makeFullscreen = () => {
    setFullscreen(true)
    document.documentElement.requestFullscreen()
  }

  const closeFullscreen = () => {
    setFullscreen(false)
    document.exitFullscreen()
  }

  console.log(isFullscreen)
  return (
    <div
      className={`flex flex-col items-center justify-center w-full h-screen ${
        isFullscreen ? "bg-black" : ""
      }`}
    >
      <div
        className={`w-5/6 space-y-6 text-center wrapper ${
          isFullscreen ? "hidden" : "visible"
        }`}
      >
        <button
          onClick={makeFullscreen}
          className={`btn btn-primary ${!isFullscreen ? "visible" : "hidden"}`}
        >
          START TEST
        </button>
      </div>
      <button
        onClick={closeFullscreen}
        className={`btn btn-accent ${isFullscreen ? "visible" : "hidden"}`}
      >
        STOP TEST
      </button>
    </div>
  )
}

我在Google上发现了一些东西,但只有在它不在全屏的情况下,它们才能正常工作。

如果能弄清楚那会很好。

奖励:更好的全屏输入/退出方式:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-27 12:53:38

我做了一些研究,我想我找到了一个更优雅的方法来处理这个问题,利用反应全屏的npm包。

我实现它的方式:

代码语言:javascript
复制
import { useState, useCallback } from "react"
import { FullScreen, useFullScreenHandle } from "react-full-screen"

export default function Home() {
  const handle = useFullScreenHandle()
  const [isFullscreen, setFullscreen] = useState(false)

  const reportChange = useCallback((state) => {
    console.log(state)
    if (state === true) {
      setFullscreen(true)
    } else if (state === false) {
      setFullscreen(false)
    }
  })

  return (
    <div
      className={`flex flex-col items-center justify-center w-full h-screen ${
        isFullscreen ? "bg-black" : ""
      }`}
    >
      <div className={`w-5/6 space-y-6 text-center md:w-3/6 xl:w-2/6`}>
        <button
          onClick={(e) => {
            handle.enter()
            setFullscreen(true)
          }}
          className={`btn btn-primary ${!isFullscreen ? "visible" : "hidden"}`}
        >
          
          START TEST
        </button>

       
      <FullScreen
        onChange={reportChange}
        className={`${
          isFullscreen
            ? "flex flex-col items-center justify-center w-full h-screen"
            : ""
        }`}
        handle={handle}
      >
        <button
          onClick={() => {
            handle.exit()
            setFullscreen(false)
          }}
          className={`btn btn-info ${!isFullscreen ? "hidden" : "visible"}`}
        >
          STOP TEST
        </button>
      </FullScreen>
    </div>
  )
}

这将自动检查应用程序是否处于reportChange函数的全屏状态,然后将isFullscreen的状态分别设置为true或false。

因为它是onChange,所以当使用ESC的全屏时,它会自动工作。

这解决了我遇到的特殊问题。

票数 1
EN

Stack Overflow用户

发布于 2022-01-27 11:54:05

我把您的代码片段翻译成了代码沙箱(对于以后的文章,这非常有帮助!)并添加了这个缺失的useEffect()实例,似乎已经满足了您的需要。它是可用的这里

简言之,宣布了以下需要:

代码语言:javascript
复制
  const escapeHandler = (e) => {
    if (e.key === "Escape") {
      closeFullscreen();
    }
  };

  useEffect(() => {
    document.addEventListener("keydown", escapeHandler, false);
    return () => {
      document.removeEventListener("keydown", escapeHandler, false);
    };
  }, []);

正如我在上面的注释中所指出的,这个钩子是在初始呈现时将keydown侦听器添加到文档中。该侦听器将保留在文档上,直到这个组件卸载并执行钩子的清理阶段(执行返回的匿名函数)。

有关useEffect()清理的更多信息,请参见useEffect(),有关密钥的更多信息,请参见这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70849627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档