在gatsby构建中不使用文件,必须转换为钩子

编程入门 行业动态 更新时间:2024-10-21 03:39:57

在gatsby构建中不使用文件,必须转换为<a href=https://www.elefans.com/category/jswz/34/1759979.html style=钩子"/>

在gatsby构建中不使用文件,必须转换为钩子

我有一个在gatsby开发服务器中运行良好的脚本,但是当尝试运行gatsby构建时,出现错误提示

"document" is not available during server side rendering.

错误在此代码段上触发

const useActiveElement = () => {
  const [active, setActive] = useState(document.activeElement)

我假设在此文件中我使用文档的任何位置,也可能在我使用文档的useEffect位置之外,也会出现此错误。我如何无法以允许Gatsby构建的方式正确地将代码转换为使用react挂钩。关于我应该做什么的建议?

完整文件(减去进口)

const useActiveElement = () => {
  const [active, setActive] = useState(document.activeElement)

  const handleKeyup = (e) => {
    if (e.keyCode === 9) setActive(document.activeElement)
  }

  useEffect(() => {
    document.addEventListener("keyup", handleKeyup)
    return () => {
      document.removeEventListener("keyup", handleKeyup)
    }
  }, [])

  return active
}

const Layout = ({
                  children,
                  crumbLabel,
                  subStatus,
                  parentPageLabel,
                  parentPageLink,
                }) => {
  const focusedElement = useActiveElement()

  const data = useStaticQuery(graphql`
      query SiteTitleQuery {
          sanitySiteSettings {
              title
          }
      }
  `)

  useEffect(() => {
    const prevTabbedElements = document.getElementsByClassName("tabbed")
    for (let i = 0; i < prevTabbedElements.length; i++) {
      prevTabbedElements[i].classList.remove("tabbed")
    }
    focusedElement.value && focusedElement.value.classList.add("tabbed")
    focusedElement.classList.add("tabbed")
  }, [focusedElement])


  return (
    <>
      <Header siteTitle={data.sanitySiteSettings.title}/>
      <nav>
        {subStatus ? (
          <Parentcrumbs
            crumbLabel={crumbLabel}
            parentPageLabel={parentPageLabel}
            parentPageLink={parentPageLink}
          />
        ) : (
          <Breadcrumbs crumbLabel={crumbLabel}/>
        )}
      </nav>
      <main>{children}</main>

      <Footer/>
    </>
  )
}
Layout.propTypes = {
  children: PropTypes.node.isRequired,
}

export default Layout
回答如下:

在初始渲染点,尚未定义document

const useActiveElement = () => {
  const [active, setActive] = useState('')

  const handleKeyup = (e) => {
    if (e.keyCode === 9) setActive(document.activeElement)
  }

  useEffect(() => {
    setActive(document.activeElement);

    document.addEventListener("keyup", handleKeyup)
    return () => {
      document.removeEventListener("keyup", handleKeyup)
    }
  }, [])

  return active
}

useState初始化为空,然后填写componentDidMountuseEffect为空deps)。

更多推荐

在gatsby构建中不使用文件,必须转换为钩子

本文发布于:2024-05-07 12:03:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756154.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:钩子   转换为   中不   文件   gatsby

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!