树形视图 React 组件
树形视图 React 组件代表 Framework7 的 树形视图 组件。
树形视图组件
包含以下组件
Treeview
- 主树形视图容器TreeviewItem
- 树形视图项
树形视图属性
属性 | 类型 | 默认值 | 描述 |
---|---|---|---|
<TreeviewItem> 属性 | |||
toggle | 布尔值 | 启用树形视图项切换按钮。默认情况下,如果存在子项,则启用 | |
itemToggle | 布尔值 | false | 启用整个树形视图项作为切换 |
selectable | 布尔值 | false | 使项可选择 |
selected | 布尔值 | 使项选中 | |
opened | 布尔值 | false | 定义项默认情况下是否打开 |
label | 字符串 | 项标签文本 | |
loadChildren | 布尔值 | false | 当您需要在打开时加载子项时启用。 |
link | 字符串 布尔值 | 启用链接,如果指定为字符串,则启用链接 URL。与 href 属性相同 | |
<TreeviewItem> 图标相关属性 | |||
iconSize | 字符串 数字 | 图标大小(以像素为单位) | |
iconColor | 字符串 | 图标颜色。一种 默认颜色 | |
icon | 字符串 | 自定义图标类 | |
iconF7 | 字符串 | F7 图标字体图标的名称 | |
iconMaterial | 字符串 | Material 图标字体图标的名称 | |
iconIos | 字符串 | 如果使用 iOS 主题,则要使用的图标。由冒号分隔的图标族和图标名称组成,例如 f7:house | |
iconMd | 字符串 | 如果使用 MD 主题,则要使用的图标。由冒号分隔的图标族和图标名称组成,例如 material:home | |
<TreeviewItem> 导航/路由相关属性 | |||
href | 字符串 布尔值 | # | 要加载的页面的 URL。如果为布尔值 href="false" ,则不会添加 href 标签 |
target | 字符串 | 链接目标属性的值,例如 _blank 、_self 等。 | |
view | 字符串 | 要加载页面的 View 的 CSS 选择器。或者 current ,在当前视图中加载。 | |
external | 布尔值 | 启用以绕过 Framework7 的链接点击处理程序 | |
back | 布尔值 | 启用返回导航链接 | |
openIn | 字符串 | 允许以模态或面板形式打开页面路由。可以是 popup 、loginScreen 、sheet 、popover 或 panel | |
force | 布尔值 | 强制加载页面并忽略历史记录中的前一个页面(与 back 属性一起使用) | |
reloadCurrent | 布尔值 | 重新加载新页面,而不是当前活动页面 | |
reloadPrevious | 布尔值 | 用路由中的新页面替换历史记录中的前一个页面 | |
reloadAll | 布尔值 | 加载新页面,并从历史记录和 DOM 中删除所有前一个页面 | |
reloadDetail | 布尔值 | 重新加载主从视图中的详细信息页面 | |
animate | 布尔值 | 禁用页面动画 | |
transition | 字符串 | 的名称 自定义页面过渡 | |
ignoreCache | 布尔值 | 忽略缓存 | |
routeTabId | 字符串 | 可路由标签 ID | |
routeProps | 对象 | 包含将传递给目标路由组件的附加属性的对象 | |
preventRouter | 布尔值 | false | 如果设置,则不会由 Framework7 路由器处理 |
<TreeviewItem> 操作相关属性 | |||
panelOpen | 字符串 布尔值 | 要单击时打开的面板的 CSS 选择器。或者,如果 DOM 中只有一个左侧或右侧面板,则可以是 left 或 right 。 | |
panelClose | 字符串 布尔值 | 单击时关闭面板 | |
panelToggle | 字符串 布尔值 | 要单击时切换的面板的 CSS 选择器。或者,如果 DOM 中只有一个左侧或右侧面板,则可以是 left 或 right 。 | |
actionsOpen | 字符串 布尔值 | 要单击时打开的操作表的 CSS 选择器 | |
actionsClose | 字符串 布尔值 | 要单击时关闭的操作表的 CSS 选择器。或者,布尔属性,以关闭当前打开的操作表 | |
popupOpen | 字符串 布尔值 | 要单击时打开的弹出窗口的 CSS 选择器 | |
popupClose | 字符串 布尔值 | 要单击时关闭的弹出窗口的 CSS 选择器。或者,布尔属性,以关闭当前打开的弹出窗口 | |
popoverOpen | 字符串 布尔值 | 要单击时打开的弹出框的 CSS 选择器 | |
popoverClose | 字符串 布尔值 | 要单击时关闭的弹出框的 CSS 选择器。或者,布尔属性,以关闭当前打开的弹出框 | |
sheetOpen | 字符串 布尔值 | 要单击时打开的模态表的 CSS 选择器 | |
sheetClose | 字符串 布尔值 | 要单击时关闭的模态表的 CSS 选择器。或者,布尔属性,以关闭当前打开的模态表 | |
loginScreenOpen | 字符串 布尔值 | 要单击时打开的登录屏幕的 CSS 选择器 | |
loginScreenClose | 字符串 布尔值 | 要单击时关闭的登录屏幕的 CSS 选择器。或者,布尔属性,以关闭当前打开的登录屏幕 | |
sortableEnable | 字符串 布尔值 | 要单击时启用的可排序列表的 CSS 选择器 | |
sortableDisable | 字符串 布尔值 | 要单击时禁用的可排序列表的 CSS 选择器。或者,布尔属性,以关闭当前打开的可排序列表 | |
sortableToggle | 字符串 布尔值 | 要单击时切换的可排序列表的 CSS 选择器。或者,布尔属性,以切换当前打开/关闭的可排序列表 | |
searchbarEnable | 字符串 布尔值 | 要单击时启用的可扩展搜索栏的 CSS 选择器。或者,布尔属性,以启用第一个找到的搜索栏 | |
searchbarDisable | 字符串 布尔值 | 要单击时禁用的可扩展搜索栏的 CSS 选择器。或者,布尔属性,以禁用第一个找到的搜索栏 | |
searchbarToggle | 字符串 布尔值 | 要单击时切换的可扩展搜索栏的 CSS 选择器。或者,布尔属性,以切换第一个找到的搜索栏 | |
searchbarClear | 字符串 布尔值 | 要单击时清除的可扩展搜索栏的 CSS 选择器。或者,布尔属性,以清除第一个找到的搜索栏 | |
cardOpen | 字符串 布尔值 | 要单击时打开的可扩展卡片的 CSS 选择器。或者,布尔值,以打开第一个找到的可扩展卡片 | |
cardClose | 字符串 布尔值 | 要单击时关闭的可扩展卡片的 CSS 选择器。或者,布尔属性,以关闭当前打开的可扩展卡片 | |
cardPreventOpen | 布尔值 | 单击具有此属性的元素不会打开其父可扩展卡片 |
树形视图事件
事件 | 描述 |
---|---|
<TreeviewItem> 事件 | |
click | 当用户单击树形视图项时,将触发该事件 |
treeviewOpen | 项打开时会触发该事件 |
treeviewClose | 项关闭时会触发该事件 |
treeviewLoadChildren | 具有 loadChildren 属性的树形视图项首次打开时会触发该事件。在 event.detail 中,它包含一个用于隐藏加载加载器的函数。 |
树形视图项插槽
树形视图 React 组件 (<TreeviewItem>
) 具有用于自定义元素的额外插槽
root-start
- 元素将插入到树形视图项元素的开头root
/root-end
- 元素将插入到树形视图项元素的结尾content-start
- 元素将插入到<div class="treeview-item-content">
元素的开头content
/content-end
- 元素将插入到<div class="treeview-item-content">
元素的结尾children-start
- 元素将插入到<div class="treeview-item-children">
元素的开头default
- 元素将插入到<div class="treeview-item-children">
元素的结尾media
- 元素将插入到<div class="treeview-item-label">
元素之前label-start
- 元素将插入到<div class="treeview-item-label">
元素的开头label
- 元素将插入到<div class="treeview-item-label">
元素的结尾
<TreeviewItem label="Item 1">
<img src="path-to-my-image.jpg" slot="media">
<div slot="root-start">Root Start</div>
<div slot="root">Root End</div>
<div slot="content-start">Content Start</div>
<div slot="content">Content End</div>
<span slot="label-start">Before Label</span>
<TreeviewItem label="Sub Item 1" />
...
</TreeviewItem>
<!-- Renders to: -->
<div class="treeview-item">
<div class="treeview-item-root">
<div>Root Start</div>
<div class="treeview-toggle"></div>
<div class="treeview-item-content">
<div>Content Start</div>
<img src="path-to-my-image.jpg">
<div class="treeview-item-label">
<span>Before Label</span>
Item 1
</div>
<div>Content End</div>
</div>
</div>
<div class="treeview-item-children">
<div class="treeview-item">
<div class="treeview-item-root">
<div class="treeview-item-content">
<div class="treeview-item-label">Sub Item 1</div>
</div>
</div>
</div>
...
</div>
<div>Root End</div>
</div>
示例
treeview.jsx
import React, { useState } from 'react';
import {
Page,
Navbar,
BlockTitle,
Block,
Treeview,
TreeviewItem,
Checkbox,
f7,
} from 'framework7-react';
export default () => {
const [state, setState] = useState({
checkboxes: {
images: {
'avatar.png': false,
'background.jpg': false,
},
documents: {
'cv.docx': false,
'info.docx': false,
},
'.gitignore': false,
'index.html': false,
},
selectedItem: null,
loadedChildren: [],
});
const toggleSelectable = (e, item) => {
if (f7.$(e.target).is('.treeview-toggle')) return;
state.selectedItem = item;
setState({ ...state });
};
const loadChildren = (done) => {
setTimeout(() => {
// call done() to hide preloader
done();
state.loadedChildren = [
{
name: 'John Doe',
},
{
name: 'Jane Doe',
},
{
name: 'Calvin Johnson',
},
];
setState({ ...state });
}, 2000);
};
return (
<Page>
<Navbar title="Treeview" />
<BlockTitle>Basic tree view</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem label="Item 1">
<TreeviewItem label="Sub Item 1">
<TreeviewItem label="Sub Sub Item 1" />
<TreeviewItem label="Sub Sub Item 2" />
</TreeviewItem>
<TreeviewItem label="Sub Item 2">
<TreeviewItem label="Sub Sub Item 1" />
<TreeviewItem label="Sub Sub Item 2" />
</TreeviewItem>
</TreeviewItem>
<TreeviewItem label="Item 2">
<TreeviewItem label="Sub Item 1">
<TreeviewItem label="Sub Sub Item 1" />
<TreeviewItem label="Sub Sub Item 2" />
</TreeviewItem>
<TreeviewItem label="Sub Item 2">
<TreeviewItem label="Sub Sub Item 1" />
<TreeviewItem label="Sub Sub Item 2" />
</TreeviewItem>
</TreeviewItem>
<TreeviewItem label="Item 3" />
</Treeview>
</Block>
<BlockTitle>With icons</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem label="images" iconF7="folder_fill">
<TreeviewItem label="avatar.png" iconF7="photo_fill" />
<TreeviewItem label="background.jpg" iconF7="photo_fill" />
</TreeviewItem>
<TreeviewItem label="documents" iconF7="folder_fill">
<TreeviewItem label="cv.docx" iconF7="doc_text_fill" />
<TreeviewItem label="info.docx" iconF7="doc_text_fill" />
</TreeviewItem>
<TreeviewItem label=".gitignore" iconF7="logo_github" />
<TreeviewItem label="index.html" iconF7="doc_text_fill" />
</Treeview>
</Block>
<BlockTitle>With checkboxes</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem label="images" iconF7="folder_fill">
<Checkbox
slot="content-start"
checked={Object.values(state.checkboxes.images).indexOf(false) < 0}
indeterminate={
Object.values(state.checkboxes.images).indexOf(false) >= 0 &&
Object.values(state.checkboxes.images).indexOf(true) >= 0
}
onChange={(e) => {
Object.keys(state.checkboxes.images).forEach((k) => {
state.checkboxes.images[k] = e.target.checked;
});
setState({ ...state });
}}
/>
<TreeviewItem label="avatar.png" iconF7="photo_fill">
<Checkbox
slot="content-start"
checked={state.checkboxes.images['avatar.png']}
onChange={(e) => {
state.checkboxes.images['avatar.png'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
<TreeviewItem label="background.jpg" iconF7="photo_fill">
<Checkbox
slot="content-start"
checked={state.checkboxes.images['background.jpg']}
onChange={(e) => {
state.checkboxes.images['background.jpg'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
</TreeviewItem>
<TreeviewItem label="documents" iconF7="folder_fill">
<Checkbox
slot="content-start"
checked={Object.values(state.checkboxes.documents).indexOf(false) < 0}
indeterminate={
Object.values(state.checkboxes.documents).indexOf(false) >= 0 &&
Object.values(state.checkboxes.documents).indexOf(true) >= 0
}
onChange={(e) => {
Object.keys(state.checkboxes.documents).forEach((k) => {
state.checkboxes.documents[k] = e.target.checked;
});
setState({ ...state });
}}
/>
<TreeviewItem label="cv.docx" iconF7="doc_text_fill">
<Checkbox
slot="content-start"
checked={state.checkboxes.documents['cv.docx']}
onChange={(e) => {
state.checkboxes.documents['cv.docx'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
<TreeviewItem label="info.docx" iconF7="doc_text_fill">
<Checkbox
slot="content-start"
checked={state.checkboxes.documents['info.docx']}
onChange={(e) => {
state.checkboxes.documents['info.docx'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
</TreeviewItem>
<TreeviewItem label=".gitignore" iconF7="logo_github">
<Checkbox
slot="content-start"
checked={state.checkboxes['.gitignore']}
onChange={(e) => {
state.checkboxes['.gitignore'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
<TreeviewItem label="index.html" iconF7="doc_text_fill">
<Checkbox
slot="content-start"
checked={state.checkboxes['index.html']}
onChange={(e) => {
state.checkboxes['index.html'] = e.target.checked;
setState({ ...state });
}}
/>
</TreeviewItem>
</Treeview>
</Block>
<BlockTitle>Whole item as toggle</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem itemToggle label="images" iconF7="folder_fill">
<TreeviewItem label="avatar.png" iconF7="photo_fill" />
<TreeviewItem label="background.jpg" iconF7="photo_fill" />
</TreeviewItem>
<TreeviewItem itemToggle label="documents" iconF7="folder_fill">
<TreeviewItem label="cv.docx" iconF7="doc_text_fill" />
<TreeviewItem label="info.docx" iconF7="doc_text_fill" />
</TreeviewItem>
<TreeviewItem label=".gitignore" iconF7="logo_github" />
<TreeviewItem label="index.html" iconF7="doc_text_fill" />
</Treeview>
</Block>
<BlockTitle>Selectable</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem
selectable
selected={state.selectedItem === 'images'}
label="images"
iconF7="folder_fill"
onClick={(e) => toggleSelectable(e, 'images')}
>
<TreeviewItem
selectable
selected={state.selectedItem === 'avatar.png'}
label="avatar.png"
iconF7="photo_fill"
onClick={(e) => toggleSelectable(e, 'avatar.png')}
/>
<TreeviewItem
selectable
selected={state.selectedItem === 'background.jpg'}
label="background.jpg"
iconF7="photo_fill"
onClick={(e) => toggleSelectable(e, 'background.jpg')}
/>
</TreeviewItem>
<TreeviewItem
selectable
selected={state.selectedItem === 'documents'}
label="documents"
iconF7="folder_fill"
onClick={(e) => toggleSelectable(e, 'documents')}
>
<TreeviewItem
selectable
selected={state.selectedItem === 'cv.docx'}
label="cv.docx"
iconF7="doc_text_fill"
onClick={(e) => toggleSelectable(e, 'cv.docx')}
/>
<TreeviewItem
selectable
selected={state.selectedItem === 'info.docx'}
label="info.docx"
iconF7="doc_text_fill"
onClick={(e) => toggleSelectable(e, 'info.docx')}
/>
</TreeviewItem>
<TreeviewItem
selectable
selected={state.selectedItem === '.gitignore'}
label=".gitignore"
iconF7="logo_github"
onClick={(e) => toggleSelectable(e, '.gitignore')}
/>
<TreeviewItem
selectable
selected={state.selectedItem === 'index.html'}
label="index.html"
iconF7="doc_text_fill"
onClick={(e) => toggleSelectable(e, 'index.html')}
/>
</Treeview>
</Block>
<BlockTitle>Preload children</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem
toggle
loadChildren
iconF7="person_2_fill"
label="Users"
onTreeviewLoadChildren={(e, done) => loadChildren(done)}
>
{state.loadedChildren.map((item, index) => (
<TreeviewItem key={index} iconF7="person_fill" label={item.name} />
))}
</TreeviewItem>
</Treeview>
</Block>
<BlockTitle>With links</BlockTitle>
<Block strong outlineIos className="no-padding-horizontal">
<Treeview>
<TreeviewItem iconF7="square_grid_2x2_fill" itemToggle label="Modals">
<TreeviewItem link="/popup/" iconF7="link" label="Popup" />
<TreeviewItem link="/dialog/" iconF7="link" label="Dialog" />
<TreeviewItem link="/action-sheet/" iconF7="link" label="Action Sheet" />
</TreeviewItem>
<TreeviewItem iconF7="square_grid_2x2_fill" itemToggle label="Navigation Bars">
<TreeviewItem link="/navbar/" iconF7="link" label="Navbar" />
<TreeviewItem link="/toolbar-tabbar/" iconF7="link" label="Toolbar & Tabbar" />
</TreeviewItem>
</Treeview>
</Block>
</Page>
);
};