onMouseEnter onMouseLeave 错误:太多的重新渲染反应[重复]

Posted

技术标签:

【中文标题】onMouseEnter onMouseLeave 错误:太多的重新渲染反应[重复]【英文标题】:onMouseEnter onMouseLeave Error: Too many re-renders react [duplicate] 【发布时间】:2020-09-29 11:52:17 【问题描述】:

所以这是我减速路线的第一个组件。我决定制作两个导航项。并做了一些造型。但是我得到了许多重新渲染的错误。因为我尝试添加带有悬停效果的样式。我不想使用 css。 这是我的代码:

import React,  useState  from 'react';
import  BrowserRouter, Route, Switch, Link  from 'react-router-dom';
import logo from './logo.svg';
import './App.css';
import Products from './Screens/ProductsList';
import Preview from './Screens/Product';
import ProductCreate from './Screens/ProductCreate';
import ProductEdit from './Screens/ProductEdit';
import Home from './Screens/Home';

function App() 
  const [hover, setHover] = useState(false);
  return (
    <BrowserRouter>
      <div style=style.navigationContainer>
        <Link
          onMouseEnter=setHover(true)
          onMouseLeave=setHover(false)
          style=hover ? style.hoverNavItem : style.navItem
          to="/products"
        >
          Products List
        </Link>
        <Link
          onMouseEnter=setHover(true)
          onMouseLeave=setHover(false)
          style=hover ? style.hoverNavItem : style.navItem
          to="/products/create"
        >
          Create Product
        </Link>
      </div>

      <Switch>
        <Route
          key="edit-product"
          path="/products/:id/edit"
          component=ProductEdit
        ></Route>
        <Route
          key="add-product"
          path="/products/create"
          component=ProductCreate
        ></Route>
        <Route key="preview" path="/products/:id" component=Preview></Route>
        <Route key="products" path="/products" component=Products></Route>
        <Route exact path="/" component=Home></Route>
      </Switch>
    </BrowserRouter>
  );


export default App;

【问题讨论】:

我能问一下你为什么要使用 JS 而不是 CSS 来完成这项任务吗?出于性能原因和代码简单性,何时 CSS 将成为首选选项 我喜欢一个地方,我只需要为少数项目制作样式,所以我不想创建css文件。 你以前用过styled-components吗?它们让生活变得超级简单,代码超级易读,并且不会像在纯 JS 中那样对性能产生影响 从未尝试过,我会阅读文档,谢谢:) 用 css 重新制作,现在我发现它需要更少的代码。 【参考方案1】:

您需要在 onMouseOver=() =&gt; setHover(true sandbox here 这样的事件上触发功能,但是使用您的技术,当一个悬停时,您将同时更改链接

【讨论】:

【参考方案2】:

您需要将一个函数传递给onMouseEnteronMouseLeave,以便在这些事件被触发时调用setHover 函数

改变

onMouseEnter=setHover(true)
onMouseLeave=setHover(false)

onMouseEnter=() => setHover(true)
onMouseLeave=() => setHover(false)

执行onMouseEnter=setHover(true) 将立即调用setHover 函数并更新状态,而不是等待onMouseEnter 事件。因此,您的代码陷入了更新状态和重新渲染的无限循环

虽然,如果您只是想在hover 上的任何元素上应用一些样式,那么使用 CSS 做这件事要比您尝试做的要好得多。无需重新渲染组件,当它被悬停时,只需更新其样式。

另外请记住,由于当hover 为真时您将样式应用于两个Link 组件,如果您将鼠标悬停在Link 组件之一上,它会将hover 设置为true 并且两个@ 987654334@ 组件将被设置样式。

【讨论】:

这是一个很好的答案,我会在它回答 OP 问题时投赞成票。我强烈建议 OP 使用 CSS,尽管出于多种原因,这项任务更有意义 @RedBaron 我同意,我在回答中提到了这一点。 感谢成功。忘记函数调用了。

以上是关于onMouseEnter onMouseLeave 错误:太多的重新渲染反应[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据屏幕宽度禁用 onMouseEnter/onMouseLeave 事件?

onMouseEnter 和 onMouseLeave 在我的代码中的行为与预期相反 - 为啥? [复制]

onMouseEnter onMouseLeave 错误:太多的重新渲染反应[重复]

JS事件:onmouseover onmouseout &&onmouseenter onmouseleave &&onmousemove的区别

js技术

每日分享