一段时间后在 Next.js 中隐藏一个元素

Posted

技术标签:

【中文标题】一段时间后在 Next.js 中隐藏一个元素【英文标题】:Hiding an element after a while in Next.js 【发布时间】:2021-01-14 19:12:51 【问题描述】:

我有一个标题组件作为功能组件。我想在单击徽标文本时显示一个弹出窗口。一段时间后它应该会自动关闭。我使用钩子来显示弹出状态。但是设置状态函数在 setTimeout 函数中不起作用。如何解决这个问题?

import Link from 'next/link'
import style from './header.module.css'

const Header = () => 
  const [popupOpen, setPopupOpen] = React.useState(false)

  return (
    <header className=style.header>
      <nav className=style.nav>
        <div
          className=style.popupContainer
          onClick=() => 
            setPopupOpen(!popupOpen)
            console.log(popupOpen)
            setTimeout(() => 
              console.log(popupOpen)
              setPopupOpen(!popupOpen)
              console.log(popupOpen)
            , 1000)
          
        >
          <span className=style.logo>Logo</span>

          <span
            className=`$style.popupText $
              popupOpen ? style.show : style.hide
            `
          >
            Popup Text
          </span>
        </div>

        <ul className=style.ul>
          <li>
            <Link href='/'>
              <a>.home</a>
            </Link>
          </li>
          <li>
            <Link href='/contact'>
              <a>.contact</a>
            </Link>
          </li>
        </ul>
      </nav>
    </header>
  )


export default Header

控制台日志:

【问题讨论】:

【参考方案1】:

让我建议,这是同一个问题:

React - useState - why setTimeout function does not have latest state value?

const _onClick = () => 
     setPopupOpen(!popupOpen);

     setTimeout(() => 
         setPopupOpen(popupOpen => !popupOpen)
     , 2000);
;

【讨论】:

【参考方案2】:

它的发生是因为setPopupOpen 是异步的。因此,当setPopupOpen(!popupOpen) 被调用时,它与onClick 第一个setPopupOpen(!popupOpen) 具有相同的值,所以最终当它同时调用setPopup doing same state update 时,即都更新为false。更好的方法是使用setPopupOpen 回调函数来更新值。我添加了这段代码。

import  useState  from "react";
import Link from "next/link";
import style from "./style.module.css";

const Header = () => 
  const [popupOpen, setPopupOpen] = useState(false);

  const toggle = () => 
    setPopupOpen((prev) => !prev);
  ;
  const onClick = () => 
    setPopupOpen(!popupOpen);
    setTimeout(() => 
      toggle();
    , 1000);
  ;

  return (
    <header className=style.header>
      <nav className=style.nav>
        <div className=style.popupContainer onClick=onClick>
          <span className=style.logo>Logo</span>

          popupOpen && (
            <span
              className=`$style.popupText $
                popupOpen ? style.show : style.hide
              `
            >
              Popup Text
            </span>
          )
        </div>

        <ul className=style.ul>
          <li>
            <Link href="/">
              <a>.home</a>
            </Link>
          </li>
          <li>
            <Link href="/contact">
              <a>.contact</a>
            </Link>
          </li>
        </ul>
      </nav>
    </header>
  );
;

export default function IndexPage() 
  return (
    <div>
      <Header />
    </div>
  );



这里是演示:https://codesandbox.io/s/pedantic-haibt-iqecz?file=/pages/index.js:0-1212

【讨论】:

以上是关于一段时间后在 Next.js 中隐藏一个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何构建 next.js 生产?

将 next.js 添加到组件库中以使用 Next.js 功能

登录后在哪里以及如何更改会话用户对象?

当鼠标一段时间没有移动时,用jQuery隐藏div元素?

仅进行“静态生成”时,是不是真的需要在“Next.js + Redux Toolkit”应用程序中使用“next-redux-wrapper”?

Next.js:如何从元素中获取应用样式?