@codastic/react-positioning-portal

中文文档
0.8.0发布于 2025/11/18MITTypeScriptESM + CJS零依赖近 30 天下载 2.5万

定位出入口是一个低级反应组件,用于构建各种绝对定位的飞出,它们被锚入了景点中的另一个元素. 这可用于创建下拉,工具提示,上下文菜单等.

中文使用文档
文档目录10 节
  1. 安装
  2. 使用量
  3. 特征
  4. <PositioningPortal />
  5. <PositioningPortalWithState />
  6. API 参考
  7. <PositioningPortal />
  8. <PositioningPortalWithState />
  9. 定位 战略
  10. 实例

反应定位门户

Build Status NPM

定位门户是一个低级反应组件,用于构建各种 完全定位的飞行器 被固定在景点的另一部分. 这可用于创建下拉,工具提示,上下文菜单等.

定位门户的构建尽可能不开放 这意味着它只创建微小的DOM 并且不依赖于特定样式的图书馆。 它只在出入口上使用一些内置样式来进行定位.

门户相对于其主机在DOM中的位置由下列定义: 定位战略。 。 。 . 默认定位策略应足以用于大量使用案例. 要么就把门户放在上面 (左或右对齐)到锚或下方,取决于当前取景口中可用的空间. 此默认策略完全适合构建例如自定义下拉.

还有可能覆盖定位战略. 工具提示的示例如下: 故事书。 。 。 .

见 故事书 需要更多的实例.

安装

$ npm install @codastic/react-positioning-portal react react-dom --save

使用量

基本用途 <PositioningPortal /> 州治在外边.

import { useState } from 'react';
import { PositioningPortal } from '@codastic/react-positioning-portal';

// ...

const [isPortalOpen, setIsPortalOpen] = useState(false);

<PositioningPortal
  isOpen={isPortalOpen}
  onOpen={() => setIsPortalOpen(true)}
  onShouldClose={() => setIsPortalOpen(false)}
  portalContent={
    <div>
      Portal content goes here.
      <button type="button" onClick={() => setIsPortalOpen(false)}>
        Close
      </button>
    </div>
  }
>
  <button type="button" onClick={() => setIsPortalOpen(true)}>
    Open portal
  </button>
</PositioningPortal>

基本用途 <PositioningPortalWithState /> 处理内部状态.

import { PositioningPortalWithState } from '@codastic/react-positioning-portal';

// ...

<PositioningPortalWithState
  portalContent={
    <div>
      Portal content goes here.
    </div>
  }
>
  {({ open}) => (
    <button type="button" onClick={open}>
      Open portal
    </button>
  )}
</PositioningPortalWithState>

特征

<PositioningPortal />

  • 支持自定义定位策略.
  • 在定位门外处理国家事务.
  • 手接外出点击关闭门户.
  • 处理下键关闭门户.
  • 开关时的门户过渡.
  • 定义门户的自定义根节点.

<PositioningPortalWithState />

这个组件几乎相当于 <PositioningPortal /> 除外 页:1 isOpen 状态已经由组件本身处理。 所以,如果你不必控制这个州外 可以比较容易使用 <PositioningPortalWithState /> 让它自己处理国家.

API 参考

<PositioningPortal />

  • children: React.ReactNode数字 :

    定位门户组件将门户的锚点要素作为儿童。 内容 width 传递到 portalContent 渲染道具参数 relatedWidth。 。 。 .

  • portalElement?: React.ReactElement: (默认值 : <div />(中文(简体) )

    这个 portalElement 覆盖 portalContent在渲染时 portalContent 定位门户附件 样式 position, (中文(简体) ), width, (中文(简体) ), left, (中文(简体) ), top 财务报告和审定财务报表 visibility 页:1 portalElement通过定义自己的风格 portalElement 你可以覆盖这些风格。 例如,如果您喜欢为门户设置固定位置,您可以 执行下列:

      <PositioningPortal
        portalElement={<div style={{ position: 'fixed' }} />}
      >
      // ...
    
  • portalContent: React.ReactNode | ((params: PortalContentRenderProps<Strategy>) => React.ReactNode);数字 :

    门户开放时提供实际内容. portalContent 可以是任何反应节点或函数 返回反应节点。 该功能获得以下道具:

    interface PortalContentRenderProps<Strategy> {
      close: () => void; // Basically calls the handler passed to onShouldClose
      isOpen: boolean;
      isPositioned: boolean; // Becomes true after the portalContent is positioned and visible
      strategy: Strategy; // Whatever the positionStrategy returns
      relatedWidth: number; // The width of the PositioningPortal children
      transitionStarted: () => void; // Signals that there is a transition
      transitionEnded: () => void; // Should be called when the portal can safely be removed from the DOM
    }
    
  • onOpen: () => void数字 :

    将在门户内容定位和可见后调用.

  • onClose?: () => void

    门户关上后召回.

  • onShouldClose?: () => void数字 :

    如果 PortalContentRenderProps.close 在门户内容之外点击( 如果有的话) closeOnOutsideClick 是真实的)或 closeOnKeyDown 返回真实.

  • closeOnOutsideClick?: boolean: (默认值 : true(中文(简体) )

    如果设置为 true, (中文(简体) ), onShouldClose 通过在门户内容外点击来拨打.

  • closeOnKeyDown?: (event: KeyboardEvent) => boolean: (默认值 : event => event.keyCode === 27,关闭 ESC)

    函数,将调用 keydown。如果返回的话 true,处理器传递给 onShouldClose 将召入.

  • isOpen?: boolean数字 :

    设置要打开或关闭的定位门户.

  • positionStrategy?: PositioningStrategy<Strategy>数字 :

    设置自定义定位战略。 详见"定位战略"部分.

  • rootNode?: HTMLElement数字 :

    为要添加的门户通过自定义根节点 .

<PositioningPortalWithState />

扩展属性 <PositioningPortal /> 并添加/更改起伏属性:

  • children: React.ReactNode | ((params: RenderProps) => React.ReactNode)数字 :

    由于状态是在组成部分内处理的,因此有可能通过渲染功能使儿童得到以下渲染道具:

    interface RenderProps {
      close: () => void;
      open: () => void;
      isOpen: boolean;
    }
    

定位 战略

定位策略是接收母锚元素矩形的函数 parentRect 相对于取景口(以 getBoundingClientRect()(中文(简体) ) 和传送门的矩形。 在第一个渲染阶段,在调用定位战略之前,门户是隐形的.

战略职能部门应返回门户的位置(top 财务报告和审定财务报表 left) (中文(简体) ). 我可以选择返回其他任意数据(strategy),可用于自定义传送门的渲染. 例如,定义工具提示箭头的取向.

const positionStrategy (
  parentRect,
  portalRect
  props
) => {
  // Compute where the portal should be positioned...

  return {
    top,
    left,
    strategy
  };
};

这就是定位策略的类型定义:

export type PositioningStrategy<Strategy> = (
  parentRect: ClientRect,
  portalRect: ClientRect,
  props: Props<Strategy>
) => {
  top: number;
  left: number;
  strategy: Strategy;
};

实例

版本与发布记录

@codastic/react-positioning-portal 共发布 10 个版本,首次发布于 2020/04/10;过去 12 个月发布了 1 个版本。

版本发布日期距今
0.8.0latest2025/11/1811 个月前
0.7.02023/07/053 年前
0.6.02022/12/063 年前
0.5.02022/05/304 年前
0.4.02021/09/015 年前
0.3.22020/05/116 年前

关于 @codastic/react-positioning-portal 的常见问题

@codastic/react-positioning-portal 是什么?

定位出入口是一个低级反应组件,用于构建各种绝对定位的飞出,它们被锚入了景点中的另一个元素. 这可用于创建下拉,工具提示,上下文菜单等.

如何安装 @codastic/react-positioning-portal?

在项目目录运行 npm install @codastic/react-positioning-portal,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^16.12.0 || ^17.0.0 || ^18.0.0)、react-dom(^16.12.0 || ^17.0.0 || ^18.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@codastic/react-positioning-portal 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@codastic/react-positioning-portal 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@codastic/react-positioning-portal 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=16.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@codastic/react-positioning-portal 可以商用吗?

@codastic/react-positioning-portal 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@codastic/react-positioning-portal 的下载量有多少?

根据 npm 官方下载统计,@codastic/react-positioning-portal 在 2026/10/10 – 2026/11/08 这 30 天内被下载 25,204 次,日均约 840 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@codastic/react-positioning-portal 还在维护吗?

最新版本 0.8.0 发布于 2025/11/18(11 个月前);至今共发布 10 个版本,其中过去 12 个月发布了 1 个;首次发布于 2020/04/10。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。