cascader.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <script>
  2. import ElInput from 'packages/input/index.js';
  3. import ElDropdown from './dropdown.vue';
  4. /**
  5. * ElCascader
  6. * @module components/basic/cascader
  7. * @desc 级联下拉选择
  8. * @param {string} model - 绑定值
  9. * @param {string} [placeholder] - 占位内容
  10. */
  11. export default {
  12. name: 'ElCascader',
  13. props: {
  14. model: {
  15. required: true,
  16. type: String
  17. },
  18. placeholder: String
  19. },
  20. directives: {
  21. ElementClickoutside: require('vue-clickoutside')
  22. },
  23. data() {
  24. return {
  25. show: false,
  26. data: [],
  27. menus: []
  28. };
  29. },
  30. compiled() {
  31. this.data.push(this.menus);
  32. },
  33. methods: {
  34. handleSelected(selected, index) {
  35. const nextIndex = index + 1;
  36. let removeIndex = nextIndex;
  37. if (selected.hasOwnProperty('submenu')) {
  38. this.data.$set(nextIndex, selected.submenu);
  39. removeIndex++;
  40. }
  41. this.data = this.data.slice(0, removeIndex);
  42. }
  43. },
  44. components: {
  45. ElInput,
  46. ElDropdown
  47. }
  48. };
  49. </script>
  50. <template>
  51. <div
  52. class="element-cascader"
  53. v-element-clickoutside="show = false">
  54. <el-input
  55. readonly
  56. :value.sync="model"
  57. @click="show = !show"
  58. :placeholder="placeholder">
  59. </el-input>
  60. <div
  61. v-show="show"
  62. class="element-cascader__dropdown">
  63. <div class="element-cascader__wrap">
  64. <el-dropdown
  65. class="element-cascader__menu"
  66. v-ref:dropdown
  67. :model.sync="model"
  68. :data="list"
  69. :index="$index"
  70. trigger="hover"
  71. v-for="list in data"
  72. @change="handleSelected">
  73. </el-dropdown>
  74. </div>
  75. </div>
  76. <slot></slot>
  77. </div>
  78. </template>