当前位置: 首页 > 知识库问答 >
问题:

在scroll事件[duplicate]中对js组件重新渲染两次

终祯
2023-03-14
const [showHeaderState, setShowHeaderState] = useState(true);
      const prevScrollpos = useRef(window.pageYOffset);
    
      const handleScroll = () => {
        const currentScrollPos = window.pageYOffset;
        prevScrollpos.current < currentScrollPos
          ? setShowHeaderState(false)
          : setShowHeaderState(true);
        prevScrollpos.current = currentScrollPos;
      };
    
      useEffect(() => {
        window.addEventListener('scroll', handleScroll);
        return () => window.removeEventListener('scroll', handleScroll);
      }, []);
    
      console.log(showHeaderState);

此代码正在运行

但是当我日志渲染状态显示是组件渲染两次

上滚动日志true两次

向下滚动log false两次

有什么解决办法吗??

共有1个答案

胡鸿志
2023-03-14

仅仅因为console.log正在运行并不意味着您的组件实际上正在渲染两次,因为React可以运行组件的部分函数,而无需在完整的渲染中提交这些更改。如果您想检查是否有其他完整的渲染,请在没有依赖关系的效果钩子内放置console.log(每次重新渲染都会运行):

useEffect(() => { console.log("render") })

并查看记录了多少次。每次状态更改只能运行一次。

这个答案对这种现象提供了更完整的解释。

 类似资料:
  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 我有一个应用程序组件和测试组件 应用程序组件 测试组件:

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 非常简单的例子:我的App.js文件读取 我的Test.js文件上写着 在控制台中,渲染总是打印两次。为什么啊?

  • Vue中是否有一个事件在元素重新渲染后被触发?我有一个更新的对象,这导致我的模板更新。在它更新之后,我想触发一个运行jQuery函数的事件。代码如下所示: 如您所见,我尝试使用监视事件,但是当监视事件触发时,我的页面尚未更新。然而,blogPost已更改,但vue仍在呈现页面。我知道理论上我可以通过添加setTimeout来解决这个问题,但我更喜欢更干净的东西。

  • 我有一个组件,我设置了一个计数,让状态更新时,按钮点击。但是当我检查渲染时间时,每次我点击按钮它都会渲染两次。 https://codesandbox.io/s/brave-forest-yre6y?file=/src/App.js 我想知道: 为什么它是这样工作的