Skip to content

Commit bc204b3

Browse files
AmyFoxFNustbhuangyi
authored andcommitted
[feat] cascade-picker: async (#175)
* [feat] cascade-picker: aync * [test]
1 parent 9030191 commit bc204b3

File tree

4 files changed

+143
-19
lines changed

4 files changed

+143
-19
lines changed

example/pages/cascade-picker.vue

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<cube-button @click="showCascadePicker">Cascade Picker</cube-button>
66
<cube-button @click="showCityPicker">City Picker</cube-button>
77
<cube-button @click="showSetDataPicker">Set Data</cube-button>
8+
<cube-button @click="showAsyncPicker">Async Cascade</cube-button>
89
</cube-button-group>
910
</div>
1011
</cube-page>
@@ -16,14 +17,19 @@
1617
import { provinceList, cityList, areaList } from 'example/data/area'
1718
import { cascadeData } from 'example/data/cascade'
1819
19-
const cityData = provinceList
20+
const cityData = provinceList.slice()
2021
cityData.forEach(province => {
2122
province.children = cityList[province.value]
2223
province.children.forEach(city => {
2324
city.children = areaList[city.value]
2425
})
2526
})
2627
28+
const asyncData = provinceList.slice()
29+
const asyncSelectedIndex = [0, 0, 0]
30+
asyncData[0].children = cityList[asyncData[0].value]
31+
asyncData[0].children[0].children = areaList[asyncData[0].children[0].value]
32+
2733
export default {
2834
mounted() {
2935
this.cascadePicker = this.$createCascadePicker({
@@ -51,6 +57,34 @@
5157
onSelect: this.selectHandle,
5258
onCancel: this.cancelHandle
5359
})
60+
61+
this.asyncPicker = this.$createCascadePicker({
62+
title: 'Async Cascade',
63+
async: true,
64+
data: asyncData,
65+
selectedIndex: asyncSelectedIndex.slice(),
66+
onSelect: this.selectHandle,
67+
onCancel: this.cancelHandle,
68+
onChange: (i, newIndex) => {
69+
if (newIndex !== asyncSelectedIndex[i]) {
70+
asyncSelectedIndex.splice(i, 1, newIndex)
71+
if (i < 2) {
72+
setTimeout(() => {
73+
if (i === 0) {
74+
const current = asyncData[newIndex]
75+
current.children = current.children || cityList[current.value]
76+
}
77+
78+
if (i === 1) {
79+
const current = asyncData[asyncSelectedIndex[0]].children[newIndex]
80+
current.children = current.children || areaList[current.value]
81+
}
82+
this.asyncPicker.setData(asyncData, asyncSelectedIndex)
83+
}, 500)
84+
}
85+
}
86+
}
87+
})
5488
},
5589
methods: {
5690
showCascadePicker() {
@@ -69,6 +103,9 @@
69103
this.setDataPicker.setData(cityData, [1, 1, 0])
70104
}, 1000)
71105
},
106+
showAsyncPicker() {
107+
this.asyncPicker.show()
108+
},
72109
selectHandle(selectedVal, selectedIndex, selectedText) {
73110
this.$createDialog({
74111
type: 'warn',

src/components/cascade-picker/cascade-picker.vue

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
<template>
22
<cube-picker
3-
ref="picker"
4-
v-model="isVisible"
5-
:data="pickerData"
6-
:selected-index="pickerSelectedIndex"
7-
:title="title"
8-
:subtitle="subtitle"
9-
:z-index="zIndex"
10-
:cancel-txt="cancelTxt"
11-
:confirm-txt="confirmTxt"
12-
:swipe-time="swipeTime"
13-
@select="_pickerSelect"
14-
@cancel="_pickerCancel"
15-
@change="_pickerChange"></cube-picker>
3+
ref="picker"
4+
v-model="isVisible"
5+
:data="pickerData"
6+
:selected-index="pickerSelectedIndex"
7+
:pending="pending"
8+
:title="title"
9+
:subtitle="subtitle"
10+
:z-index="zIndex"
11+
:cancel-txt="cancelTxt"
12+
:confirm-txt="confirmTxt"
13+
:swipe-time="swipeTime"
14+
@select="_pickerSelect"
15+
@cancel="_pickerCancel"
16+
@change="_pickerChange">
17+
</cube-picker>
1618
</template>
1719

1820
<script type="text/ecmascript-6">
@@ -30,20 +32,28 @@
3032
export default {
3133
name: COMPONENT_NAME,
3234
mixins: [visibilityMixin, popupMixin, basicPickerMixin, pickerMixin],
35+
props: {
36+
async: {
37+
type: Boolean,
38+
default: false
39+
}
40+
},
3341
data () {
3442
return {
3543
cascadeData: this.data.slice(),
3644
pickerSelectedIndex: this.selectedIndex.slice(),
37-
pickerData: []
45+
pickerData: [],
46+
pending: false
3847
}
3948
},
4049
created() {
4150
this._updatePickerData()
4251
},
4352
methods: {
4453
setData(data, selectedIndex = []) {
45-
this.cascadeData = data
46-
this.pickerSelectedIndex = selectedIndex
54+
this.pending = false
55+
this.cascadeData = data.slice()
56+
this.pickerSelectedIndex = selectedIndex.slice()
4757
this._updatePickerData()
4858
},
4959
_pickerSelect(selectedVal, selectedIndex, selectedText) {
@@ -55,7 +65,9 @@
5565
_pickerChange(i, newIndex) {
5666
if (newIndex !== this.pickerSelectedIndex[i]) {
5767
this.pickerSelectedIndex.splice(i, 1, newIndex)
58-
this._updatePickerData(i + 1)
68+
this.async
69+
? (this.pending = i !== this.pickerData.length - 1)
70+
: this._updatePickerData(i + 1)
5971
}
6072
this.$emit(EVENT_CHANGE, i, newIndex)
6173
},

src/components/picker/picker.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@
5858
export default {
5959
name: COMPONENT_NAME,
6060
mixins: [visibilityMixin, popupMixin, basicPickerMixin, pickerMixin],
61+
props: {
62+
pending: {
63+
type: Boolean,
64+
default: false
65+
}
66+
},
6167
data() {
6268
return {
6369
pickerData: this.data.slice(),
@@ -249,7 +255,7 @@
249255
}
250256
},
251257
_canConfirm() {
252-
return this.wheels.every((wheel) => {
258+
return !this.pending && this.wheels.every((wheel) => {
253259
return !wheel.isInTransition
254260
})
255261
}

test/unit/specs/cascade-picker.spec.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,74 @@ describe('CascadePicker', () => {
158158
}, 100)
159159
})
160160

161+
it('should support async cascade', function (done) {
162+
this.timeout(10000)
163+
164+
const data = [
165+
{ value: 1,
166+
text: '1',
167+
children: [{value: 11, text: '11'}]
168+
}, {
169+
value: 2,
170+
text: '2'
171+
}
172+
]
173+
174+
const selectedIndex = [0, 0]
175+
const selectHandle = sinon.spy()
176+
177+
vm = createCascadePicker({
178+
async: true,
179+
data: data,
180+
selectedIndex: selectedIndex.slice()
181+
}, {
182+
select: selectHandle,
183+
change: (i, newIndex) => {
184+
if (newIndex !== selectedIndex[i]) {
185+
selectedIndex.splice(i, 1, newIndex)
186+
if (i < 1) {
187+
expect(selectHandle)
188+
.to.be.callCount(0)
189+
vm.$nextTick(() => {
190+
const confirmBtn = vm.$el.querySelector('.cube-picker-confirm')
191+
confirmBtn.click()
192+
expect(selectHandle)
193+
.to.be.callCount(0)
194+
195+
setTimeout(() => {
196+
data[1].children = [{value: 21, text: '21'}]
197+
vm.setData(data, selectedIndex)
198+
vm.$nextTick(() => {
199+
confirmBtn.click()
200+
expect(selectHandle)
201+
.to.be.callCount(1)
202+
203+
done()
204+
})
205+
}, 500)
206+
})
207+
}
208+
}
209+
}
210+
})
211+
vm.show()
212+
setTimeout(() => {
213+
const wheels = vm.$el.querySelectorAll('.cube-picker-wheel-wrapper > div')
214+
const firstWheelItems = wheels[0].querySelectorAll('li')
215+
216+
dispatchSwipe(firstWheelItems[1], [
217+
{
218+
pageX: firstWheelItems[1].offsetLeft + 10,
219+
pageY: firstWheelItems[1].offsetTop + 10
220+
},
221+
{
222+
pageX: firstWheelItems[1].offsetLeft + 10,
223+
pageY: 60
224+
}
225+
], 100)
226+
}, 150)
227+
})
228+
161229
it('$updateProps', function (done) {
162230
this.timeout(10000)
163231

@@ -190,6 +258,7 @@ describe('CascadePicker', () => {
190258
console.warn = function (...args) {
191259
msgs.push(args.join('#'))
192260
}
261+
193262
vm = app.$createCascadePicker({}, true)
194263
expect(msgs.length)
195264
.to.equal(1)

0 commit comments

Comments
 (0)