react-okr-tree Logoreact-okr-tree
API

API

react-okr-tree 的完整 API 表:42 个 props、字段映射、14 个回调、28 个 ref 方法、渲染定制与组合组件。

以下六张表由 packages/react-okr-tree/shared/api.ts 单一来源渲染——库侧的防漂移测试(tests/api-surface.spec.tsx)断言 Methods 表与真实的 OkrTreeHandle 一致,README 的 API 段落读的也是同一份数据。

命名规则是机械转换:kebab-case → camelCase、事件 → onXxx 回调、插槽 → render props、v-model:xx + onXxxChangecurrentLableClassNameshowCollapsable 两处原版拼写错误刻意保留。完整差异见从 vue3-okr-tree 迁移

Attributes

与 vue3-okr-tree 逐项对齐(含原版拼写);className / style / children 为 React 侧新增。

prop说明类型可选值默认值
data展示数据(数组,支持多根)array— (必填)
direction树的展开方向stringhorizontal / verticalvertical
onlyBothTree飞书 OKR 模式:子树在根节点左右两边展开。只在 direction="horizontal" 时有效,且必须提供 leftDatabooleanfalse
leftData左子树的数据,仅在 onlyBothTree 模式启用array
labelWidth节点宽度。number 单位 px;string 直接作为 style.widthstring / numberauto
labelHeight节点高度。number 单位 px;string 直接作为 style.heightstring / numberauto
labelClassName节点 className 的回调或固定串。入参是内部 TreeNode 实例(源数据在 node.dataFunction(node) / string
currentLableClassName当前选中节点的 className(保留原版拼写)Function(node) / string
showCollapsable节点是否可展开/折叠(显示 +/- 圆盘)。为 false 时组件强制全部展开(原版行为)booleanfalse
accordion手风琴:用户展开某节点时自动收起同级兄弟。只作用于交互展开(按钮、点卡片、键盘);expandNode 与受控 expandedKeys 不受互斥限制booleanfalse
expandOnClickNode点击卡片内容切换展开。叶子只选中不切换;OKR 根节点只切右侧子树booleanfalse
showCheckbox复选框模式:卡片前渲染勾选框,父子联动半选态(checkStrictly 可关闭)。OKR 左右两树勾选独立维护,方法按 key 对两树同时生效booleanfalse
checkStrictly父子不联动:勾选只作用于自身,无半选传播booleanfalse
defaultCheckedKeys初始勾选的 key 数组(需 nodeKey)。运行时变更 = 先清空再按新列表应用;data 重建后不恢复array
draggable拖拽换父级(HTML5 DnD):可放到目标节点的 prev / inner / next。移动会同步修改源数据 children,inner 时目标自动展开。禁止放进自身或其子树;OKR 跨左右树默认禁止booleanfalse
allowDrag返回 false 禁止拖动该节点(disabled 节点恒不可拖)Function(node)
allowDrop返回 false 禁止该放置位置;跨左右树默认禁止,明确返回 true 可放开Function(draggingNode, dropNode, type)type: 'prev' / 'inner' / 'next'
connector连接线渲染模式。svg 只替换线条渲染,布局与 css 模式完全一致,随展开收起与尺寸变化自动重绘stringcss / svgcss
connectorShapesvg 模式的路径形状(仅 connector="svg" 生效)stringcurve / orthogonal / straightcurve
unstyled去掉卡片外观(背景/边框/圆角/阴影,含 hover),保留布局与连接线。刻意不动 padding / 字号 / 文字色——改 padding 会移动节点盒、牵动连接线几何booleanfalse
showNodeNum折叠时在圆盘内显示子节点数(只计未被 filter 隐藏的可见子节点)booleanfalse
defaultExpandAll默认全部展开(仅在 showCollapsable 为 true 时有意义)booleanfalse
renderContent节点内容区渲染函数。React 版不传 h(D1),返回 ReactNode;入参 node 为内部 TreeNode(源数据在 node.data,文本在 node.labelFunction(node)
nodeBtnContent展开按钮内容渲染函数,参数约定同上Function(node)
nodeComponent节点内容组件,以 { node, data } 为 props。优先级 renderNode > nodeComponent > renderContentComponentType
props字段映射配置,见下表object见下表
nodeKey节点唯一标识字段名(整棵树应唯一)string
defaultExpandedKeys默认展开的 key 数组(需 nodeKey);OKR 下左右两树同时生效array
currentNodeKey初始选中节点的 key(需 nodeKey,单向)string / number
filterNodeMethod节点筛选方法,返回 false 隐藏。filter('') 时同样执行,需对空值返回 true 才能恢复全部显示Function(value, data, node)
animate展开过渡动画。系统开启「减弱动态效果」时自动按关闭处理booleanfalse
animateName动画名stringokr-fade-in-linear / okr-fade-in / okr-zoom-in-center / okr-zoom-in-top / okr-zoom-in-bottom / okr-zoom-in-leftokr-zoom-in-center
animateDuration动画时长 msnumber200
alignRootOKR 模式下按左右子树自动对齐根节点(纯 CSS),展开/收起不改变根位置;false 回退原版行为booleantrue
theme内置主题或自定义名字(自定义需自写 .okr-theme-{name} 变量)。所有外观取值均可用 --okr-* 覆盖stringdefault / feishu / dark / auto / minimal / colorfuldefault
expandedKeys + onExpandedKeysChange受控展开态(需 nodeKey):列表内展开、其余收起。未传 expandedKeys 时为非受控(默认行为)。只传值不传回调 = 锁定不可交互改array / Function(keys)
currentKey + onCurrentKeyChange受控选中态(需 nodeKey),null 表示无选中string / number / null / Function(key)
lazy懒加载:初始 data 中没有 children(或为空数组)的节点视为未加载,首次展开时调 loadbooleanfalse
load懒加载取数函数。resolve(children) 后子节点写入源数据 children 并展开;reject() 或抛错回到折叠态、可重试。node.isLeftChild 可区分 OKR 左树Function(node, resolve, reject?)
deepWatchdata 深度侦听开关(创建期生效):true 时每次渲染做结构脏检查以接住原地变更;false 只响应引用变化。React 下的能力边界见 requirements R2 / D7booleantrue
className / style透传到 .org-chart-container 根容器string / CSSProperties
children传函数时等价 renderNode(对应源项目 #default 插槽)ReactNode | Function(scope)

props(字段映射配置)

通过 props prop 传入。

字段说明类型默认值
label节点文本:属性名或函数string / function(data, node)label
children子节点属性名stringchildren
disabled禁用字段(真实生效is-disabled、不选中、不触发 onNodeClick、不可拖)string / function(data, node)disabled
isLeaf叶子字段:lazy 下未加载节点据此判定,标记为叶子则不显示按钮、不触发 loadstring / function(data, node)

Events(回调 props)

node 均为内部 TreeNode 实例。源项目回调的第三参 nodeComponent(组件实例)在 React 无对应概念,已移除(D2);DOM 定位用 handle.getNodeEl()

回调说明参数
onNodeClick节点被点击(同时设置选中态)(data, node)
onNodeExpand节点展开(data, node)
onNodeCollapse节点收起(data, node)
onNodeContextMenu节点右键。仅当传入本回调时才阻止浏览器默认菜单。事件参数是 React 合成事件,原生事件取 event.nativeEvent(D11)(event, data, node)
onExpandedKeysChange受控展开态变化时触发(仅传入 expandedKeys 时)(keys)
onCurrentKeyChange受控选中态变化时触发(仅传入 currentKey 时)(key | null)
onCheck复选框被点击时触发(仅 showCheckbox;程序化 setCheckedKeys 不触发)(data, { checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys })
onCheckChange节点勾选态变化时触发(仅 showCheckbox;每个受影响节点各一次,含联动与 setCheckedKeys 批量变更)(data, checked, indeterminate)
onNodeDragStart开始拖拽(仅 draggable)(node, event)
onNodeDragEnter拖拽进入某节点(draggingNode, dropNode, event)
onNodeDragLeave拖拽离开某节点(draggingNode, dropNode, event)
onNodeDragOver悬停在有效放置区内(draggingNode, dropNode, event)
onNodeDragEnd拖拽结束;未完成放置时后两参为 null(draggingNode, dropNode | null, dropType | null, event)
onNodeDrop完成放置(源数据已在 moveNode 中同步)(draggingNode, dropNode, dropType, event)

Methods(通过 ref 调用)

通过 ref 拿到 OkrTreeHandle 调用。增删类方法会同步修改传入的源数据(与源项目一致)。入参普遍接受 key / data 对象 / TreeNode 实例三种形态。

方法说明参数
filter触发过滤;onlyBothTree 下同时过滤左右子树。未设置 filterNodeMethod 时抛错(value)
updateKeyChildren用新数据替换 key 节点的全部子节点(需 nodeKey,缺失抛错)(key, data)
getNode获取内部 Node。OKR 下右树优先,未命中回退左树;未设 nodeKey 时按 data 对象查不到(data)
getNodeEl取节点对应的 DOM 元素;未渲染/不可见时为 null(data)
getNodeKey取节点用于列表 key 的值(nodeKey 字段或内部 $treeNodeId)(node)
setCurrentNode按 Node 实例设置选中(需 nodeKey,缺失抛错)(node)
setCurrentKey按 key 设置选中(需 nodeKey,缺失抛错);传 null 取消高亮(key | null)
getCurrentKey当前选中 key;无选中返回 null(需 nodeKey,缺失抛错)
getCurrentNode当前选中节点的 data;无选中返回 null
remove删除节点。必须设 nodeKey,未设置时静默无效。会同步删除源数据中的对应项(data)
append追加子节点(省略 parent 则挂为根)。会同步写入源数据 children(data, parentNode?)
insertBefore在参考节点前插入。同上会回写源数据(data, refNode)
insertAfter在参考节点后插入。同上(data, refNode)
expandAll展开全部(含左右两树);lazy 下未加载节点先加载再展开
collapseAll收起全部(含左右两树)
expandNode展开指定节点,默认连同祖先;OKR 根节点同时展开两侧;lazy 下先加载。返回 Node 或 null(data, expandParent = true)
collapseNode收起指定节点;OKR 根节点同时收起两侧(data)
scrollToNode滚动到节点:默认先展开全部祖先、等待路径上的懒加载完成,再 scrollIntoView(居中,减弱动效时不用平滑)。返回是否完成(data, options?) options 为 ScrollIntoViewOptions + expand(默认 true)
getCheckedNodes勾选的 Node 实例列表(左右两树)(leafOnly = false)
getCheckedKeys勾选的 key 列表(需 nodeKey;左右合并去重)(leafOnly = false)
setCheckedKeys整体设置勾选(先清空;非 strictly 时带父子联动;OKR 左右同 key 同时生效)(keys, leafOnly = false)
getHalfCheckedNodes半选节点实例列表
getHalfCheckedKeys半选节点 key 列表(需 nodeKey;左右合并去重)
isChecked节点当前是否勾选;未找到为 false(data)
moveNode移动到目标的 prev / inner / next,同步源数据;inner 时目标自动展开。禁止放进自身或其子树。成功返回 true(data, target, type)
getVisibleNodes当前真正可见的节点(含 OKR 左树):自身通过过滤且各级祖先已展开到它。折叠子树仍挂载在 DOM 中,所以不等于 DOM 里的节点数
getNodePath顶层到目标的链路(含目标)。左树节点的链路留在左树内,不跨接到右树根;未命中返回空数组(data)
refreshDataReact 版新增(D7):源数据被原地改动而宿主没重渲染时,显式触发增量更新(等价 Vue 的 deep watch)
store / root数据仓库与虚拟根实例(源项目同样暴露,高级用法)

渲染定制(对应源项目插槽)

源项目的具名插槽在 React 里是 render props,作用域参数形状保持一致。renderNoderenderContent 二选其一即可,插槽优先。

prop对应源项目插槽作用域参数
renderNode(或 children 传函数)#default{ node, data },node 为内部 TreeNode
renderExpandBtn#expand-btn{ node, data, expanded, side, loading };side 为 right(常规/右子树)或 left(OKR 左子树)。showNodeNum 的折叠数字优先于它
empty#emptydata 为空数组时渲染在容器内
renderToolbar(OkrTreeViewport)#toolbar{ zoom, zoomIn, zoomOut, reset, fit }

组合组件与键盘导航

OkrTreeGroup 让组内多棵 OKR 树的根节点水平坐标一致(替代源项目文档里「业务层手动量 DOM」);OkrTreeViewport 提供画布缩放/平移/导出。键盘导航为所有树内置。

名称类型说明
OkrTreeGroup / alignprop,boolean,默认 truefalse 时各树独立排布
OkrTreeGroup / refresh()method手动重新测量(字体加载完成、外部样式变化等;组件已自动响应成员挂载/更新与尺寸变化)
OkrTreeGroup / children放置若干 <OkrTree onlyBothTree />
OkrTreeViewport propsminZoom / maxZoom / zoomStep / zoom + onZoomChange / offset + onOffsetChange / wheelBehavior / toolbar / renderToolbar缩放范围与受控值;wheelBehavior:ctrl-zoom(默认,不劫持页面滚动)/ zoom / scroll
OkrTreeViewport methodszoomIn / zoomOut / reset / fitToScreen(padding?) / centerNode / exportImage / getZoom / getOffset双击复位;fitToScreen 默认四周留 20px;centerNode 先展开祖先再对准视口中心
exportImage(options)method{ type: 'png' | 'svg', scale = 2, background, toPng?, toSvg? }。依赖可选 peer html-to-image;打包器下动态导入不可靠时用 toPng / toSvg 直接传入渲染函数
键盘导航Tab 进入,↑/↓ 在可见节点间移动,→ 展开或进入子节点,← 收起或回到父节点,Enter/Space 选中(showCheckbox 下 Space 切换勾选),Home/End 首尾;OKR 根节点 ← 进入左子树,左树节点镜像。节点带 role=treeitemaria-level/expanded/selected/checked/disabled/setsize/posinset,焦点环用 --okr-focus-color / --okr-focus-width 定制

相关页面

本页目录