Commit 2be2b974166ce08c16615e8634236b2e1d6f5019
Committed by
GitHub
Merge pull request #2184 from SergioCrisostomo/fix-tree-examples
fix dom rendering when adding new nodes in example
Showing
3 changed files
with
28 additions
and
22 deletions
Show diff stats
examples/routers/tree.vue
| ... | ... | @@ -34,11 +34,11 @@ |
| 34 | 34 | size: 'small' |
| 35 | 35 | }, |
| 36 | 36 | on: { |
| 37 | - click: () => { | |
| 38 | - this.cc(); | |
| 37 | + click: ({target}) => { | |
| 38 | + this.logger(target.textContent); | |
| 39 | 39 | } |
| 40 | 40 | } |
| 41 | - }, '我是按钮') | |
| 41 | + }, 'I\'m a button!'); | |
| 42 | 42 | } |
| 43 | 43 | } |
| 44 | 44 | ] |
| ... | ... | @@ -46,7 +46,7 @@ |
| 46 | 46 | ] |
| 47 | 47 | } |
| 48 | 48 | ] |
| 49 | - } | |
| 49 | + }; | |
| 50 | 50 | }, |
| 51 | 51 | methods: { |
| 52 | 52 | handleAdd () { |
| ... | ... | @@ -55,18 +55,20 @@ |
| 55 | 55 | title: 'test name', |
| 56 | 56 | checked: true |
| 57 | 57 | } |
| 58 | - ) | |
| 58 | + ); | |
| 59 | 59 | }, |
| 60 | 60 | handleUpdate () { |
| 61 | - this.$set(this.baseData[0].children[0].children[1], 'checked', true); | |
| 61 | + const child = this.baseData[0].children[0].children[1]; | |
| 62 | + // console.log(JSON.stringify(this.baseData), '\n', JSON.stringify(child)); | |
| 63 | + if (!child) return this.$Message.error('Node is async and is not loaded yet'); | |
| 64 | + else this.$set(child, 'checked', true); | |
| 62 | 65 | }, |
| 63 | - cc () { | |
| 64 | - console.log(99) | |
| 66 | + logger (txt) { | |
| 67 | + console.log(txt); | |
| 65 | 68 | }, |
| 66 | 69 | loadData (item, callback) { |
| 67 | - item.loading = true; | |
| 68 | 70 | setTimeout(() => { |
| 69 | - item.children = [ | |
| 71 | + callback([ | |
| 70 | 72 | { |
| 71 | 73 | title: 'children-1', |
| 72 | 74 | loading: false, |
| ... | ... | @@ -77,11 +79,9 @@ |
| 77 | 79 | loading: false, |
| 78 | 80 | children: [] |
| 79 | 81 | } |
| 80 | - ]; | |
| 81 | - item.loading = false; | |
| 82 | - callback(); | |
| 82 | + ]); | |
| 83 | 83 | }, 2000); |
| 84 | 84 | } |
| 85 | 85 | } |
| 86 | - } | |
| 86 | + }; | |
| 87 | 87 | </script> | ... | ... |
src/components/tree/node.vue
| ... | ... | @@ -16,8 +16,8 @@ |
| 16 | 16 | <span v-else :class="titleClasses" v-html="data.title" @click="handleSelect"></span> |
| 17 | 17 | <Tree-node |
| 18 | 18 | v-if="data.expand" |
| 19 | - v-for="item in data.children" | |
| 20 | - :key="item.nodeKey" | |
| 19 | + v-for="(item, i) in data.children" | |
| 20 | + :key="i" | |
| 21 | 21 | :data="item" |
| 22 | 22 | :multiple="multiple" |
| 23 | 23 | :show-checkbox="showCheckbox"> |
| ... | ... | @@ -61,6 +61,9 @@ |
| 61 | 61 | prefixCls: prefixCls |
| 62 | 62 | }; |
| 63 | 63 | }, |
| 64 | + watch: { | |
| 65 | + | |
| 66 | + }, | |
| 64 | 67 | computed: { |
| 65 | 68 | classes () { |
| 66 | 69 | return [ |
| ... | ... | @@ -104,12 +107,15 @@ |
| 104 | 107 | if (item.disabled) return; |
| 105 | 108 | |
| 106 | 109 | // async loading |
| 107 | - if (item.loading !== undefined && !item.children.length) { | |
| 110 | + if (item.children.length === 0) { | |
| 108 | 111 | const tree = findComponentUpward(this, 'Tree'); |
| 109 | 112 | if (tree && tree.loadData) { |
| 110 | - tree.loadData(item, () => { | |
| 111 | - if (item.children.length) { | |
| 112 | - this.handleExpand(item); | |
| 113 | + this.$set(this.data, 'loading', true); | |
| 114 | + tree.loadData(item, children => { | |
| 115 | + this.$set(this.data, 'loading', false); | |
| 116 | + if (children.length) { | |
| 117 | + this.$set(this.data, 'children', children); | |
| 118 | + this.$nextTick(() => this.handleExpand()); | |
| 113 | 119 | } |
| 114 | 120 | }); |
| 115 | 121 | return; | ... | ... |