【问题标题】:React useState no changing value in renderReact useState 在渲染中没有改变值
【发布时间】:2021-04-18 19:15:16
【问题描述】:

我有一个用于 PWA 的带有 customButton 的组件:

const PWA = () => {
  const [supportsPWA, setSupportsPWA] = useState(false)
  const [deferredPrompt, setDeferredPrompt] = useState(null)

  useEffect(() => {
    const handler = e => {
      e.preventDefault()
      setDeferredPrompt(e)
      setSupportsPWA(true)
    }
    window.addEventListener('beforeinstallprompt', handler)

    return () =>
      window.removeEventListener('beforeinstallprompt', handler)
  }, [])

  return (
    <>
      {supportsPWA.toString()}
      {console.log(supportsPWA)}
      {supportsPWA && <div>test</div>}
    </>
  )
}
export default PWA

我有beforeinstallprompt,我将supportsPWA 状态从false 更改为true。在渲染中我有supportsPWA.toString() 它总是false。控制台日志返回我:false 和下一个 true,所以如果 supportsPWAtrue 为什么 React 不渲染 div test

编辑:

我发现问题出在哪里。我在另一个组件中渲染 PWA 组件:{showMobileMenu &amp;&amp; (&lt;PWA /&gt;)}showMobileMenu 我通过按钮更改(从 falsetrue ),这是问题所在。当我删除 showMobileMenu &amp;&amp; ... 而我只有 &lt;PWA /&gt; 时,div 测试会正确呈现。但是不知道怎么解决?

【问题讨论】:

  • 您确定该组件没有被卸载并重新安装? {console.log(supportsPWA)} 的控制台中有多少条目?就2,真假?还是更多?
  • @NadiaChibrikova 我只有假和真
  • 这很奇怪。我会添加更多日志(在添加/删除事件侦听器之前和处理程序内部),也许可以带来一些亮点?

标签: reactjs react-hooks


【解决方案1】:

好吧,在你的情况下,而不是 {showMobileMenu &amp;&amp; (&lt;PWA /&gt;)} 每次卸载和安装你的组件,只要在你的 PWA 组件中显示/隐藏内容,如果这是可以接受的:

const PWA = ({ showPWAComponent }) => {
  const [supportsPWA, setSupportsPWA] = useState(false)
  const [deferredPrompt, setDeferredPrompt] = useState(null)

  useEffect(() => {
    const handler = e => {
      e.preventDefault()
      setDeferredPrompt(e)
      setSupportsPWA(true)
    }
    window.addEventListener('beforeinstallprompt', handler)

    return () =>
      window.removeEventListener('beforeinstallprompt', handler)
  }, [])

  return showPWAComponent && (
    <div>
      {supportsPWA.toString()}
      {console.log(supportsPWA)}
      {supportsPWA && <div>test</div>}
    </div>
  )
}
export default PWA

在你使用 PWA 的另一个组件中:

{<PWA showPWAComponent={showMobileMenu} />)}

在任何其他情况下,您所拥有的这种情况将无法正常工作,因为您在那里删除了组件。

【讨论】:

  • Np,我也编辑了我的答案,但实际上你的情况并没有太多可做的。如果这是您正在寻找的答案
猜你喜欢
  • 2020-12-16
  • 2021-04-21
  • 2021-03-21
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多