Blame view

src/components/dropdown/dropdown.vue 3.99 KB
ab8aaf95   梁灏   add Dropdown comp...
1
2
3
  <template>
      <div
          :class="[prefixCls]"
407eabd5   梁灏   update Dropdown
4
          v-clickoutside="handleClose"
ab8aaf95   梁灏   add Dropdown comp...
5
          @mouseenter="handleMouseenter"
407eabd5   梁灏   update Dropdown
6
          @mouseleave="handleMouseleave">
e05d7289   梁灏   update Menu
7
          <div :class="[prefixCls-rel]" v-el:reference @click="handleClick"><slot></slot></div>
407eabd5   梁灏   update Dropdown
8
          <Drop v-show="visible" :placement="placement" :transition="transition" v-ref:drop><slot name="list"></slot></Drop>
ab8aaf95   梁灏   add Dropdown comp...
9
10
11
12
13
14
15
16
17
18
      </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
19
          name: 'Dropdown',
ab8aaf95   梁灏   add Dropdown comp...
20
21
22
23
24
25
26
27
28
          directives: { clickoutside },
          components: { Drop },
          props: {
              trigger: {
                  validator (value) {
                      return oneOf(value, ['click', 'hover']);
                  },
                  default: 'hover'
              },
745bcbc2   梁灏   update Dropdown
29
              placement: {
ab8aaf95   梁灏   add Dropdown comp...
30
                  validator (value) {
745bcbc2   梁灏   update Dropdown
31
                      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...
32
                  },
745bcbc2   梁灏   update Dropdown
33
                  default: 'bottom'
ab8aaf95   梁灏   add Dropdown comp...
34
35
              }
          },
407eabd5   梁灏   update Dropdown
36
37
38
39
40
          computed: {
              transition () {
                  return ['bottom-start', 'bottom', 'bottom-end'].indexOf(this.placement) > -1 ? 'slide-up' : 'fade';
              }
          },
ab8aaf95   梁灏   add Dropdown comp...
41
42
43
44
45
46
          data () {
              return {
                  prefixCls: prefixCls,
                  visible: false
              }
          },
ab8aaf95   梁灏   add Dropdown comp...
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
          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
77
78
79
80
81
82
83
84
              },
              hasParent () {
                  const $parent = this.$parent.$parent;
                  if ($parent && $parent.$options.name === 'Dropdown') {
                      return $parent;
                  } else {
                      return false;
                  }
ab8aaf95   梁灏   add Dropdown comp...
85
86
87
88
89
              }
          },
          watch: {
              visible (val) {
                  if (val) {
745bcbc2   梁灏   update Dropdown
90
                      this.$refs.drop.update();
ab8aaf95   梁灏   add Dropdown comp...
91
                  } else {
745bcbc2   梁灏   update Dropdown
92
93
                      this.$refs.drop.destroy();
                  }
fc640135   梁灏   Tabs add on-visib...
94
                  this.$emit('on-visible-change', val);
745bcbc2   梁灏   update Dropdown
95
96
97
98
              }
          },
          events: {
              'on-click' (key) {
6b71ba94   梁灏   update Dropdown
99
                  const $parent = this.hasParent();
407eabd5   梁灏   update Dropdown
100
                  if ($parent ) $parent.$emit('on-click', key);
5557dd66   梁灏   update Dropdown
101
102
              },
              'on-hover-click' () {
6b71ba94   梁灏   update Dropdown
103
                  const $parent = this.hasParent();
407eabd5   梁灏   update Dropdown
104
105
106
107
108
109
110
111
112
113
                  if ($parent) {
                      this.$nextTick(() => {
                          this.visible = false;
                      });
                      $parent.$emit('on-hover-click');
                  } else {
                      this.$nextTick(() => {
                          this.visible = false;
                      });
                  }
6b71ba94   梁灏   update Dropdown
114
115
116
117
118
119
120
              },
              'on-haschild-click' () {
                  this.$nextTick(() => {
                      this.visible = true;
                  });
                  const $parent = this.hasParent();
                  if ($parent) $parent.$emit('on-haschild-click');
ab8aaf95   梁灏   add Dropdown comp...
121
122
123
124
              }
          }
      }
  </script>