Skip to content

Commit d18b6f0

Browse files
committed
feat(TreeSelect): support preview mode
1 parent 5344693 commit d18b6f0

2 files changed

Lines changed: 83 additions & 0 deletions

File tree

src/tree-select/tree-select.jsx

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import React, {
55
cloneElement,
66
} from 'react';
77
import PropTypes from 'prop-types';
8+
import classNames from 'classnames';
89
import Select from '../select';
910
import Tree from '../tree';
1011
import {
@@ -175,6 +176,15 @@ export default class TreeSelect extends Component {
175176
* 是否跟随滚动
176177
*/
177178
followTrigger: PropTypes.bool,
179+
/**
180+
* 是否为预览态
181+
*/
182+
isPreview: PropTypes.bool,
183+
/**
184+
* 预览态模式下渲染的内容
185+
* @param {number} value 评分值
186+
*/
187+
renderPreview: PropTypes.func,
178188
};
179189

180190
static defaultProps = {
@@ -732,6 +742,33 @@ export default class TreeSelect extends Component {
732742
</div>
733743
);
734744
}
745+
746+
renderPreview(data, others) {
747+
const { prefix, renderPreview } = this.props;
748+
749+
const previewCls = classNames({
750+
[`${prefix}form-preview`]: true,
751+
});
752+
let items = data;
753+
754+
if (data && !Array.isArray(data)) {
755+
items = [data];
756+
}
757+
758+
if (typeof renderPreview === 'function') {
759+
return (
760+
<div {...others} className={previewCls}>
761+
{renderPreview(items, this.props)}
762+
</div>
763+
);
764+
}
765+
766+
return (
767+
<p {...others} className={previewCls}>
768+
{items.map(({ label }) => label).join(', ')}
769+
</p>
770+
);
771+
}
735772
/*eslint-enable*/
736773
render() {
737774
const {
@@ -755,6 +792,7 @@ export default class TreeSelect extends Component {
755792
popupContainer,
756793
popupProps,
757794
followTrigger,
795+
isPreview,
758796
} = this.props;
759797
const others = pickOthers(
760798
Object.keys(TreeSelect.propTypes),
@@ -771,6 +809,10 @@ export default class TreeSelect extends Component {
771809
data = data[0];
772810
}
773811

812+
if (isPreview) {
813+
return this.renderPreview(data, others);
814+
}
815+
774816
return (
775817
<Select
776818
prefix={prefix}

test/tree-select/index-spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,47 @@ describe('TreeSelect', () => {
408408
assert.deepEqual(getLabels(wrapper), []);
409409
});
410410

411+
it('should support preview mode render', () => {
412+
const dataSource = [
413+
{
414+
value: '2973',
415+
label: '陕西',
416+
children: [
417+
{
418+
value: '2974',
419+
label: '西安',
420+
children: [
421+
{
422+
value: '2975',
423+
label: '西安市',
424+
},
425+
{
426+
value: '2976',
427+
label: '高陵县',
428+
},
429+
],
430+
},
431+
{
432+
value: '2980',
433+
label: '铜川',
434+
},
435+
],
436+
},
437+
];
438+
439+
wrapper = mount(<TreeSelect dataSource={dataSource} isPreview defaultValue={'2975'} />);
440+
assert(wrapper.find('.next-form-preview').length > 0);
441+
assert(wrapper.find('.next-form-preview').text() === '西安市');
442+
wrapper.setProps({
443+
renderPreview: (items) => {
444+
assert(items.length === 1);
445+
assert(items[0].label === '西安市');
446+
return 'Hello World';
447+
}
448+
});
449+
assert(wrapper.find('.next-form-preview').text() === 'Hello World');
450+
})
451+
411452
it('should trigger onChange when remove tag', () => {
412453
let triggered = false;
413454
const value = ['6'];

0 commit comments

Comments
 (0)