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两次
有什么解决办法吗??
仅仅因为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 我想知道: 为什么它是这样工作的