首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用useRef的React createPortal不起作用

问题描述:使用useRef的React createPortal不起作用。

解答: React的createPortal方法可以将组件渲染到DOM树中的任意位置,而不仅仅是组件所在的位置。在某些情况下,我们可能需要将组件渲染到DOM树的根节点之外,比如在弹出框或者模态框中显示组件。

在使用createPortal方法时,我们可以结合useRef钩子来获取一个DOM节点的引用,然后将该节点作为createPortal方法的第二个参数传入,从而实现将组件渲染到指定的DOM节点上。

以下是一个示例代码:

代码语言:txt
复制
import React, { useRef, useEffect } from 'react';
import ReactDOM from 'react-dom';

const Modal = ({ children }) => {
  const modalRootRef = useRef(null);

  useEffect(() => {
    const modalRoot = modalRootRef.current;
    const modalContainer = document.createElement('div');
    modalRoot.appendChild(modalContainer);

    return () => {
      modalRoot.removeChild(modalContainer);
    };
  }, []);

  return ReactDOM.createPortal(
    children,
    modalRootRef.current
  );
};

const App = () => {
  return (
    <div>
      <h1>React createPortal Example</h1>
      <Modal>
        <p>This is a modal content.</p>
      </Modal>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));

在上述代码中,我们创建了一个Modal组件,该组件使用createPortal方法将其子组件渲染到modalRootRef.current所引用的DOM节点上。在Modal组件的useEffect钩子中,我们通过document.createElement方法创建了一个div元素,并将其作为子节点添加到modalRootRef.current所引用的DOM节点上。在组件卸载时,我们通过modalRoot.removeChild方法将该div元素从DOM树中移除。

需要注意的是,modalRootRef.current所引用的DOM节点必须在组件渲染之前存在,否则createPortal方法将无法正常工作。

推荐的腾讯云相关产品:腾讯云云服务器(CVM)和腾讯云对象存储(COS)。

  • 腾讯云云服务器(CVM):腾讯云提供的弹性计算服务,可快速部署云服务器实例,满足不同规模和业务需求。 产品介绍链接地址:腾讯云云服务器(CVM)
  • 腾讯云对象存储(COS):腾讯云提供的高可用、高可靠、可扩展的云端存储服务,适用于存储和处理各种类型的文件和数据。 产品介绍链接地址:腾讯云对象存储(COS)

以上是关于使用useRef的React createPortal不起作用的解答,希望能对您有所帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

细说ReactuseRef

ReactuseRef 最近学习react中碰到useRef碰到了一些疑问,顺手记录下来。 useState碰到问题 说到useRef那么我们先来看看useState存在"问题"。...当我们点击按钮调用setLike,react会再次渲染组件(运行Demo函数)。此时新函数内部like是1,然后使用内部这个值重新调用Demo函数进行页面渲染。...useRef日常主要有两种作用,我们先来说说刚才关于state碰到问题,使用useRef来如何解决。...而且useRef类似于react全局变量并不存在不同次render中state/props作用域隔离机制。这就是useRef和useState这两个hook主要区别。...react中获取DOM 说到上边你可以已经了解了,没错useRef还有一种用法就是通过它来获取页面上DOM元素。

1.8K20
  • React 弹窗组件用 createPortal 是怎么实现

    把 url 改为 3000 端口: 在组件里打个断点: 点击调试启动: 代码在断点处断住了,调用栈前面这些就是 react 源码: 从哪里看起呢? 肯定是从 createPortal 开始看啊。...搜索 createPortal,在这里打个断点: 其实看它返回值就知道,这是一个 React Element,也就是 vdom,类型是 REACT_PORTAL_TYPE。...点击释放断点,代码就会执行到这里: 注意这个 containerInfo,它就是 createPortal 传入第二个参数: 然后我们再看 vdom 转 fiber 部分,也就是 REACT_PORTAL_TYPE...createPortal 返回值就是一种 React Element 节点,其中 containerInfo 存放着容器节点。...这样,createPortal 第一个参数节点,就会挂到 body 下。 这就是弹窗组件依赖 createPortal api 实现原理。

    43930

    React 中实现 keep alive(可参与文末讨论哦)

    什么是 keep alive 在 Vue 中,我们可以使用 keep-alive 包裹一个动态组件,从而「缓存」不活跃实例,而不是直接销毁他们: <component :...最简单方案 而在 React 中,其实一直以来都没有官方 keep alive 解决方案,大部分开发者可能都会直接使用 display: none 来将 DOM 隐藏: <div style={shouldHide...❞ 这是 React 官方文档[1]上对 Portal 特性介绍,值得注意是,这里只是说“父组件以外 DOM 节点”,但没有要求这个 DOM 节点是真的在页面上,还是「只是存在于内存中」。...因此,我们可以先通过 document.createElement 在内存中创建一个元素,然后再通过 React.createPoral 把 React 子节点渲染到这个元素上,这样就实现了“空渲染”。...实际使用方式如下: <Conditional active={!

    1.8K31

    这可能是你需要React实战技巧_2023-03-15

    一、父组件通过 Ref 调用子组件中方法这里同时演示使用函数组件和类组件父子组件如何编写子组件React.forwardRefReact.useImperativeHandlepublic、private...CompFnParent() { const RefFnChild = React.useRef(null) const RefClassChild = React.useRef...show 方法 **/ // 因为在未来 react 中,组件渲染又可能是异步,所以不建议直接使用 render 返回实例,应该用下面方式 ReactDOM.render<IModalProps...react 组件ReactDOM.createPortal 建立传送门通过 props 控制interface IModalProps { visible: boolean title: string...,这里只是很简单演示一下,关键点在你要掌握 ReactDOM.render 和 ReactDOM.createPortal 使用,当你掌握了这两者,诸如 Toast、Dialog、Dropdown

    78440

    这可能是你需要React实战技巧

    一、父组件通过 Ref 调用子组件中方法这里同时演示使用函数组件和类组件父子组件如何编写子组件React.forwardRefReact.useImperativeHandlepublic、private...CompFnParent() { const RefFnChild = React.useRef(null) const RefClassChild = React.useRef...testname={myname} /> ) }}总结一下,其实使用 class 方式再配合上 typescript 编写子组件其实是最能简洁明了参考React实战视频讲解...show 方法 **/ // 因为在未来 react 中,组件渲染又可能是异步,所以不建议直接使用 render 返回实例,应该用下面方式 ReactDOM.render<IModalProps...,这里只是很简单演示一下,关键点在你要掌握 ReactDOM.render 和 ReactDOM.createPortal 使用,当你掌握了这两者,诸如 Toast、Dialog、Dropdown

    79110

    React实战精讲(React_TSAPI)

    你能所学到知识点 ❝ TS_React:使用泛型来改善类型 TS_React:Hook类型化 TS_React:类型化事件回调 React API ❞ TS_React:使用泛型来改善类型 TypeScript...❝这里要提到一件事是,「当类型推断不起作用时,应该依靠泛型参数而不是类型断言」。...,防止做无关刷新, 其次,这个子组件必须配合React.memo,否则不但不会提升性能,还有可能降低性能 ---- useRef useRef: 可以获取当前元素所有属性,并且返回一个可变ref对象...---- react-dom createPortal createPortal:在Portal中提供了一种将子节点渲染到 DOM 节点中方式,「该节点存在于 DOM 组件层次结构之外」。...也就是说 createPortal 可以把当前组件或element元素子节点,渲染到组件之外其他地方。

    10.4K30

    前端常见react面试题合集

    更重要是,你不能保证在组件挂载之前 Ajax 请求已经完成,如果是这样,也就意味着你将尝试在一个未挂载组件上调用 setState,这将不起作用。...Hooks 在类中不起作用,通过使用它们,咱们可以完全避免使用生命周期方法,例如 componentDidMount、componentDidUpdate、componentWillUnmount。...纯函数输入输出确定性 o useMemo 纯一个记忆函数 o useRef 返回一个可变ref对象,其Current 属性被初始化为传递参数,返回 ref 对象在组件整个生命周期内保持不变。...在较大应用中追踪性能回归可能会很方便(3)React16.13.0支持在渲染期间调用setState,但仅适用于同一组件可检测冲突样式规则并记录警告废弃 unstable_createPortal,...使用CreatePortal将组件堆栈添加到其开发警告中,使开发人员能够隔离bug并调试其程序,这可以清楚地说明问题所在,并更快地定位和修复错误。

    2.4K30

    React 原理问题

    Portal 提供了一种将子节点渲染到存在于父组件以外 DOM 节点优秀方案。 ReactDOM.createPortal(child, container) 10....父组件向子组件通信: 通过 props 传递 子组件向父组件通信: 主动调用通过 props 传过来方法,并将想要传递信息,作为参数,传递到父组件作用域中 跨层级通信: 使用 react 自带Context...使用 Redux 或者 Mobx 等状态管理库 使用订阅发布模式 11. React 父组件如何调用子组件中方法?...1、如果是在方法组件中调用子组件(>= react@16.8),可以使用useRef和useImperativeHandle: const { forwardRef, useRef, useImperativeHandle...类组件中优化手段 1、使用纯组件 PureComponent 作为基类 2、使用 React.memo 高阶函数包装组件 3、使用 shouldComponentUpdate 生命周期函数来自定义渲染逻辑

    2.5K00

    React进阶」 React全部api解读+基础实践大全(夯实基础万字总结)

    老规矩,我们带着疑问开始今天阅读(自测掌握程度)? 1 react暴露api有哪些,该如何使用? 2 react提供了哪些自测性能手段?...如果你想要在使用服务端渲染应用中使用,我们推荐 Loadable Components 这个库 React.lazy和Suspense配合一起用,能够有动态加载组件效果。...createPortal 可以把当前组件或 element 元素子节点,渲染到组件之外其他地方。 那么具体应用到什么场景呢?...createPortal接受两个参数: ReactDOM.createPortal(child, container) 第一个:child 是任何可渲染 React 子元素 第二个:container...createPortal.jpg 我们可以看到,我们children实际在container 之外挂载,但是已经被createPortal渲染到container中。

    2.1K30

    学用Hooks写React组件——基础版Select组件

    作为码农当然不能满足于此所以 方案二: 通过React提供createPortal来实现render body方式渲染到body节点下,解决方案一问题。...这里使用React.createProtal来创建root节点外组件,参考:https://zh-hans.reactjs.org/docs/portals.html。.../ 是否设置默认值 const [defaultValueState, setDefaultValueState] = useState(true) const inputRef = useRef...使用React.cloneElement对props.children进行新props传输,参考官网:https://zh-hans.reactjs.org/docs/react-api.html#cloneelement...监听documentclick事件,来实现点击空白处下拉框消失。但是因为React事件自己封装了一层并不是原生事件,这里涉及到了原生事件和合成事件冒泡和捕获问题。

    3K20

    React知识图谱

    Antd3 Form、react-redux connect、react-router withRouter等 传送门createPortal ReactDOM.createPortal(child,...它可以让你在不编写 class 情况下使用 state 以及其他 React 特性。 规则1:不要在循环,条件或嵌套函数中调用 Hook, 确保总是在你 React 函数最顶层调用他们。...useCallback 缓存函数 useMemo 缓存参数 useRef 返回 ref 对象在组件整个生命周期内保持不变。 使用场景如Antd4 Form实现useForm时候。...recoil中状态读写都是Hooks函数,目前没有提供类组件使用方式。 recoil是Facebook开发,可以使用React内部调度机制,这是redux和mobx不支持。...目前任何一个状态管理库都不是强制使用,也有很多精小项目不使用第三方状态管理库,而只是使用React自身state、useContext等API就可以达到目的。

    35720

    ReactPortals传送门

    ReactDOM.createPortalReact组件挂载到了其他DOM结构下,在这里是挂载到了document.body下,当然这这也是最常见做法,这样我们就可以通过Portal将组件传送到目标渲染位置...与第三方库集成: 有时候,我们可能需要将React组件与第三方库(例如地图库或视频播放器)集成,使用Portals可以将组件渲染到第三方库所需DOM元素中,即将业务需要额外组件渲染到原组件封装好...预定义HTML挂载点: 使用React Portal时,我们需要提前定义一个HTML DOM元素作为Portal组件挂载。...ReactDOM.createPortal(children, containerRef.current) : null; }; 接下来我们来看构造在React树中DOM结构,这块可以说是整个实现精髓...、React.isValidElement、React.cloneElement等方法使用等等,也都是非常有意思实现。

    25150

    浅谈表单受控性及结合Hooks应用

    在本文中将介绍在 React 中受控和非受控表单是如何使用,以及现代化使用 hooks 来管理 form 状态。...使用场景: 需要对用户输入进行验证和处理表单 需要实时反映用户输入表单 需要根据表单元素值动态地改变其他组件状态或行为等情况时会使用到受控表单 示例代码: import React, { useState...import React, { useRef } from 'react'; function UncontrolledForm() { const nameInputRef = useRef...通过 defaultValue 来设置组件默认值,它仅会被渲染一次,在后续渲染时并不起作用 使用场景 基本为最佳实践 一般作为简易实现 3 使用 Hooks 管理 form 优势 以 ant3...不同于 rc-field-form 中使用受控表单来做表单状态管理,react-hook-form 使用React useRef 和 useReducer 来处理表单数据状态,而不是使用

    31810
    领券