最近使用 rc tabs 组件的时候发现新版本对组件进行了重新设计。v12 之前是将 tabPanel 子组件作为 children prop 传递给 tabs 组件,而 v12 开始则是直接将 items 传递给 tabs。Antd 也同理,采用了传递 items 的方式,并且会在后续新版本中抛弃旧的写法。
于是有个疑问,新的传递 prop 的方式相比以前有什么优点吗?或者以前的方式有什么缺点?
// 以前的写法
const App = () => (
<Tabs defaultActiveKey="1">
<Tabs.TabPane tab="Tab 1" key="1">
Content of Tab Pane 1
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 2" key="2">
Content of Tab Pane 2
</Tabs.TabPane>
<Tabs.TabPane tab="Tab 3" key="3">
Content of Tab Pane 3
</Tabs.TabPane>
</Tabs>
)
// 现在的写法
const App = () => (
<Tabs
items={[
{
label: `Tab 1`,
key: '1',
children: `Content of Tab Pane 1`,
},
{
label: `Tab 2`,
key: '2',
children: `Content of Tab Pane 2`,
},
{
label: `Tab 3`,
key: '3',
children: `Content of Tab Pane 3`,
},
]}
/>
);
主要是性能问题。
rc-tabs
的源码里,老版本需要将children
转成数组,然后再map
,再filter
,并且没有进行缓存优化。换成
items
直接接受数组后, 省去了转化数组和map
的过程,只会filter
。并且使用了useMemo
进行优化。