如果我们有实例化类Bar
的React组件Foo
,并且我们需要将ID为foo
的HTMLCollection
元素传递到Bar
,该如何完成?
Bar.js
最好保持不变。
我试了如下:
Foo.js
import Bar from './Bar';
const Foo = () => {
const elem = document.getElementById('foo');
const bar = new Bar(elem, {});
return (
<div id="foo">
</div>
);
};
export default Foo;
Bar.js
export default class Bar {
constructor(domElement, config = {}) {
console.log(domElement); // null
console.log(domElement.getElementsByClassName('bar')); // null
}
}
但是domElement
总是null
,可能是因为当我们运行document.getElementById
的时候,元素div#foo
还没有被渲染。
也尝试使用useRef
:
Foo.js
import { useRef } from 'react';
import Bar from './Bar';
const Foo = () => {
const elemRef = useRef(null);
const bar = new Bar(elemRef, {});
return (
<div id="foo" ref={elemRef}>
</div>
);
};
export default Foo;
Bar.js
export default class Bar {
constructor(domElement, config = {}) {
console.log(domElement); // {current: null}
console.log(domElement.getElementsByClassName('bar')); // Uncaught TypeError: domElement.getElementsByClassName is not a function
}
}
但是得到错误
Uncaught TypeError: domElement。getElementsByClassName不是一个函数
正确的做法是什么?
你可以使用uselayouteeffect钩子,它在所有DOM变化后同步触发
useLayoutEffect(() => {
const elem = document.getElementById("foo");
const bar = new Bar(elem, {});
}, []);