Blame view

src/components/dropdown/dropdown.vue 2.86 KB
ab8aaf95   梁灏   add Dropdown comp...
1
2
3
4
5
6
7
8
  <template>
      <div
          :class="[prefixCls]"
          @click="handleClick"
          @mouseenter="handleMouseenter"
          @mouseleave="handleMouseleave"
          v-clickoutside="handleClose">
          <div :class="[prefixCls-rel]" v-el:reference><slot></slot></div>
745bcbc2   梁灏   update Dropdown
9
          <Drop v-show="visible" :placement="placement" transition="slide-up" v-ref:drop><slot name="list"></slot></Drop>
ab8aaf95   梁灏   add Dropdown comp...
10
11
12
13
14
15
16
17
18
19
      </div>
  </template>
  <script>
      import Drop from '../select/dropdown.vue';
      import clickoutside from '../../directives/clickoutside';
      import { oneOf } from '../../utils/assist';
  
      const prefixCls = 'ivu-dropdown';
  
      export default {
745bcbc2   梁灏   update Dropdown
20
          name: 'Dropdown',
ab8aaf95   梁灏   add Dropdown comp...
21
22
23
24
25
26
27
28
29
          directives: { clickoutside },
          components: { Drop },
          props: {
              trigger: {
                  validator (value) {
                      return oneOf(value, ['click', 'hover']);
                  },
                  default: 'hover'
              },
745bcbc2   梁灏   update Dropdown
30
              placement: {
ab8aaf95   梁灏   add Dropdown comp...
31
                  validator (value) {
745bcbc2   梁灏   update Dropdown
32
                      return oneOf(value, ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end']);
ab8aaf95   梁灏   add Dropdown comp...
33
                  },
745bcbc2   梁灏   update Dropdown
34
                  default: 'bottom'
ab8aaf95   梁灏   add Dropdown comp...
35
36
37
38
39
40
41
42
              }
          },
          data () {
              return {
                  prefixCls: prefixCls,
                  visible: false
              }
          },
ab8aaf95   梁灏   add Dropdown comp...
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
          methods: {
              handleClick () {
                  if (this.trigger !== 'click') {
                      return false;
                  }
                  this.visible = !this.visible;
              },
              handleMouseenter () {
                  if (this.trigger !== 'hover') {
                      return false;
                  }
                  clearTimeout(this.timeout);
                  this.timeout = setTimeout(() => {
                      this.visible = true;
                  }, 250);
              },
              handleMouseleave () {
                  if (this.trigger !== 'hover') {
                      return false;
                  }
                  clearTimeout(this.timeout);
                  this.timeout = setTimeout(() => {
                      this.visible = false;
                  }, 150);
              },
              handleClose () {
                  if (this.trigger !== 'click') {
                      return false;
                  }
                  this.visible = false;
              }
          },
          watch: {
              visible (val) {
                  if (val) {
745bcbc2   梁灏   update Dropdown
78
                      this.$refs.drop.update();
ab8aaf95   梁灏   add Dropdown comp...
79
                  } else {
745bcbc2   梁灏   update Dropdown
80
81
82
83
84
85
86
87
88
                      this.$refs.drop.destroy();
                  }
              }
          },
          events: {
              'on-click' (key) {
                  const $parent = this.$parent.$parent;
                  if ($parent && $parent.$options.name === 'Dropdown') {
                      $parent.$emit('on-click', key);
ab8aaf95   梁灏   add Dropdown comp...
89
90
91
92
93
                  }
              }
          }
      }
  </script>