cascade-picker.md 6.6 KB
Newer Older
A
AmyFoxFN 已提交
1 2 3 4 5 6 7 8
## CascadePicker组件

`CascadePicker`组件是级联选择器,用于实现多列选择之间的级联变化。比如,在选择省市区时,当省切换到了江苏省,城市列应该变成江苏省的各个城市,同理,如果城市切换到苏州市,区列的选项也应变成苏州市的各个区,这就级联的意义。

### 示例

- 基本用法

A
AmyFoxFN 已提交
9
  相比普通选择器,级联选择器需要传入的数据结构是不一样的。普通选择器的数据结构是一个二维数组,每一列对应一个固定的数组,而级联选择器,则需要传入的是一个树形结构,第一列数组的每个选项的children属性,对应着切换到该选项时后续列的数据,从而实现对后续列的改变。如下所示:
A
AmyFoxFN 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207

  ```html
  <cube-button @click="showCascadePicker">Cascade Picker</cube-button>
  ```
  ```js
  const cascadeData = [
    {
      value: 'Fruit',
      text: 'Fruit',
      children: [
        {
          value: 'Apple',
          text: 'Apple',
          children: [{ value: 1, text: 'One' }, { value: 2, text: 'Two' }]
        },
        {
          value: 'Orange',
          text: 'Orange',
          children: [{ value: 3, text: 'Three'}, { value: 4, text: 'Four' }]
        }
      ]
    },
    {
      value: 'Drink',
      text: 'Drink',
      children: [
        {
          value: 'Coffee',
          text: 'Coffee',
          children: [{ value: 1, text: 'One' }, { value: 2, text: 'Two' }]
        },
        {
          value: 'Tea',
          text: 'Tea',
          children: [{ value: 1, text: 'One' }, { value: 3, text: 'Three'}]
        }
      ]
    }
  ]
  export default {
    mounted () {
      this.cascadePicker = this.$createCascadePicker({
        title: 'Cascade Picker',
        data: cascadeData,
        selectedIndex: [1, 0, 0],
        onSelect: (selectedVal, selectedIndex, selectedText) => {
          console.log('select', selectedVal, selectedIndex, selectedText)
        },
        onCancel: () => {
          console.log('cancel')
        }
      })
    },
    methods: {
      showCascadePicker() {
        this.cascadePicker.show()
      }
    }
  }
  ```
  当第一列选中`Fruit`时,第二列的选项是`Apple``Orange`。以此类推,当第二列选中`Orange`时,第三列的选项是`Three``Four`

- 省市区选择器

  对于省市区选择器,只需要构造出级联选择器的数据结构传入就可以了。
  
  ```html
  <cube-button @click="showCityPicker">City Picker</cube-button>
  ```
  ```js
  import { provinceList, cityList, areaList } from 'example/data/area'
  
  const cityData = provinceList
  cityData.forEach(province => {
    province.children = cityList[province.value]
    province.children.forEach(city => {
      city.children = areaList[city.value]
    })
  })
  
  export default {
    mounted () {
      this.cityPicker = this.$createCascadePicker({
        title: 'City Picker',
        data: cityData,
        onSelect: (selectedVal, selectedIndex, selectedText) => {
          console.log('select', selectedVal, selectedIndex, selectedText)
        },
        onCancel: () => {
          console.log('cancel')
        }
      })
    },
    methods: {
      showCityPicker() {
        this.cityPicker.show()
      }
    }
  }
  ```

- 日期选择器

  日期选择器的原理也是一样,就是构造出级联选择器的数据结构。而且我们还在示例中提供一个[日期选择器组件](https://github.com/didi/cube-ui/blob/dev/example/components/date-picker.vue),可以传入起始日期和结束日期,帮你生成相应的级联树形数据结构。用法如下:

  ```html
  <cube-button @click="showDatePicker">Date Picker</cube-button>
  ```
  ```js
  import DatePicker from 'example/components/date-picker.vue'

  createAPI(Vue, DatePicker, ['select', 'cancel'], false)

  export default {
    mounted () {
      this.datePicker = this.$createDatePicker({
        min: [2008, 8, 8],
        max: [2020, 10, 20],
        onSelect: (selectedVal, selectedIndex, selectedText) => {
          console.log('select', selectedVal, selectedIndex, selectedText)
        },
        onCancel: () => {
          console.log('cancel')
        }
      })
    },
    methods: {
      showDatePicker() {
        this.datePicker.show()
      }
    }
  }
  ```

- 实例方法 `setData`

  `setData`方法,用于重置`CascadePicker`实例的数据和选中的索引。

  ```html
  <cube-button @click="showPicker">SetData Picker</cube-button>
  ```
  ```js
  export default {
    mounted () {
      this.setDataPicker = this.$createCascadePicker({
        title: 'Set Data',
        onSelect: (selectedVal, selectedIndex, selectedText) => {
          console.log('select', selectedVal, selectedIndex, selectedText)
        },
        onCancel: () => {
          console.log('cancel')
        }
      })
    },
    methods: {
      showSetDataPicker() {
        // setData when picker is invisible
        this.setDataPicker.setData(cascadeData)
        this.setDataPicker.show()
        setTimeout(() => {
          // setData when picker is visible
          this.setDataPicker.setData(cityData, [1, 1, 0])
        }, 1000)
      }
    }
  }
  ```
  
  值得注意的一点是,虽然不管选择器显示前后,都可以`setData`,但是为了体验,在显示后`setData`,所传入的数据结构,必须与之前的列数相同,也就是说如果之前是三列选择器,显示时`setData`还得是三列。
  
### Props 配置

| 参数 | 说明 | 类型 | 默认值 | 示例 |
| - | - | - | - | - |
| title | 标题 | String | '' | - |
| data | 级联选择器的树形数据,用于初始化选项 | Array | [] | - |
| selectIndex | 被选中的索引值,拉起选择器后显示这个索引值对应的内容 | Array | [] | [1] |

* `data`子配置项

| 参数 | 说明 | 类型 | 默认值 | 示例 |
| - | - | - | - | - |
| text | 每个选项展示的文案 | String/Number | - | - |
| value | 每个选项的值 | String/Number/Boolean | - | - |

### 事件

| 事件名 | 说明 | 参数1 | 参数2 | 参数3 |
| - | - | - | - | - |
| select | 点击确认按钮触发此事件 | selectedVal: 当前选中项每一列的值,Array类型 | selectedIndex: 当前选中项每一列的索引,Array类型 | selectedText: 当前选中项每一列的文案,Array类型 |
| change | 滚轴滚动后触发此事件 | index: 当前滚动列次序,Number类型 | selectedIndex: 当前列选中项的索引,Number类型 |
| cancel | 点击取消按钮触发此事件 | - | - |

### 实例方法

| 方法名 | 说明 | 参数1 | 参数2 |
| - | - | - | - |
| setData | 重置数据和选中的索引 | 级联树形数据结构,Array类型 | 每列选中的索引,Array类型 |