Blame view

src/components/cascader/caspanel.vue 2.83 KB
c463ab87   梁灏   add Cascader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  <template>
      <ul v-if="data && data.length" :class="[prefixCls + '-menu']">
          <Casitem
              v-for="item in data"
              :prefix-cls="prefixCls"
              :data.sync="item"
              :tmp-item="tmpItem"
              @click.stop="handleClickItem(item)"
              @mouseenter.stop="handleHoverItem(item)"></Casitem>
      </ul><Caspanel v-if="sublist && sublist.length" :prefix-cls="prefixCls" :data.sync="sublist" :disabled="disabled" :trigger="trigger" @on-update-result="updateResult"></Caspanel>
  </template>
  <script>
      import Casitem from './casitem.vue';
      import { oneOf } from '../../utils/assist';
  
      export default {
          name: 'Caspanel',
          components: { Casitem },
          props: {
              data: {
                  type: Array,
                  default () {
                      return []
                  }
              },
              sublist: {
                  type: Array,
                  default () {
                      return []
                  }
              },
              disabled: Boolean,
              changeOnSelect: Boolean,
              trigger: {
                  validator (value) {
                      return oneOf(value, ['click', 'hover']);
                  }
              },
              prefixCls: String
          },
          data () {
              return {
                  tmpItem: {},
                  result: []
              }
          },
          methods: {
              handleClickItem (item) {
                  if (this.trigger !== 'click') return;
                  this.handleTriggerItem(item);
              },
              handleHoverItem (item) {
                  if (this.trigger !== 'hover') return;
                  this.handleTriggerItem(item);
              },
              handleTriggerItem (item) {
                  if (item.disabled) return;
  
                  if (item.children && item.children.length){
                      this.sublist = item.children;
                      // todo 实时选择
                  } else {
                      this.sublist = [];
                      // todo 选择
                  }
  
                  // return value back
                  const backItem = this.getBaseItem(item);
  
                  this.tmpItem = backItem;
                  this.$emit('on-update-result', [backItem]);
              },
              updateResult (item) {
                  this.result = [this.tmpItem].concat(item);
                  this.$emit('on-update-result', this.result);
              },
              getBaseItem (item) {
                  let backItem = Object.assign({}, item);
                  if (backItem.children) {
                      delete backItem.children;
                  }
  
                  return backItem;
              }
          },
          watch: {
              data () {
                  this.sublist = [];
              }
          },
          ready () {
              // todo 初始化时,判断预设的值
          }
      }
  </script>