vdom-sync.js 1.1 KB
Newer Older
fxy060608's avatar
init v3  
fxy060608 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
import {
  guid
} from 'uni-shared'

export class VDomSync {
  constructor (pageId) {
    this.pageId = pageId
    this.addVDatas = []
    this.updateVDatas = []
    this.vms = Object.create(null)
  }

  addVData (nodeId, data = {}) {
    this.addVDatas.push([nodeId, data])
  }

  updateVData (nodeId, data = {}) {
    this.updateVDatas.push([nodeId, data])
  }

  initVm (vm) {
fxy060608's avatar
fxy060608 已提交
22
    const [nodeId, data] = this.addVDatas.shift()
fxy060608's avatar
init v3  
fxy060608 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
    if (!nodeId) {
      vm._$id = guid()
      console.error('nodeId unmatched', vm)
    } else {
      vm._$id = nodeId
    }
    vm.$r = data || Object.create(null)
    this.vms[vm._$id] = vm
  }

  flush () {
    console.log('update....', this.addVDatas, this.updateVDatas)
    this.updateVDatas.forEach(([nodeId, data]) => {
      const vm = this.vms[nodeId]
      if (!vm) {
        return console.error(`Not found ${nodeId}`)
      }
fxy060608's avatar
fxy060608 已提交
40 41 42 43
      Object.keys(data).forEach(nodeId => {
        Object.assign((vm.$r[nodeId] || (vm.$r[nodeId] = Object.create(null))), data[nodeId])
      })

fxy060608's avatar
init v3  
fxy060608 已提交
44 45 46 47 48
      vm.$forceUpdate()
    })
    this.updateVDatas.length = 0
  }
}