Skip to content

Commit ac0f856

Browse files
jerryyxu皆虚
and
皆虚
authored
feat(Tree): support icon prop (#2132)
Co-authored-by: 皆虚 <jiarui.xjr@alibaba-inc.com>
1 parent b70d9e6 commit ac0f856

File tree

7 files changed

+39
-10
lines changed

7 files changed

+39
-10
lines changed

docs/tree/demo/basic.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ the simplest usage: can be expanded, selectable, checkable, editable, can be rig
1515
---
1616

1717
````jsx
18-
import { Tree, Button } from '@alifd/next';
18+
import { Tree, Button, Icon } from '@alifd/next';
1919

2020
const TreeNode = Tree.Node;
2121

@@ -45,13 +45,13 @@ class Demo extends React.Component {
4545
onCheck={this.onCheck}
4646
onEditFinish={this.onEditFinish}
4747
onRightClick={this.onRightClick}>
48-
<TreeNode key="1" label="Component">
49-
<TreeNode key="2" label="Form" selectable={false}>
50-
<TreeNode key="4" label="Input" />
51-
<TreeNode key="5" label="Select" disabled />
48+
<TreeNode key="1" label="Component" icon={<Icon type="smile"/>}>
49+
<TreeNode key="2" label="Form" selectable={false} icon="smile">
50+
<TreeNode key="4" label="Input" icon="smile"/>
51+
<TreeNode key="5" label="Select" disabled icon="cry"/>
5252
</TreeNode>
53-
<TreeNode key="3" label="Display">
54-
<TreeNode key="6" label="Table" />
53+
<TreeNode key="3" label="Display" icon="smile">
54+
<TreeNode key="6" label="Table" icon="smile"/>
5555
</TreeNode>
5656
</TreeNode>
5757
</Tree>

docs/tree/index.en-us.md

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ Folders, organizational structures, taxonomy, countries, regions, etc. Most of t
7070
| disabled | whether node is disabled | Boolean | false |
7171
| checkboxDisabled | whether checkbox of node is disabled | Boolean | false |
7272
| isLeaf | whether it is a leaf node and only works when loadData is set | Boolean | false |
73+
| icon | custom icon, it can be type of Icon or such as `<Icon type="icon type" />` | String/ReactNode | - |
7374

7475
<!-- api-extra-start -->
7576

docs/tree/index.md

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
| disabled | 是否禁止节点响应 | Boolean | false |
7272
| checkboxDisabled | 是否禁止勾选节点复选框 | Boolean | false |
7373
| isLeaf | 是否是叶子节点,设置loadData时生效 | Boolean | - |
74+
| icon | 自定义图标,可以使用 Icon 的 type,也可以使用组件 `<Icon type="icon type" />` | String/ReactNode | - |
7475

7576
<!-- api-extra-start -->
7677

src/tree/main.scss

+9
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@
3333
padding: 0 $tree-node-title-padding;
3434
border-radius: $tree-node-title-border-radius;
3535
font-size: $tree-node-title-font-size;
36+
37+
.#{$css-prefix}icon {
38+
font-size: calc(#{$tree-node-title-font-size} + 2px);
39+
&::before {
40+
font-size: $tree-node-title-font-size;
41+
width: $tree-node-title-font-size;
42+
margin-right: .5em;
43+
}
44+
}
3645
}
3746

3847
&-node-input.#{$css-prefix}input {

src/tree/scss/variable.scss

-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ $tree-child-indent-right: calc(#{$tree-child-indent} - #{$tree-line-width} - (#{
152152
$tree-child-right-angle-left: calc(0px - (#{$tree-child-indent} - (#{$tree-switch-size} - #{$tree-line-width}) / 2 + #{$tree-switch-border-width}));
153153
$tree-child-right-angle-width: calc(#{$tree-child-indent} - (#{$tree-switch-size} - #{$tree-line-width}) / 2);
154154

155-
156155
$tree-line: $tree-line-width $tree-line-style $tree-line-color;
157156

158157

src/tree/view/tree-node.jsx

+11-2
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ class TreeNode extends Component {
7878
posinset: PropTypes.number,
7979
// 是否是最后一个子节点,数组类型,包含对祖先节点的判断
8080
isLastChild: PropTypes.arrayOf(PropTypes.bool),
81+
/**
82+
* 自定义图标,可以使用 Icon 的 type,也可以使用组件 `<Icon type="icon type" />`
83+
*/
84+
icon: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
8185
};
8286

8387
static defaultProps = {
@@ -374,7 +378,7 @@ class TreeNode extends Component {
374378
}
375379

376380
renderLabel() {
377-
const { prefix, root, disabled } = this.props;
381+
const { prefix, root, disabled, icon } = this.props;
378382
const { isNodeBlock } = root.props;
379383
const { label } = this.state;
380384
const selectable = typeof this.props.selectable !== 'undefined' ? this.props.selectable : root.props.selectable;
@@ -389,9 +393,14 @@ class TreeNode extends Component {
389393
this.addCallbacks(labelProps);
390394
}
391395

396+
const iconEl = typeof icon === 'string' ? <Icon type={icon} /> : icon;
397+
392398
return (
393399
<div className={`${prefix}tree-node-label-wrapper`} ref={this.saveLabelWrapperRef}>
394-
<div {...labelProps}>{label}</div>
400+
<div {...labelProps}>
401+
{iconEl}
402+
{label}
403+
</div>
395404
</div>
396405
);
397406
}

test/tree/index-spec.js

+10
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import ReactTestUtils from 'react-dom/test-utils';
66
import { dom, KEYCODE } from '../../src/util';
77
import Tree from '../../src/tree/index';
88
import Button from '../../src/button/index';
9+
import Icon from '../../src/icon/index';
910
import '../../src/tree/style.js';
1011

1112
/* eslint-disable react/jsx-filename-extension, react/no-multi-comp */
@@ -794,6 +795,15 @@ describe('Tree', () => {
794795
assert(hasClass(document.querySelector('.next-tree'), 'next-show-line'));
795796
});
796797

798+
it('should support icon', () => {
799+
dataSource[0].icon = 'cry';
800+
dataSource[0].children[0].icon = <Icon type="smile" />;
801+
802+
ReactDOM.render(<Tree defaultExpandAll dataSource={dataSource} />, mountNode);
803+
804+
assert(document.querySelectorAll('.next-tree-node-label .next-icon').length === 2);
805+
});
806+
797807
it('should support isLabelBlock and isNodeBlock', () => {
798808
ReactDOM.render(<Tree isLabelBlock isNodeBlock dataSource={dataSource} />, mountNode);
799809
assert(hasClass(document.querySelector('.next-tree'), 'next-node-block'));

0 commit comments

Comments
 (0)