diff --git a/packages/tree-select/index.js b/packages/tree-select/index.js deleted file mode 100644 index bd6b981bd..000000000 --- a/packages/tree-select/index.js +++ /dev/null @@ -1,100 +0,0 @@ -import { use } from '../utils'; -import Icon from '../icon'; - -const [sfc, bem] = use('tree-select'); - -export default sfc({ - props: { - items: Array, - mainActiveIndex: Number, - activeId: { - type: [Number, String], - default: 0 - }, - height: { - type: Number, - default: 300 - } - }, - - computed: { - subItems() { - const selectedItem = this.items[this.mainActiveIndex] || {}; - return selectedItem.children || []; - } - }, - - methods: { - onClickNav(data, index) { - if (!data.disabled) { - this.$emit('navclick', index); - } - }, - - onItemSelect(data) { - if (!data.disabled) { - this.$emit('itemclick', data); - } - } - }, - - render(h) { - const { - height, - items, - mainActiveIndex, - activeId, - subItems - } = this; - - return ( -
-
- {items.map((item, index) => ( -
{ - this.onClickNav(item, index); - }} - > - { item.text } -
- ))} -
-
- {subItems.map(item => ( -
{ - this.onItemSelect(item); - }} - > - { item.text } - {activeId === item.id && ( - - )} -
- ))} -
-
- ); - } -}); diff --git a/packages/tree-select/index.tsx b/packages/tree-select/index.tsx new file mode 100644 index 000000000..f31cda85c --- /dev/null +++ b/packages/tree-select/index.tsx @@ -0,0 +1,105 @@ +import { use } from '../utils'; +import { emit, inherit } from '../utils/functional'; +import Icon from '../icon'; + +// Types +import { CreateElement, RenderContext } from 'vue/types'; +import { DefaultSlots } from '../utils/use/sfc'; + +export type TreeSelectItem = { + text: string; + disabled?: boolean; + children: TreeSelectChildren[]; +}; + +export type TreeSelectChildren = { + id: number; + text: string; + disabled?: boolean; +}; + +export type TreeSelectProps = { + height: number; + items: TreeSelectItem[]; + activeId: number | string; + mainActiveIndex: number; +}; + +const [sfc, bem] = use('tree-select'); + +function TreeSelect( + h: CreateElement, + props: TreeSelectProps, + slots: DefaultSlots, + ctx: RenderContext +) { + const { height, items, mainActiveIndex, activeId } = props; + + const selectedItem = items[mainActiveIndex] || {}; + const subItems = selectedItem.children || []; + + return ( +
+
+ {items.map((item, index) => ( +
{ + if (!item.disabled) { + emit(ctx, 'navclick', index); + } + }} + > + {item.text} +
+ ))} +
+
+ {subItems.map(item => ( +
{ + if (!item.disabled) { + emit(ctx, 'itemclick', item); + } + }} + > + {item.text} + {activeId === item.id && ( + + )} +
+ ))} +
+
+ ); +} + +TreeSelect.props = { + items: Array, + mainActiveIndex: Number, + activeId: { + type: [Number, String], + default: 0 + }, + height: { + type: Number, + default: 300 + } +}; + +export default sfc(TreeSelect); diff --git a/packages/tree-select/test/index.spec.js b/packages/tree-select/test/index.spec.js index c02620a0d..79f8b9295 100644 --- a/packages/tree-select/test/index.spec.js +++ b/packages/tree-select/test/index.spec.js @@ -6,10 +6,12 @@ test('empty list', () => { }); test('select item', () => { + const onItemClick = jest.fn(); const item = { text: 'city1', id: 1 }; + const wrapper = mount(TreeSelect, { propsData: { items: [{ @@ -19,12 +21,17 @@ test('select item', () => { { ...item, disabled: true } ] }] + }, + context: { + on: { + itemclick: onItemClick + } } }); const items = wrapper.findAll('.van-tree-select__item'); items.at(0).trigger('click'); - expect(wrapper.emitted('itemclick')[0][0]).toEqual(item); + expect(onItemClick.mock.calls[0][0]).toEqual(item); items.at(1).trigger('click'); - expect(wrapper.emitted('itemclick')[1]).toBeFalsy(); + expect(onItemClick.mock.calls[1]).toBeFalsy(); });