React Visual - Tab 组件

本贴最后更新于 2017 天前,其中的信息可能已经时移俗易

2019-10-14

描述

渲染一个 Tab 菜单及其视图组件。

  • 定义一个 TabItem 组件,可以传递给 Tab 且只接受 props.children 中通过函数名称认证的 TabItem,其余节点需要进行移除
  • 使用 React.useState() hook 初始化 bindIndex 状态变量的值为 props.defaultIndex
  • 使用 Array.prototype.map 将收集的节点渲染为 tab-menutab-view
  • 当点击 tab-menu 中的 <button> 时,将会执行定义为 changeTab 的函数
  • changeTab 执行传递的回调 onTabClick 并更新 bindIndex,这会导致重新渲染,通过他们的 index 重新计算 tab-view 中每一项的 styleclassName,以及 tab-menu 按钮

实现

.tab-menu > button { cursor: pointer; padding: 8px 16px; border: 0; border-bottom: 2px solid transparent; background: none; } .tab-menu > button.focus { border-bottom: 2px solid #007bef; } .tab-menu > button:hover { border-bottom: 2px solid #007bef; }
function TabItem(props) { return <div {...props} />; } function Tabs(props) { const [bindIndex, setBindIndex] = React.useState(props.defaultIndex); const changeTab = newIndex => { if (typeof props.onTabClick === 'function') props.onTabClick(newIndex); setBindIndex(newIndex); }; const items = props.children.filter(item => item.type.name === 'TabItem'); return ( <div className="wrapper"> <div className="tab-menu"> {items.map(({ props: { index, label } }) => ( <button onClick={() => changeTab(index)} className={bindIndex === index ? 'focus' : ''}> {label} </button> ))} </div> <div className="tab-view"> {items.map(({ props }) => ( <div {...props} className="tab-view_item" key={props.index} style={{ display: bindIndex === props.index ? 'block' : 'none' }} /> ))} </div> </div> ); }

使用

ReactDOM.render( <Tabs defaultIndex="1" onTabClick={console.log}> <TabItem label="A" index="1"> Lorem ipsum </TabItem> <TabItem label="B" index="2"> Dolor sit amet </TabItem> </Tabs>, document.getElementById('root') );

返回总目录

每天 30 秒系列之 React

  • 30Seconds

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

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

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

    192 引用 • 291 回帖 • 381 关注

相关帖子

欢迎来到这里!

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

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