Blame view

src/components/tree/node.vue 6.35 KB
75c32d5f   梁灏   rebuild Tree
1
  <template>
eae3e936   Aresn   Tree support tran...
2
      <collapse-transition>
d44420be   Sergio Crisostomo   refactor and make...
3
          <ul :class="classes">
75c32d5f   梁灏   rebuild Tree
4
5
              <li>
                  <span :class="arrowClasses" @click="handleExpand">
d5e329ff   梁灏   fixed #4162
6
                      <Icon v-if="showArrow" type="ios-arrow-forward"></Icon>
929fdf5c   梁灏   update loading icon
7
                      <Icon v-if="showLoading" type="ios-loading" class="ivu-load-loop"></Icon>
75c32d5f   梁灏   rebuild Tree
8
9
                  </span>
                  <Checkbox
eae3e936   Aresn   Tree support tran...
10
11
                          v-if="showCheckbox"
                          :value="data.checked"
d44420be   Sergio Crisostomo   refactor and make...
12
                          :indeterminate="data.indeterminate"
eae3e936   Aresn   Tree support tran...
13
14
                          :disabled="data.disabled || data.disableCheckbox"
                          @click.native.prevent="handleCheck"></Checkbox>
97098fcd   梁灏   update Tree example
15
16
                  <Render v-if="data.render" :render="data.render" :data="data" :node="node"></Render>
                  <Render v-else-if="isParentRender" :render="parentRender" :data="data" :node="node"></Render>
174836c4   梁灏   update Tree Rende...
17
                  <span v-else :class="titleClasses" @click="handleSelect">{{ data.title }}</span>
75c32d5f   梁灏   rebuild Tree
18
                  <Tree-node
d44420be   Sergio Crisostomo   refactor and make...
19
                          v-if="data.expand"
56c7cc0e   vanppo   Add new props 'ch...
20
                          v-for="(item, i) in children"
da76a837   Sergio Crisostomo   fix dom rendering...
21
                          :key="i"
eae3e936   Aresn   Tree support tran...
22
                          :data="item"
eae3e936   Aresn   Tree support tran...
23
                          :multiple="multiple"
56c7cc0e   vanppo   Add new props 'ch...
24
25
                          :show-checkbox="showCheckbox"
                          :children-key="childrenKey">
75c32d5f   梁灏   rebuild Tree
26
27
28
                  </Tree-node>
              </li>
          </ul>
eae3e936   Aresn   Tree support tran...
29
      </collapse-transition>
75c32d5f   梁灏   rebuild Tree
30
31
32
  </template>
  <script>
      import Checkbox from '../checkbox/checkbox.vue';
64633e8c   梁灏   fixed #612
33
      import Icon from '../icon/icon.vue';
174836c4   梁灏   update Tree Rende...
34
      import Render from './render';
eae3e936   Aresn   Tree support tran...
35
      import CollapseTransition from '../base/collapse-transition';
75c32d5f   梁灏   rebuild Tree
36
      import Emitter from '../../mixins/emitter';
b31aab71   梁灏   Tree add async lo...
37
      import { findComponentUpward } from '../../utils/assist';
75c32d5f   梁灏   rebuild Tree
38
39
40
41
42
43
  
      const prefixCls = 'ivu-tree';
  
      export default {
          name: 'TreeNode',
          mixins: [ Emitter ],
467e2cf9   梁灏   Tree add check-di...
44
          inject: ['TreeInstance'],
9b24f1ab   梁灏   Tree add Render f...
45
          components: { Checkbox, Icon, CollapseTransition, Render },
75c32d5f   梁灏   rebuild Tree
46
47
48
49
50
51
52
53
54
55
56
          props: {
              data: {
                  type: Object,
                  default () {
                      return {};
                  }
              },
              multiple: {
                  type: Boolean,
                  default: false
              },
56c7cc0e   vanppo   Add new props 'ch...
57
58
59
60
              childrenKey: {
                  type: String,
                  default: 'children'
              },
75c32d5f   梁灏   rebuild Tree
61
62
63
              showCheckbox: {
                  type: Boolean,
                  default: false
75c32d5f   梁灏   rebuild Tree
64
65
66
67
              }
          },
          data () {
              return {
d44420be   Sergio Crisostomo   refactor and make...
68
                  prefixCls: prefixCls
75c32d5f   梁灏   rebuild Tree
69
70
              };
          },
75c32d5f   梁灏   rebuild Tree
71
72
73
74
          computed: {
              classes () {
                  return [
                      `${prefixCls}-children`
3c145e6f   梁灏   update Tree
75
                  ];
75c32d5f   梁灏   rebuild Tree
76
77
78
79
80
81
82
83
84
85
86
87
88
              },
              selectedCls () {
                  return [
                      {
                          [`${prefixCls}-node-selected`]: this.data.selected
                      }
                  ];
              },
              arrowClasses () {
                  return [
                      `${prefixCls}-arrow`,
                      {
                          [`${prefixCls}-arrow-disabled`]: this.data.disabled,
b31aab71   梁灏   Tree add async lo...
89
                          [`${prefixCls}-arrow-open`]: this.data.expand
75c32d5f   梁灏   rebuild Tree
90
91
92
93
94
95
96
97
98
99
                      }
                  ];
              },
              titleClasses () {
                  return [
                      `${prefixCls}-title`,
                      {
                          [`${prefixCls}-title-selected`]: this.data.selected
                      }
                  ];
b31aab71   梁灏   Tree add async lo...
100
101
              },
              showArrow () {
56c7cc0e   vanppo   Add new props 'ch...
102
                  return (this.data[this.childrenKey] && this.data[this.childrenKey].length) || ('loading' in this.data && !this.data.loading);
b31aab71   梁灏   Tree add async lo...
103
104
105
              },
              showLoading () {
                  return 'loading' in this.data && this.data.loading;
174836c4   梁灏   update Tree Rende...
106
107
108
109
110
111
112
113
114
115
116
117
              },
              isParentRender () {
                  const Tree = findComponentUpward(this, 'Tree');
                  return Tree && Tree.render;
              },
              parentRender () {
                  const Tree = findComponentUpward(this, 'Tree');
                  if (Tree && Tree.render) {
                      return Tree.render;
                  } else {
                      return null;
                  }
97098fcd   梁灏   update Tree example
118
119
120
121
              },
              node () {
                  const Tree = findComponentUpward(this, 'Tree');
                  if (Tree) {
6ff0e340   梁灏   update Tree Rende...
122
123
                      // 将所有的 node(即flatState)和当前 node 都传递
                      return [Tree.flatState, Tree.flatState.find(item => item.nodeKey === this.data.nodeKey)];
97098fcd   梁灏   update Tree example
124
                  } else {
6ff0e340   梁灏   update Tree Rende...
125
                      return [];
97098fcd   梁灏   update Tree example
126
                  }
56c7cc0e   vanppo   Add new props 'ch...
127
128
129
              },
              children () {
                  return this.data[this.childrenKey];
75c32d5f   梁灏   rebuild Tree
130
131
132
133
              }
          },
          methods: {
              handleExpand () {
b31aab71   梁灏   Tree add async lo...
134
135
136
137
                  const item = this.data;
                  if (item.disabled) return;
  
                  // async loading
56c7cc0e   vanppo   Add new props 'ch...
138
                  if (item[this.childrenKey].length === 0) {
b31aab71   梁灏   Tree add async lo...
139
140
                      const tree = findComponentUpward(this, 'Tree');
                      if (tree && tree.loadData) {
da76a837   Sergio Crisostomo   fix dom rendering...
141
142
143
144
                          this.$set(this.data, 'loading', true);
                          tree.loadData(item, children => {
                              this.$set(this.data, 'loading', false);
                              if (children.length) {
56c7cc0e   vanppo   Add new props 'ch...
145
                                  this.$set(this.data, this.childrenKey, children);
da76a837   Sergio Crisostomo   fix dom rendering...
146
                                  this.$nextTick(() => this.handleExpand());
b31aab71   梁灏   Tree add async lo...
147
148
149
150
151
152
                              }
                          });
                          return;
                      }
                  }
  
56c7cc0e   vanppo   Add new props 'ch...
153
                  if (item[this.childrenKey] && item[this.childrenKey].length) {
b31aab71   梁灏   Tree add async lo...
154
155
156
                      this.$set(this.data, 'expand', !this.data.expand);
                      this.dispatch('Tree', 'toggle-expand', this.data);
                  }
75c32d5f   梁灏   rebuild Tree
157
158
159
              },
              handleSelect () {
                  if (this.data.disabled) return;
467e2cf9   梁灏   Tree add check-di...
160
161
162
163
164
                  if (this.TreeInstance.showCheckbox && this.TreeInstance.checkDirectly) {
                      this.handleCheck();
                  } else {
                      this.dispatch('Tree', 'on-selected', this.data.nodeKey);
                  }
75c32d5f   梁灏   rebuild Tree
165
166
              },
              handleCheck () {
d44420be   Sergio Crisostomo   refactor and make...
167
168
169
170
171
172
                  if (this.data.disabled) return;
                  const changes = {
                      checked: !this.data.checked && !this.data.indeterminate,
                      nodeKey: this.data.nodeKey
                  };
                  this.dispatch('Tree', 'on-check', changes);
75c32d5f   梁灏   rebuild Tree
173
              }
75c32d5f   梁灏   rebuild Tree
174
175
          }
      };
d44420be   Sergio Crisostomo   refactor and make...
176
  </script>