Blame view

src/components/dropdown/dropdown.vue 3.57 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
          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;
6b71ba94   梁灏   update Dropdown
73
74
75
76
77
78
79
80
              },
              hasParent () {
                  const $parent = this.$parent.$parent;
                  if ($parent && $parent.$options.name === 'Dropdown') {
                      return $parent;
                  } else {
                      return false;
                  }
ab8aaf95   梁灏   add Dropdown comp...
81
82
83
84
85
              }
          },
          watch: {
              visible (val) {
                  if (val) {
745bcbc2   梁灏   update Dropdown
86
                      this.$refs.drop.update();
ab8aaf95   梁灏   add Dropdown comp...
87
                  } else {
745bcbc2   梁灏   update Dropdown
88
89
90
91
92
93
                      this.$refs.drop.destroy();
                  }
              }
          },
          events: {
              'on-click' (key) {
6b71ba94   梁灏   update Dropdown
94
95
                  const $parent = this.hasParent();
                  if ($parent ) $parent.$emit('on-click', key)
5557dd66   梁灏   update Dropdown
96
97
              },
              'on-hover-click' () {
6b71ba94   梁灏   update Dropdown
98
99
100
101
102
103
104
105
106
107
108
109
                  this.$nextTick(() => {
                      this.visible = false;
                  });
                  const $parent = this.hasParent();
                  if ($parent) $parent.$emit('on-hover-click');
              },
              'on-haschild-click' () {
                  this.$nextTick(() => {
                      this.visible = true;
                  });
                  const $parent = this.hasParent();
                  if ($parent) $parent.$emit('on-haschild-click');
ab8aaf95   梁灏   add Dropdown comp...
110
111
112
113
              }
          }
      }
  </script>