遍历变量存储的JSX并追加到ref渲染时报类型错误如何解决
问题原因
你通过data.props.children遍历拿到的element是React虚拟DOM对象,本质是普通JS对象,并非浏览器原生DOM节点。append方法要求传入的参数必须是Node类型,直接传入React虚拟DOM对象就会触发该类型错误。
解决方案
根据你的使用场景可以选择以下两种处理方式:
- 方案1(推荐,符合React开发规范):不需要手动控制DOM追加逻辑,直接在组件的JSX中渲染即可,React会自动处理虚拟DOM到真实DOM的转换挂载:
// 你的组件渲染逻辑中直接使用 return <div ref={myRef}>{data.props.children}</div>
- 方案2(适用于必须手动逐个追加DOM的场景):借助React的渲染API把虚拟DOM转换为真实DOM后再追加:
如果是React 18+版本:
import { createRoot } from 'react-dom/client'; data.props.children.forEach(element => { // 创建临时容器渲染React元素 const tempContainer = document.createElement('div'); const root = createRoot(tempContainer); root.render(element); // 取出渲染后的真实DOM追加到目标节点 myRef.current.append(tempContainer.firstChild); });
如果是React 17及更早版本:
import ReactDOM from 'react-dom'; data.props.children.forEach(element => { const tempContainer = document.createElement('div'); ReactDOM.render(element, tempContainer); myRef.current.append(tempContainer.firstChild); });
注意:如果你的自定义组件包含状态、事件绑定等逻辑,手动渲染后需要在组件卸载时主动销毁对应的React实例,避免内存泄漏:React 18调用
root.unmount(),React 17及更早版本调用ReactDOM.unmountComponentAtNode(tempContainer)。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

