diff --git a/packages/tree/src/model/node.js b/packages/tree/src/model/node.js index 454cfcabd..657b3b82b 100644 --- a/packages/tree/src/model/node.js +++ b/packages/tree/src/model/node.js @@ -1,5 +1,6 @@ import objectAssign from 'element-ui/src/utils/merge'; import { markNodeData, NODE_KEY } from './util'; +import { arrayFindIndex } from 'element-ui/src/utils/util'; export const getChildState = node => { let all = true; @@ -435,8 +436,10 @@ export default class Node { const newNodes = []; newData.forEach((item, index) => { - if (item[NODE_KEY]) { - newDataMap[item[NODE_KEY]] = { index, data: item }; + const key = item[NODE_KEY]; + const isNodeExists = !!key && arrayFindIndex(oldData, data => data[NODE_KEY] === key) >= 0; + if (isNodeExists) { + newDataMap[key] = { index, data: item }; } else { newNodes.push({ index, data: item }); } diff --git a/test/unit/specs/tree.spec.js b/test/unit/specs/tree.spec.js index 7642fa5b7..403d51c06 100644 --- a/test/unit/specs/tree.spec.js +++ b/test/unit/specs/tree.spec.js @@ -1,4 +1,4 @@ -import { createVue, destroyVM, waitImmediate } from '../util'; +import { createVue, destroyVM, waitImmediate, wait } from '../util'; const DELAY = 10; @@ -831,4 +831,63 @@ describe('Tree', () => { done(); }); }); + + it('update multi tree data', async() => { + const vm = createVue({ + template: ` +