树用于显示分层数据。
import { Tree } from 'primereact/tree';
树需要一个 TreeNode 实例集合作为 value。
<Tree value={nodes} className="w-full md:w-30rem" />
节点的展开状态通过 expandedKeys 和 onToggle 属性以编程方式管理。
<div className="flex flex-wrap gap-2 mb-4">
<Button type="button" icon="pi pi-plus" label="Expand All" onClick={expandAll} />
<Button type="button" icon="pi pi-minus" label="Collapse All" onClick={collapseAll} />
</div>
<Tree value={nodes} expandedKeys={expandedKeys} onToggle={(e) => setExpandedKeys(e.value)} className="w-full md:w-30rem" />
通过将 selectionMode 设置为 single 以及 selectionKeys 和 onSelectionChange 属性来管理选择值绑定,从而配置单个节点选择。
<Tree value={nodes} selectionMode="single" selectionKeys={selectedKey}
onSelectionChange={(e) => setSelectedKey(e.value)} className="w-full md:w-30rem" />
通过将 selectionMode 设置为 multiple,可以选择多个节点。默认情况下,在多选模式下,需要按住 metaKey(例如⌘)才能添加到现有选择中,但是可以通过禁用 metaKeySelection 属性来配置此行为。请注意,在启用触摸的设备中,树始终忽略 metaKey。
在多选模式下,值绑定应为键值对,其中键是节点键,值是一个布尔值,指示是否选择。
{
'0-0': true,
'0-1-0': true
}
<div className="flex align-items-center mb-4 gap-2">
<InputSwitch inputId="input-metakey" checked={metaKey} onChange={(e) => setMetaKey(e.value)} />
<label htmlFor="input-metakey">MetaKey</label>
</div>
<Tree value={nodes} metaKeySelection={metaKey} selectionMode="multiple" selectionKeys={selectedKeys}
onSelectionChange={(e) => setSelectedKeys(e.value)} className="w-full md:w-30rem" />
通过将 selectionMode 配置为 checkbox,可以启用通过复选框选择多个节点。
在复选框选择模式下,值绑定应为键值对,其中键是节点键,值是一个具有 checked 和 partialChecked 属性的对象,用于表示节点的选中状态。
{
'0-0': {
partialChecked: false,
checked: true
}
}
<Tree value={nodes} selectionMode="checkbox" selectionKeys={selectedKeys}
onSelectionChange={(e) => setSelectedKeys(e.value)} className="w-full md:w-30rem" />
为每种用户交互类型(例如展开、折叠和选择)提供一个事件。
<Toast ref={toast} />
<Tree value={nodes} selectionMode="single" selectionKeys={selectedNodeKey} onSelectionChange={(e) => setSelectedNodeKey(e.value)}
onExpand={onExpand} onCollapse={onCollapse} onSelect={onSelect} onUnselect={onUnselect} className="w-full md:w-30rem" />
在处理大型数据集时,懒加载非常有用,在此示例中,使用 onExpand 事件按需动态加载节点。
<Tree value={nodes} onExpand={loadOnExpand} loading={loading} className="w-full md:w-30rem" />
使用 nodeTemplate 属性定义自定义节点内容,而不是节点标签。可以使用 togglerTemplate 属性自定义切换器。
<Tree value={nodes} nodeTemplate={nodeTemplate} togglerTemplate={togglerTemplate} className="w-full md:w-30rem" />
可以使用 dragdropScope 和 onDragDrop 属性通过拖放重新排序节点。 dragdropScope 定义组件的唯一范围,以便其他拖动事件不会干扰组件,而 onDragDrop 是一个回调,用于在放置后更新新状态。
<Tree value={nodes} dragdropScope="demo" onDragDrop={(e) => setNodes(e.value)} className="w-full md:w-30rem" />
树使用 contextMenuSelectionKey、onContextMenuSelectionChange 和 onContextMenu 属性与 上下文菜单 进行独占集成。
<Toast ref={toast} />
<ContextMenu model={menu} ref={cm} />
<Tree value={nodes} expandedKeys={expandedKeys} onToggle={(e) => setExpandedKeys(e.value)}
contextMenuSelectionKey={selectedNodeKey} onContextMenuSelectionChange={(e) => setSelectedNodeKey(e.value)}
onContextMenu={(e) => cm.current.show(e.originalEvent)} className="w-full md:w-30rem" />
通过添加 filter 属性启用过滤,默认情况下,节点的 label 属性用于与文本字段中的值进行比较,为了自定义搜索期间应使用哪些字段,请定义 filterBy 属性。此外,filterMode 指定过滤策略。在 lenient 模式下,当查询与节点匹配时,不会进一步搜索该节点的子节点,因为包含该节点的所有后代。另一方面,在 strict 模式下,当查询与节点匹配时,过滤将继续对所有后代进行。
<Tree value={nodes} filter filterMode="lenient" filterPlaceholder="Lenient Filter" className="w-full md:w-30rem" />
<Tree value={nodes} filter filterMode="strict" filterPlaceholder="Strict Filter" className="w-full md:w-30rem" />
描述组件的值可以使用 aria-labelledby 或 aria-label 属性提供。根列表元素具有 tree 角色,而每个列表项都具有 treeitem 角色以及 aria-label、aria-selected 和 aria-expanded 属性。在复选框选择中,使用 aria-checked 代替 aria-selected。树节点的容器元素具有 group 角色。复选框和切换图标对屏幕阅读器隐藏,因为使用带有 treeitem 角色和属性的父元素来支持阅读器和键盘。 aria-setsize、aria-posinset 和 aria-level 属性是隐式计算的,并添加到每个 treeitem。
按键 | 功能 |
---|---|
tab | 当焦点进入组件时,将焦点移动到第一个选定的节点,如果没有选定的节点,则第一个元素将获得焦点。如果焦点已经在组件内部,则将焦点移动到页面标签序列中的下一个可聚焦元素。 |
shift + tab | 当焦点进入组件时,将焦点移动到最后一个选定的节点,如果没有选定的节点,则第一个元素将获得焦点。如果焦点已经在组件内部,则将焦点移动到页面标签序列中的上一个可聚焦元素。 |
enter | 选择焦点所在的树节点。 |
space | 选择焦点所在的树节点。 |
向下箭头 | 将焦点移动到下一个树节点。 |
向上箭头 | 将焦点移动到上一个树节点。 |
向右箭头 | 如果节点已关闭,则打开该节点,否则将焦点移动到第一个子节点。 |
向左箭头 | 如果节点已打开,则关闭该节点,否则将焦点移动到父节点。 |