[英]Page Jumps on Component Re-Render (ReactJS/Gatsby)
我正在为某人制作一个非常简单的 ReactJS/Gatsby 网站,但我的一个功能样式组件在重新渲染时遇到了问题。 问题是它导致 window 在重新渲染完成后跳转(滚动)。
重新渲染由用户单击触发 function 的 span 元素(包含在li
元素中)触发。
li
元素列表由组件的 state 确定。 整个父组件具有固定的高度,这就是我无法诊断问题的原因。
我期望发生的事情
要重新渲染的组件和窗口的滚动 position 保持在用户启动它时的位置。
实际发生了什么
当用户单击元素时,页面似乎会跳转(滚动)。 有时它会这样做并保留在新的 position 中,有时它会这样做然后返回到原始卷轴 position。
我已经尝试遵循其他问题的建议,这些问题建议使用event.preventDefault()
和其他建议将样式从组件本身移出,而是选择使用类。
这些解决方案都不起作用。
我已经设法明确地发现问题是由于 setActiveTabs - 这会导致ul
元素的重新渲染 - 在window.scrollY
在它触发之前和完成之后都记录显示不同的值。
我已经设法弄清楚问题在于使列表项可定位。 似乎添加tabIndex="0"
属性或使li
子元素成为交互式元素都会导致此错误。
有谁知道解决这个问题的方法?
完整的前端源代码可以在以下 GitHub repo 中找到: https://github.com/MakingStuffs/resinfusion
为了解决这个问题,我需要防止被点击的元素被重新渲染。 为了做到这一点,我编辑了 clickHandler 以便它在设置 state 后使用element.blur()
。
点击处理程序如下:
const forwardClickHandler = event => {
setLoading(true)
const clickedSlug =
event.target.closest("button") !== null
? event.target.closest("button").getAttribute("data-slug")
: event.target.children[0].getAttribute("data-slug")
const categoryObject = getNeedle(clickedSlug, categories, "slug")
const subCatObject = getNeedle(clickedSlug, subCategories, "slug")
const serviceObject = getNeedle(clickedSlug, services, "slug")
const associatedChildren = getAssociatedChildren(
categoryObject
? categoryObject
: subCatObject
? subCatObject
: serviceObject
)
setBgImage(associatedChildren[0].thumb.localFile.childImageSharp.fluid)
setActiveTabs(associatedChildren)
event.target.blur()
return setTimeout(() => setLoading(false), 1000)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.