提问人:reeeeeeeeeeee 提问时间:2/3/2023 最后编辑:reeeeeeeeeeee 更新时间:2/3/2023 访问量:93
在 Typescript 中调用 getElementById() 之前如何确保文档已准备就绪
How to make sure document is ready before calling getElementById() in Typescript
问:
我有一个组件,它加载一些 HTML(通过标记的库从 MD 转换)并将其播放到页面上,如果单击一行,文档将滚动到页面上具有匹配标题 ID 的相应 HTML 元素。
import { marked } from 'marked';
const [content, setContent] = React.useState('');
React.useEffect(() => {
if (!source) {
return;
}
getRequest(source)
.then(response => {
if (!response.ok) {
return Promise.reject(response);
}
return response.text().then(faq => {
// sets page to html
setContent(marked(faq));
const nearestHeader = document.getElementById(headerID);
if (nearestHeader) {
// if search result is clicked, jump to result's nearest header
nearestHeader.scrollIntoView(true);
setRowClicked(false);
}
});
})
.catch(e => Dialog.error('Failed to load page.', e));
}, [source, rowClicked]);
但是,当我去测试此代码时,即使我验证了 headerID 与我要导航到的现有 HTML 元素的 ID 匹配,“nearestHeader”对象也始终为 null。如何在不使用额外库的情况下尝试 getElementById 调用之前确保文档已准备就绪/加载?
答:
0赞
reeeeeeeeeeee
2/3/2023
#1
通过添加另一个 useEffect 调用来解决,该调用等待首先设置页面的内容。从设置内容的初始 useEffect() 调用中删除了 nearestHeader 代码
React.useEffect(() => {
const nearestHeader = document.getElementById(headerID);
if (nearestHeader) {
nearestHeader.scrollIntoView(true);
setRowClicked(false);
}
}, [content]);
评论