Blame view

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