Skip to content

Commit ff0405f

Browse files
author
潕量
committed
feat(Select): add item from dataSource to onChange(v,e, item)
1 parent 552f267 commit ff0405f

File tree

5 files changed

+46
-12
lines changed

5 files changed

+46
-12
lines changed

docs/select/index.en-us.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ This is because the layer's animation of the overlay is implemented by `classNam
6464
|Size | selector size<br><br>**optional values**:<br>'small', 'medium', 'large' | Enum | 'medium' |
6565
| value | Current value for controlled mode | any | - |
6666
| defaultValue | initial default | any | - |
67-
| onChange | Callback that fires when Select changes <br><br> **Signature**:<br>Function(value: mixed, actionType: String) => void<br>**Parameters**:<br> _value_: {mixed} Selected value <br>_actionType_: {String} Triggered, 'itemClick', 'enter', 'tag' | Function | func.noop |
67+
| onChange | Callback that fires when Select changes <br><br> **Signature**:<br>Function(value: mixed, actionType: String) => void<br>**Parameters**:<br> _value_: {mixed} Selected value <br>_actionType_: {String} Triggered, 'itemClick', 'enter', 'tag' <br> _item_: {mixed} value in dataSource(only useDetailValue=false) | Function | func.noop |
6868
| placeholder | placeholder when there is no value | ReactNode | - |
6969
| autoWidth | Drop-down menu to align with selector | Boolean | true |
7070
| label | custom inline label | ReactNode | - |

src/select/auto-complete.jsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class AutoComplete extends Base {
2626
* Select发生改变时触发的回调
2727
* @param {*} value 选中的值
2828
* @param {String} actionType 触发的方式, 'itemClick', 'enter', 'change'
29+
* @param {*} item 选中的值的对象数据
2930
*/
3031
onChange: PropTypes.func,
3132
/**
@@ -145,10 +146,10 @@ class AutoComplete extends Base {
145146
this.setVisible(false, triggerType);
146147
}
147148

148-
this.handleChange(value, triggerType);
149+
this.handleChange(value, triggerType, item);
149150
}
150151

151-
handleChange = (value, proxy) => {
152+
handleChange = (value, proxy, item) => {
152153
const { disabled, readOnly, filterLocal } = this.props;
153154

154155
if (disabled || readOnly) {
@@ -175,7 +176,7 @@ class AutoComplete extends Base {
175176
});
176177
}
177178

178-
this.props.onChange(value, actionType);
179+
this.props.onChange(value, actionType, item);
179180

180181
if (actionType === 'itemClick' || actionType === 'enter') {
181182
// 点击 item 的时候不会触发关闭,需要手动关闭,其它类型比如 keyDown 等都会有其它事件句柄处理

src/select/base.jsx

-6
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ export default class Base extends React.Component {
2828
value: PropTypes.any, // to be override
2929
// 初始化的默认值
3030
defaultValue: PropTypes.any, // to be override
31-
/**
32-
* Select发生改变时触发的回调
33-
* @param {*} value 选中的值
34-
* @param {String} actionType 触发的方式, 'itemClick', 'enter', 'tag'
35-
*/
36-
onChange: PropTypes.func,
3731
/**
3832
* 没有值的时候的占位符
3933
*/

src/select/select.jsx

+9-2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ class Select extends Base {
3737
* 初始的默认值
3838
*/
3939
defaultValue: PropTypes.any,
40+
/**
41+
* Select发生改变时触发的回调
42+
* @param {*} value 选中的值
43+
* @param {String} actionType 触发的方式, 'itemClick', 'enter', 'tag'
44+
* @param {*} item 选中的值的对象数据 (useDetailValue=false有效)
45+
*/
46+
onChange: PropTypes.func,
4047
/**
4148
* 传入的数据源,可以动态渲染子项,详见 [dataSource的使用](#dataSource的使用)
4249
*/
@@ -296,7 +303,7 @@ class Select extends Base {
296303
if (this.useDetailValue()) {
297304
return this.handleChange(itemObj.valueDS, triggerType);
298305
} else {
299-
this.handleChange(itemObj.value, triggerType);
306+
this.handleChange(itemObj.value, triggerType, itemObj.valueDS);
300307
}
301308

302309
this.setState({
@@ -329,7 +336,7 @@ class Select extends Base {
329336
if (this.useDetailValue()) {
330337
this.handleChange(itemObj.valueDS, triggerType);
331338
} else {
332-
this.handleChange(itemObj.value, triggerType);
339+
this.handleChange(itemObj.value, triggerType, itemObj.valueDS);
333340
}
334341

335342
// 清空搜索

test/select/index-spec.js

+32
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,38 @@ describe('Select', () => {
305305
wrapper.find('i.next-icon-delete-filling').simulate('click');
306306
});
307307

308+
it('should support onChange with mode=single ', (done) => {
309+
const dataSource = [{ label: 'xxx', value: '0' }, { label: 'empty', value: 1 }];
310+
wrapper.setProps({
311+
dataSource,
312+
visible: true,
313+
onChange:(v, e, item) => {
314+
assert(v === 1)
315+
assert(item.value === 1)
316+
done();
317+
}
318+
});
319+
320+
ReactTestUtils.Simulate.click(document.querySelectorAll('.next-menu-item')[1]);
321+
});
322+
323+
it('should support onChange with mode=multiple ', (done) => {
324+
const dataSource = [{ label: 'xxx', value: '0' }, { label: 'empty', value: 1 }];
325+
wrapper.setProps({
326+
dataSource,
327+
mode:'multiple',
328+
visible: true,
329+
onChange:(v, e, item) => {
330+
assert(v.length === 1)
331+
assert(item.length === 1);
332+
done();
333+
}
334+
});
335+
336+
ReactTestUtils.Simulate.click(document.querySelectorAll('.next-menu-item')[1]);
337+
338+
});
339+
308340
it('should support useDetailValue onChange with mode=single ', (done) => {
309341
const dataSource = [{ label: 'xxx', value: '0' }, { label: 'empty', value: false }];
310342
wrapper.setProps({

0 commit comments

Comments
 (0)