React Visual - 树视图组件 (advanced)

本贴最后更新于 1987 天前,其中的信息可能已经斗转星移

2019-10-21

描述

使用 JSON 或数组渲染一个内容可折叠的树视图。

  • 使用对象解构为特定的属性设置默认值
  • 使用 toggled 值来确定内容的初始化状态(展开/收拢)
  • 使用 React.setState() hook 创建 isToggled 状态变量,设置初始值为 toggled 属性
  • 返回一个 <div> 元素,他包裹着内容组件和用于切换组件 isToggled 状态的 <span> 元素
  • 基于 isParentToggledisTogglednameArray.isArray()data 的判断结果来设定组件的展现
  • 循环 data 中的每一个节点,如果为对象或数组就使用递归将其渲染为一个子树
  • 否则的话,使用适当的样式将其渲染为一个 <p> 元素

实现

.tree-element { margin: 0; position: relative; } div.tree-element:before { content: ''; position: absolute; top: 24px; left: 1px; height: calc(100% - 48px); border-left: 1px solid gray; } .toggler { position: absolute; top: 10px; left: 0px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 5px solid gray; cursor: pointer; } .toggler.closed { transform: rotate(90deg); } .collapsed { display: none; }
function TreeView({ data, toggled = true, name = null, isLast = true, isChildElement = false, isParentToggled = true }) { const [isToggled, setIsToggled] = React.useState(toggled); return ( <div style={{ marginLeft: isChildElement ? 16 : 4 + 'px' }} className={isParentToggled ? 'tree-element' : 'tree-element collapsed'} > <span className={isToggled ? 'toggler' : 'toggler closed'} onClick={() => setIsToggled(!isToggled)} /> {name ? <strong>&nbsp;&nbsp;{name}: </strong> : <span>&nbsp;&nbsp;</span>} {Array.isArray(data) ? '[' : '{'} {!isToggled && '...'} {Object.keys(data).map((v, i, a) => typeof data[v] == 'object' ? ( <TreeView data={data[v]} isLast={i === a.length - 1} name={Array.isArray(data) ? null : v} isChildElement isParentToggled={isParentToggled && isToggled} /> ) : ( <p style={{ marginLeft: 16 + 'px' }} className={isToggled ? 'tree-element' : 'tree-element collapsed'} > {Array.isArray(data) ? '' : <strong>{v}: </strong>} {data[v]} {i === a.length - 1 ? '' : ','} </p> ) )} {Array.isArray(data) ? ']' : '}'} {!isLast ? ',' : ''} </div> ); }

使用

let data = { lorem: { ipsum: 'dolor sit', amet: { consectetur: 'adipiscing', elit: [ 'duis', 'vitae', { semper: 'orci' }, { est: 'sed ornare' }, 'etiam', ['laoreet', 'tincidunt'], ['vestibulum', 'ante'] ] }, ipsum: 'primis' } }; ReactDOM.render(<TreeView data={data} name="data" />, document.getElementById('root'));

返回总目录

每天 30 秒系列之 React

  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 6 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 384 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
Vanessa
我们终此一生,就是要摆脱他人的期待,找到真正的自己。 昆明