javascript - 在页面入口处仅显示一次覆盖(不更改路线)。如何?
问题描述
所以我尝试在我的 gatsby 网站上覆盖大约一秒钟,让它在后面加载正确的断点。我怎样才能做到这一点?
所以我设置了一个 Interval 和一些 State 来加载 Overlay 并让它在一段时间后消失。但是每个页面重新加载覆盖后的问题再次出现。我没有像 redux 这样的状态管理,我需要 Overlay 只在每次刷新或从外部链接进入后出现,而不是点击内部链接。
我试过useEffect
只在挂载上渲染,但这并不能解决问题,因为内部链接更改会触发重新挂载
我发现我可以使用浏览器 API onInitialClientRender。但我不明白如何在 gatsby-browser.js 之外访问其中生成的值。一般来说,我在理解如何使用这些 API 时遇到问题。
customHooks.js
export function useInterval(callback, delay) {
const savedCallback = useRef()
// Remember the latest callback.
useEffect(() => {
savedCallback.current = callback
}, [callback])
// Set up the interval.
useEffect(() => {
function tick() {
savedCallback.current()
}
if (delay !== null) {
let id = setInterval(tick, delay)
return () => clearInterval(id)
}
}, [delay])
}
布局.js
let [loadingIndicator, setLoadingIndicator] = useState(true)
const delay = 500
useInterval(() => {
setLoadingIndicator(false)
}, delay)
因此,预期的结果将是一种告诉初始客户端渲染设置状态的方法,该状态告诉要渲染叠加层,并且在此渲染之后状态应该更改以禁用叠加层的渲染。
解决方案
解决方案:
使用 gatsby 更改静态 index.html 文件的能力。[在 Gatsby 中自定义 Index.html][1]
将自定义 div 添加到生成的 html.js
html.js:
<div
key={`loader`}
id="___loader"
style={{
alignItems: "center",
backgroundColor: "#F2F2F2",
display: "flex",
justifyContent: "center",
position: "absolute",
left: 0,
top: 0,
right: 0,
bottom: 0,
zIndex: 1,
}}
>
<LoaderSVG width="50%" />
</div>
在 gatsby-browser.js 中:
盖茨比浏览器.js:
export const onInitialClientRender = () => {
document.getElementById("___gatsby").style.display = "block"
setTimeout(function() {
document.getElementById("___loader").style.display = "none"
}, 200)
}
下一步是检查是否所有数据都已加载并添加一个动态值而不是超时。
推荐阅读
- xml - XSLT:将属性转换为子元素
- php - 当从 MySQL 数据库动态加载元素时,在 PHP 中连接 2 个 JSON 数组
- gitolite - 移动使用 Git Annex 的 Gitolite (3) 服务器
- python - Django ORM中的左连接(左连接两个表并将结果存储在第三个表中)
- python - 如何连接到 ZOOM API
- laravel - 如何在 Laravel 中显示限时产品报价
- mysql - MySql根据group by对查询的行进行编号
- typescript - 我可以确保其他人不会使用相同的参数调用某个函数吗?
- vbscript - ADODB.Stream 块是否与 Response.Buffer 冲突?
- javascript - 在多维 JavaScript 数组中动态保存 Smarty 值