|
| 1 | +## CascadePicker组件 |
| 2 | + |
| 3 | +`CascadePicker`组件是级联选择器,用于实现多列选择之间的级联变化。比如,在选择省市区时,当省切换到了江苏省,城市列应该变成江苏省的各个城市,同理,如果城市切换到苏州市,区列的选项也应变成苏州市的各个区,这就级联的意义。 |
| 4 | + |
| 5 | +### 示例 |
| 6 | + |
| 7 | +- 基本用法 |
| 8 | + |
| 9 | + 相比普通选择器,级联选择器需要传入的数据结构是不一样的。普通选择器的数据结构是一个二维数组,每一列对应一个固定的数组,而级联选择器,则需要传入的是一个树形结构,第一列的数组,的每个选项的children属性,对应着切换到该选项时后续列的数据,从而实现对后续列的改变。如下所示 |
| 10 | + |
| 11 | + ```html |
| 12 | + <cube-button @click="showCascadePicker">Cascade Picker</cube-button> |
| 13 | + ``` |
| 14 | + ```js |
| 15 | + const cascadeData = [ |
| 16 | + { |
| 17 | + value: 'Fruit', |
| 18 | + text: 'Fruit', |
| 19 | + children: [ |
| 20 | + { |
| 21 | + value: 'Apple', |
| 22 | + text: 'Apple', |
| 23 | + children: [{ value: 1, text: 'One' }, { value: 2, text: 'Two' }] |
| 24 | + }, |
| 25 | + { |
| 26 | + value: 'Orange', |
| 27 | + text: 'Orange', |
| 28 | + children: [{ value: 3, text: 'Three'}, { value: 4, text: 'Four' }] |
| 29 | + } |
| 30 | + ] |
| 31 | + }, |
| 32 | + { |
| 33 | + value: 'Drink', |
| 34 | + text: 'Drink', |
| 35 | + children: [ |
| 36 | + { |
| 37 | + value: 'Coffee', |
| 38 | + text: 'Coffee', |
| 39 | + children: [{ value: 1, text: 'One' }, { value: 2, text: 'Two' }] |
| 40 | + }, |
| 41 | + { |
| 42 | + value: 'Tea', |
| 43 | + text: 'Tea', |
| 44 | + children: [{ value: 1, text: 'One' }, { value: 3, text: 'Three'}] |
| 45 | + } |
| 46 | + ] |
| 47 | + } |
| 48 | + ] |
| 49 | + export default { |
| 50 | + mounted () { |
| 51 | + this.cascadePicker = this.$createCascadePicker({ |
| 52 | + title: 'Cascade Picker', |
| 53 | + data: cascadeData, |
| 54 | + selectedIndex: [1, 0, 0], |
| 55 | + onSelect: (selectedVal, selectedIndex, selectedText) => { |
| 56 | + console.log('select', selectedVal, selectedIndex, selectedText) |
| 57 | + }, |
| 58 | + onCancel: () => { |
| 59 | + console.log('cancel') |
| 60 | + } |
| 61 | + }) |
| 62 | + }, |
| 63 | + methods: { |
| 64 | + showCascadePicker() { |
| 65 | + this.cascadePicker.show() |
| 66 | + } |
| 67 | + } |
| 68 | + } |
| 69 | + ``` |
| 70 | + 当第一列选中`Fruit`时,第二列的选项是`Apple`、`Orange`。以此类推,当第二列选中`Orange`时,第三列的选项是`Three`、`Four`。 |
| 71 | + |
| 72 | +- 省市区选择器 |
| 73 | + |
| 74 | + 对于省市区选择器,只需要构造出级联选择器的数据结构传入就可以了。 |
| 75 | + |
| 76 | + ```html |
| 77 | + <cube-button @click="showCityPicker">City Picker</cube-button> |
| 78 | + ``` |
| 79 | + ```js |
| 80 | + import { provinceList, cityList, areaList } from 'example/data/area' |
| 81 | + |
| 82 | + const cityData = provinceList |
| 83 | + cityData.forEach(province => { |
| 84 | + province.children = cityList[province.value] |
| 85 | + province.children.forEach(city => { |
| 86 | + city.children = areaList[city.value] |
| 87 | + }) |
| 88 | + }) |
| 89 | + |
| 90 | + export default { |
| 91 | + mounted () { |
| 92 | + this.cityPicker = this.$createCascadePicker({ |
| 93 | + title: 'City Picker', |
| 94 | + data: cityData, |
| 95 | + onSelect: (selectedVal, selectedIndex, selectedText) => { |
| 96 | + console.log('select', selectedVal, selectedIndex, selectedText) |
| 97 | + }, |
| 98 | + onCancel: () => { |
| 99 | + console.log('cancel') |
| 100 | + } |
| 101 | + }) |
| 102 | + }, |
| 103 | + methods: { |
| 104 | + showCityPicker() { |
| 105 | + this.cityPicker.show() |
| 106 | + } |
| 107 | + } |
| 108 | + } |
| 109 | + ``` |
| 110 | + |
| 111 | +- 日期选择器 |
| 112 | + |
| 113 | + 日期选择器的原理也是一样,就是构造出级联选择器的数据结构。而且我们还在示例中提供一个[日期选择器组件](https://github.com/didi/cube-ui/blob/dev/example/components/date-picker.vue),可以传入起始日期和结束日期,帮你生成相应的级联树形数据结构。用法如下: |
| 114 | + |
| 115 | + ```html |
| 116 | + <cube-button @click="showDatePicker">Date Picker</cube-button> |
| 117 | + ``` |
| 118 | + ```js |
| 119 | + import DatePicker from 'example/components/date-picker.vue' |
| 120 | + |
| 121 | + createAPI(Vue, DatePicker, ['select', 'cancel'], false) |
| 122 | + |
| 123 | + export default { |
| 124 | + mounted () { |
| 125 | + this.datePicker = this.$createDatePicker({ |
| 126 | + min: [2008, 8, 8], |
| 127 | + max: [2020, 10, 20], |
| 128 | + onSelect: (selectedVal, selectedIndex, selectedText) => { |
| 129 | + console.log('select', selectedVal, selectedIndex, selectedText) |
| 130 | + }, |
| 131 | + onCancel: () => { |
| 132 | + console.log('cancel') |
| 133 | + } |
| 134 | + }) |
| 135 | + }, |
| 136 | + methods: { |
| 137 | + showDatePicker() { |
| 138 | + this.datePicker.show() |
| 139 | + } |
| 140 | + } |
| 141 | + } |
| 142 | + ``` |
| 143 | + |
| 144 | +- 实例方法 `setData` |
| 145 | + |
| 146 | + `setData`方法,用于重置`CascadePicker`实例的数据和选中的索引。 |
| 147 | + |
| 148 | + ```html |
| 149 | + <cube-button @click="showPicker">SetData Picker</cube-button> |
| 150 | + ``` |
| 151 | + ```js |
| 152 | + export default { |
| 153 | + mounted () { |
| 154 | + this.setDataPicker = this.$createCascadePicker({ |
| 155 | + title: 'Set Data', |
| 156 | + onSelect: (selectedVal, selectedIndex, selectedText) => { |
| 157 | + console.log('select', selectedVal, selectedIndex, selectedText) |
| 158 | + }, |
| 159 | + onCancel: () => { |
| 160 | + console.log('cancel') |
| 161 | + } |
| 162 | + }) |
| 163 | + }, |
| 164 | + methods: { |
| 165 | + showSetDataPicker() { |
| 166 | + // setData when picker is invisible |
| 167 | + this.setDataPicker.setData(cascadeData) |
| 168 | + this.setDataPicker.show() |
| 169 | + setTimeout(() => { |
| 170 | + // setData when picker is visible |
| 171 | + this.setDataPicker.setData(cityData, [1, 1, 0]) |
| 172 | + }, 1000) |
| 173 | + } |
| 174 | + } |
| 175 | + } |
| 176 | + ``` |
| 177 | + |
| 178 | + 值得注意的一点是,虽然不管选择器显示前后,都可以`setData`,但是为了体验,在显示后`setData`,所传入的数据结构,必须与之前的列数相同,也就是说如果之前是三列选择器,显示时`setData`还得是三列。 |
| 179 | + |
| 180 | +### Props 配置 |
| 181 | + |
| 182 | +| 参数 | 说明 | 类型 | 默认值 | 示例 | |
| 183 | +| - | - | - | - | - | |
| 184 | +| title | 标题 | String | '' | - | |
| 185 | +| data | 级联选择器的树形数据,用于初始化选项 | Array | [] | - | |
| 186 | +| selectIndex | 被选中的索引值,拉起选择器后显示这个索引值对应的内容 | Array | [] | [1] | |
| 187 | + |
| 188 | +* `data`子配置项 |
| 189 | + |
| 190 | +| 参数 | 说明 | 类型 | 默认值 | 示例 | |
| 191 | +| - | - | - | - | - | |
| 192 | +| text | 每个选项展示的文案 | String/Number | - | - | |
| 193 | +| value | 每个选项的值 | String/Number/Boolean | - | - | |
| 194 | + |
| 195 | +### 事件 |
| 196 | + |
| 197 | +| 事件名 | 说明 | 参数1 | 参数2 | 参数3 | |
| 198 | +| - | - | - | - | - | |
| 199 | +| select | 点击确认按钮触发此事件 | selectedVal: 当前选中项每一列的值,Array类型 | selectedIndex: 当前选中项每一列的索引,Array类型 | selectedText: 当前选中项每一列的文案,Array类型 | |
| 200 | +| change | 滚轴滚动后触发此事件 | index: 当前滚动列次序,Number类型 | selectedIndex: 当前列选中项的索引,Number类型 | |
| 201 | +| cancel | 点击取消按钮触发此事件 | - | - | |
| 202 | + |
| 203 | +### 实例方法 |
| 204 | + |
| 205 | +| 方法名 | 说明 | 参数1 | 参数2 | |
| 206 | +| - | - | - | - | |
| 207 | +| setData | 重置数据和选中的索引 | 级联树形数据结构,Array类型 | 每列选中的索引,Array类型 | |
0 commit comments