Feature:使用LRU缓存算法优化节点复用
This commit is contained in:
parent
34322ba6d1
commit
4eacec125e
@ -118,7 +118,9 @@ const defaultOpt = {
|
|||||||
// }
|
// }
|
||||||
// ]
|
// ]
|
||||||
// }
|
// }
|
||||||
]
|
],
|
||||||
|
// 节点最大缓存数量
|
||||||
|
maxNodeCacheCount: 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
// 思维导图
|
// 思维导图
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import Node from '../Node'
|
import Node from '../Node'
|
||||||
import { CONSTANTS, initRootNodePositionMap } from '../utils/constant'
|
import { CONSTANTS, initRootNodePositionMap } from '../utils/constant'
|
||||||
|
import Lru from '../utils/Lru'
|
||||||
|
|
||||||
// 布局基类
|
// 布局基类
|
||||||
class Base {
|
class Base {
|
||||||
@ -13,8 +14,7 @@ class Base {
|
|||||||
this.draw = this.mindMap.draw
|
this.draw = this.mindMap.draw
|
||||||
// 根节点
|
// 根节点
|
||||||
this.root = null
|
this.root = null
|
||||||
// 保存所有uid和节点,用于复用
|
this.lru = new Lru(this.mindMap.opt.maxNodeCacheCount)
|
||||||
this.nodePool = {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算节点位置
|
// 计算节点位置
|
||||||
@ -40,16 +40,7 @@ class Base {
|
|||||||
// 记录本次渲染时的节点
|
// 记录本次渲染时的节点
|
||||||
this.renderer.nodeCache[uid] = node
|
this.renderer.nodeCache[uid] = node
|
||||||
// 记录所有渲染时的节点
|
// 记录所有渲染时的节点
|
||||||
this.nodePool[uid] = node
|
this.lru.add(uid, node)
|
||||||
// 如果总缓存数量达到1000,直接清空
|
|
||||||
if (Object.keys(this.nodePool).length > 1000) {
|
|
||||||
this.clearNodePool()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清空节点存储池
|
|
||||||
clearNodePool() {
|
|
||||||
this.nodePool = {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查当前来源是否需要重新计算节点大小
|
// 检查当前来源是否需要重新计算节点大小
|
||||||
@ -72,9 +63,9 @@ class Base {
|
|||||||
newNode.getSize()
|
newNode.getSize()
|
||||||
newNode.needLayout = true
|
newNode.needLayout = true
|
||||||
}
|
}
|
||||||
} else if (this.nodePool[data.data.uid] && !this.renderer.reRender) {
|
} else if (this.lru.has(data.data.uid) && !this.renderer.reRender) {
|
||||||
// 数据上没有保存节点引用,但是通过uid找到了缓存的节点,也可以复用
|
// 数据上没有保存节点引用,但是通过uid找到了缓存的节点,也可以复用
|
||||||
newNode = this.nodePool[data.data.uid]
|
newNode = this.lru.get(data.data.uid)
|
||||||
// 保存该节点上一次的数据
|
// 保存该节点上一次的数据
|
||||||
let lastData = JSON.stringify(newNode.nodeData.data)
|
let lastData = JSON.stringify(newNode.nodeData.data)
|
||||||
newNode.reset()
|
newNode.reset()
|
||||||
|
|||||||
39
simple-mind-map/src/utils/Lru.js
Normal file
39
simple-mind-map/src/utils/Lru.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// LRU缓存类
|
||||||
|
export default class CRU {
|
||||||
|
constructor(max) {
|
||||||
|
this.max = max || 1000
|
||||||
|
this.size = 0
|
||||||
|
this.pool = new Map()
|
||||||
|
}
|
||||||
|
|
||||||
|
add(key, value) {
|
||||||
|
// 如果该key是否已经存在,则先删除
|
||||||
|
this.delete(key)
|
||||||
|
this.pool.set(key, value)
|
||||||
|
this.size++
|
||||||
|
// 如果数量超出最大值,则删除最早的
|
||||||
|
if (this.size > this.max) {
|
||||||
|
let keys = this.pool.keys()
|
||||||
|
let last = keys.next()
|
||||||
|
this.delete(last.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
delete(key) {
|
||||||
|
if (this.pool.has(key)) {
|
||||||
|
this.pool.delete(key)
|
||||||
|
this.size--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
has(key) {
|
||||||
|
return this.pool.has(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
get(key) {
|
||||||
|
if (this.pool.has(key)) {
|
||||||
|
return this.pool.get(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user