【问题标题】:React useEffect hook toggle issue反应 useEffect 钩子切换问题
【发布时间】:2022-01-06 22:03:33
【问题描述】:

我对 useEffect 在 React 中的工作方式感到困惑。以下代码有效,但与预期的方式相反。选中复选框后不会出现背景图片,而是在未选中复选框时出现,并在选中时消失。

function Beautifier() {
  const [isBeautiful, setIsBeautiful] = React.useState(false);

  React.useEffect(
    function toggleBackground(shouldShow) {
      document.body.classList.toggle('with-bg', shouldShow);
    }
  );
  
function handleChange() {
  setIsBeautiful(!isBeautiful);
} 

  return (
    <label>
      <input type="checkbox" onChange={handleChange} />
      Turn on pretty background
    </label>
  );
}

ReactDOM.render((
  <Beautifier />
), document.querySelector('#root'));

我很确定我的问题是我在 useEffect 挂钩中缺少 return() =>,但是我能想到的所有事情都没有解决问题/或破坏了函数。不添加 CSS,因为该部分工作正常。

【问题讨论】:

  • 不要手动切换类。使用新类重新渲染 html
  • 这是正确的代码吗?你已经声明了toggleBackground 两次,然后从不调用它。 shouldShow 是什么?
  • 是的,顶部的切换背景停留在那里是一个错误。现在我对如何在 useEffect 挂钩中调用它感到困惑。

标签: javascript reactjs react-hooks use-effect


【解决方案1】:

您似乎已经声明了两次 toggleBackground 并且没有调用它。您还缺少useEffect 上的依赖项数组。我假设您打算在useEffect 回调中实际调用toggleBackground。使用isBeautiful 状态作为依赖,并将其传递给toggleBackground 函数。

React.useEffect(() => {
  toggleBackground(isBeautiful);
}, [isBeautiful]);

您还应该使用功能状态更新来切换isBeautiful 状态。

function handleChange() {
  setIsBeautiful(isBeautiful => !isBeautiful);
} 

【讨论】:

  • 这解决了我的问题,谢谢。我想盯着这个看这么久意味着我错过了明显的东西,没有考虑基础知识。在 useEffect 中调用 toggleBackground 解决了这个问题。
  • @ToldiReloaded 不用担心,它会发生。干杯,祝你好运!
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2019-08-21
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多