Blame view

src/components/tree/node.vue 7.96 KB
75c32d5f   梁灏   rebuild Tree
1
  <template>
37f4b7a8   梁灏   Tree add global s...
2
      <collapse-transition :appear="appear">
d44420be   Sergio Crisostomo   refactor and make...
3
          <ul :class="classes">
75c32d5f   梁灏   rebuild Tree
4
5
              <li>
                  <span :class="arrowClasses" @click="handleExpand">
37f4b7a8   梁灏   Tree add global s...
6
7
                      <Icon v-if="showArrow" :type="arrowType" :custom="customArrowType" :size="arrowSize" />
                      <Icon v-if="showLoading" type="ios-loading" class="ivu-load-loop" />
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"
37f4b7a8   梁灏   Tree add global s...
20
                          :appear="appearByClickArrow"
56c7cc0e   vanppo   Add new props 'ch...
21
                          v-for="(item, i) in children"
da76a837   Sergio Crisostomo   fix dom rendering...
22
                          :key="i"
eae3e936   Aresn   Tree support tran...
23
                          :data="item"
eae3e936   Aresn   Tree support tran...
24
                          :multiple="multiple"
56c7cc0e   vanppo   Add new props 'ch...
25
26
                          :show-checkbox="showCheckbox"
                          :children-key="childrenKey">
75c32d5f   梁灏   rebuild Tree
27
28
29
                  </Tree-node>
              </li>
          </ul>
eae3e936   Aresn   Tree support tran...
30
      </collapse-transition>
75c32d5f   梁灏   rebuild Tree
31
32
33
  </template>
  <script>
      import Checkbox from '../checkbox/checkbox.vue';
64633e8c   梁灏   fixed #612
34
      import Icon from '../icon/icon.vue';
174836c4   梁灏   update Tree Rende...
35
      import Render from './render';
eae3e936   Aresn   Tree support tran...
36
      import CollapseTransition from '../base/collapse-transition';
75c32d5f   梁灏   rebuild Tree
37
      import Emitter from '../../mixins/emitter';
b31aab71   梁灏   Tree add async lo...
38
      import { findComponentUpward } from '../../utils/assist';
75c32d5f   梁灏   rebuild Tree
39
40
41
42
43
44
  
      const prefixCls = 'ivu-tree';
  
      export default {
          name: 'TreeNode',
          mixins: [ Emitter ],
467e2cf9   梁灏   Tree add check-di...
45
          inject: ['TreeInstance'],
9b24f1ab   梁灏   Tree add Render f...
46
          components: { Checkbox, Icon, CollapseTransition, Render },
75c32d5f   梁灏   rebuild Tree
47
48
49
50
51
52
53
54
55
56
57
          props: {
              data: {
                  type: Object,
                  default () {
                      return {};
                  }
              },
              multiple: {
                  type: Boolean,
                  default: false
              },
56c7cc0e   vanppo   Add new props 'ch...
58
59
60
61
              childrenKey: {
                  type: String,
                  default: 'children'
              },
75c32d5f   梁灏   rebuild Tree
62
63
64
              showCheckbox: {
                  type: Boolean,
                  default: false
37f4b7a8   梁灏   Tree add global s...
65
66
67
68
              },
              appear: {
                  type: Boolean,
                  default: false
75c32d5f   梁灏   rebuild Tree
69
70
71
72
              }
          },
          data () {
              return {
37f4b7a8   梁灏   Tree add global s...
73
74
                  prefixCls: prefixCls,
                  appearByClickArrow: false
75c32d5f   梁灏   rebuild Tree
75
76
              };
          },
75c32d5f   梁灏   rebuild Tree
77
78
79
80
          computed: {
              classes () {
                  return [
                      `${prefixCls}-children`
3c145e6f   梁灏   update Tree
81
                  ];
75c32d5f   梁灏   rebuild Tree
82
83
84
85
86
87
88
89
90
91
92
93
94
              },
              selectedCls () {
                  return [
                      {
                          [`${prefixCls}-node-selected`]: this.data.selected
                      }
                  ];
              },
              arrowClasses () {
                  return [
                      `${prefixCls}-arrow`,
                      {
                          [`${prefixCls}-arrow-disabled`]: this.data.disabled,
b31aab71   梁灏   Tree add async lo...
95
                          [`${prefixCls}-arrow-open`]: this.data.expand
75c32d5f   梁灏   rebuild Tree
96
97
98
99
100
101
102
103
104
105
                      }
                  ];
              },
              titleClasses () {
                  return [
                      `${prefixCls}-title`,
                      {
                          [`${prefixCls}-title-selected`]: this.data.selected
                      }
                  ];
b31aab71   梁灏   Tree add async lo...
106
107
              },
              showArrow () {
56c7cc0e   vanppo   Add new props 'ch...
108
                  return (this.data[this.childrenKey] && this.data[this.childrenKey].length) || ('loading' in this.data && !this.data.loading);
b31aab71   梁灏   Tree add async lo...
109
110
111
              },
              showLoading () {
                  return 'loading' in this.data && this.data.loading;
174836c4   梁灏   update Tree Rende...
112
113
114
115
116
117
118
119
120
121
122
123
              },
              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
124
125
126
127
              },
              node () {
                  const Tree = findComponentUpward(this, 'Tree');
                  if (Tree) {
6ff0e340   梁灏   update Tree Rende...
128
129
                      // 将所有的 node(即flatState)和当前 node 都传递
                      return [Tree.flatState, Tree.flatState.find(item => item.nodeKey === this.data.nodeKey)];
97098fcd   梁灏   update Tree example
130
                  } else {
6ff0e340   梁灏   update Tree Rende...
131
                      return [];
97098fcd   梁灏   update Tree example
132
                  }
56c7cc0e   vanppo   Add new props 'ch...
133
134
135
              },
              children () {
                  return this.data[this.childrenKey];
37f4b7a8   梁灏   Tree add global s...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
              },
              // 3.4.0, global setting customArrow 有值时,arrow 赋值空
              arrowType () {
                  let type = 'ios-arrow-forward';
  
                  if (this.$IVIEW) {
                      if (this.$IVIEW.tree.customArrow) {
                          type = '';
                      } else if (this.$IVIEW.tree.arrow) {
                          type = this.$IVIEW.tree.arrow;
                      }
                  }
                  return type;
              },
              // 3.4.0, global setting
              customArrowType () {
                  let type = '';
  
                  if (this.$IVIEW) {
                      if (this.$IVIEW.tree.customArrow) {
                          type = this.$IVIEW.tree.customArrow;
                      }
                  }
                  return type;
              },
              // 3.4.0, global setting
              arrowSize () {
                  let size = '';
  
                  if (this.$IVIEW) {
                      if (this.$IVIEW.tree.arrowSize) {
                          size = this.$IVIEW.tree.arrowSize;
                      }
                  }
                  return size;
75c32d5f   梁灏   rebuild Tree
171
172
173
174
              }
          },
          methods: {
              handleExpand () {
b31aab71   梁灏   Tree add async lo...
175
176
177
                  const item = this.data;
                  if (item.disabled) return;
  
37f4b7a8   梁灏   Tree add global s...
178
179
180
                  // Vue.js 2.6.9 对 transition 的 appear 进行了调整,导致 iView 初始化时无动画,加此方法来判断通过点击箭头展开时,加 appear,否则初始渲染时 appear 为 false
                  this.appearByClickArrow = true;
  
b31aab71   梁灏   Tree add async lo...
181
                  // async loading
56c7cc0e   vanppo   Add new props 'ch...
182
                  if (item[this.childrenKey].length === 0) {
b31aab71   梁灏   Tree add async lo...
183
184
                      const tree = findComponentUpward(this, 'Tree');
                      if (tree && tree.loadData) {
da76a837   Sergio Crisostomo   fix dom rendering...
185
186
187
188
                          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...
189
                                  this.$set(this.data, this.childrenKey, children);
da76a837   Sergio Crisostomo   fix dom rendering...
190
                                  this.$nextTick(() => this.handleExpand());
b31aab71   梁灏   Tree add async lo...
191
192
193
194
195
196
                              }
                          });
                          return;
                      }
                  }
  
56c7cc0e   vanppo   Add new props 'ch...
197
                  if (item[this.childrenKey] && item[this.childrenKey].length) {
b31aab71   梁灏   Tree add async lo...
198
199
200
                      this.$set(this.data, 'expand', !this.data.expand);
                      this.dispatch('Tree', 'toggle-expand', this.data);
                  }
75c32d5f   梁灏   rebuild Tree
201
202
203
              },
              handleSelect () {
                  if (this.data.disabled) return;
467e2cf9   梁灏   Tree add check-di...
204
205
206
207
208
                  if (this.TreeInstance.showCheckbox && this.TreeInstance.checkDirectly) {
                      this.handleCheck();
                  } else {
                      this.dispatch('Tree', 'on-selected', this.data.nodeKey);
                  }
75c32d5f   梁灏   rebuild Tree
209
210
              },
              handleCheck () {
d44420be   Sergio Crisostomo   refactor and make...
211
212
213
214
215
216
                  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
217
              }
75c32d5f   梁灏   rebuild Tree
218
219
          }
      };
d44420be   Sergio Crisostomo   refactor and make...
220
  </script>