Skip to content

Commit ab88066

Browse files
authored
fix: quotes in key crashed (#656)
* Revert "Revert "fix: quote in key should not cause tabs crash (#655)"" This reverts commit 86ab6e3. * fix: quotes in key crashes
1 parent 69dd40f commit ab88066

File tree

4 files changed

+19
-3
lines changed

4 files changed

+19
-3
lines changed

src/TabNavList/TabNode.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import classNames from 'classnames';
22
import KeyCode from 'rc-util/lib/KeyCode';
33
import * as React from 'react';
44
import type { EditableConfig, Tab } from '../interface';
5+
import { genDataNodeKey } from '../util';
56

67
export interface TabNodeProps {
78
id: string;
@@ -56,7 +57,7 @@ function TabNode({
5657
<div
5758
key={key}
5859
// ref={ref}
59-
data-node-key={key}
60+
data-node-key={genDataNodeKey(key)}
6061
className={classNames(tabPrefix, {
6162
[`${tabPrefix}-with-remove`]: removable,
6263
[`${tabPrefix}-active`]: active,

src/TabNavList/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import type {
2222
TabsLocale,
2323
} from '../interface';
2424
import TabContext from '../TabContext';
25-
import { stringify } from '../util';
25+
import { genDataNodeKey, stringify } from '../util';
2626
import AddButton from './AddButton';
2727
import ExtraContent from './ExtraContent';
2828
import OperationNode from './OperationNode';
@@ -311,7 +311,7 @@ function TabNavList(props: TabNavListProps, ref: React.Ref<HTMLDivElement>) {
311311
setTabSizes(() => {
312312
const newSizes: TabSizeMap = new Map();
313313
tabs.forEach(({ key }) => {
314-
const btnNode = tabListRef.current?.querySelector<HTMLElement>(`[data-node-key="${key}"]`);
314+
const btnNode = tabListRef.current?.querySelector<HTMLElement>(`[data-node-key="${genDataNodeKey(key)}"]`);
315315
if (btnNode) {
316316
newSizes.set(key, {
317317
width: btnNode.offsetWidth,

src/util.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import React from 'react';
2+
13
/**
24
* We trade Map as deps which may change with same value but different ref object.
35
* We should make it as hash for deps
@@ -16,3 +18,8 @@ export function stringify<K extends string | number | symbol, V>(obj: Record<K,
1618

1719
return JSON.stringify(tgt);
1820
}
21+
22+
const RC_TABS_DOUBLE_QUOTE = 'TABS_DQ';
23+
export function genDataNodeKey(key: React.Key): string {
24+
return String(key).replace(/"/g, RC_TABS_DOUBLE_QUOTE);
25+
}

tests/index.test.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,4 +510,12 @@ describe('Tabs.Basic', () => {
510510
const { container } = render(getTabs({ tabBarStyle: { background: 'red' } }));
511511
expect(container.querySelector('.rc-tabs-nav')).toHaveStyle({ background: 'red' });
512512
});
513+
514+
it('key contains double quote should not crash', () => {
515+
render(<Tabs items={[{key: '"key"', label: 'test'}]} />)
516+
});
517+
518+
it('key could be number', () => {
519+
render(<Tabs items={[{key: 1 as any, label: 'test'}]} />)
520+
})
513521
});

0 commit comments

Comments
 (0)