withMemo.ts 694 B

1234567891011121314151617181920212223242526272829
  1. import { currentBlock, isBlockTreeEnabled, VNode } from '../vnode'
  2. export function withMemo(
  3. memo: any[],
  4. render: () => VNode,
  5. cache: any[],
  6. index: number
  7. ) {
  8. const cached = cache[index] as VNode | undefined
  9. if (cached && isMemoSame(cached.memo!, memo)) {
  10. // make sure to let parent block track it when returning cached
  11. if (isBlockTreeEnabled > 0 && currentBlock) {
  12. currentBlock.push(cached)
  13. }
  14. return cached
  15. }
  16. const ret = render()
  17. ret.memo = memo
  18. return (cache[index] = ret)
  19. }
  20. export function isMemoSame(prev: any[], next: any[]) {
  21. for (let i = 0; i < prev.length; i++) {
  22. if (prev[i] !== next[i]) {
  23. return false
  24. }
  25. }
  26. return true
  27. }