【发布时间】:2019-12-10 14:21:26
【问题描述】:
我无法从 react 的 useEffect Hook 访问元素。
const Guest = () => {
useEffect(() => {
let selectedElement = document.body.querySelectorAll('[contenteditable=true]');
console.log(selectedElement)
})
return (
<Fragment>
<div id='guest-editorjs'>
<Editor
tools={{
header: Header,
list: List,
image: Image,
delimiter: Delimiter
}}
holder="guest-editorjs"
onChange={(data) => console.log(data)}
onReady={() => console.log('Start!')}
data={data} />
</div>
</Fragment>
}
我正在尝试访问 contenteditable=true 的元素,并且所有这些元素都包含在此编辑器组件中。
但是当我运行代码时,控制台输出返回 console.log(selectedElement)(结果:空 NodeList),然后来自编辑器组件的 onReady 的 console.log('Start!')。
但是 useEffect 仅在渲染完成后才开始工作,还是我在某些时候错了?
更新:Guest组件第一次渲染后输出为: - 空节点列表 [] - 开始!
但是当我重新渲染组件时,它会返回包含所有需要元素的 NodeList。
【问题讨论】:
-
在功能组件中可以使用 useEffect ,因为其中没有生命周期挂钩。 useEffect 将始终在组件 dom 加载之前运行。Check this doc and the TIP
-
useEffect没有依赖关系意味着componentDidUpdate和componentDidMount。如果您希望稍后再使用,请使用useEffect(function, [])。 ref -
@Rajesh,我尝试通过 [] 但结果相同。 React 有没有办法在加载 DOM 时先等待,然后才调用函数?
-
我想我在尝试
scrollIntoView时遇到了同样的问题。它不适用于初始页面渲染。效果确实运行了,但元素报告的大小为零,因此滚动不起作用。在随后的渲染中,它确实运行良好。我使用[]依赖项添加了一个特殊效果,它运行scrollIntoView作为对window.addEventListener('load',...)的回调,现在它可以工作了!我需要两种效果才能基本上做同样的事情,这有点令人沮丧:(
标签: javascript reactjs