vdom-sync.js 2.1 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5
import {
  VD_SYNC,
  UI_EVENT
} from '../../../constants'

fxy060608's avatar
fxy060608 已提交
6 7 8 9 10
import {
  generateId
} from '../../../helpers/util'

function findParent (vm) {
fxy060608's avatar
fxy060608 已提交
11 12 13
  let parent = vm.$parent
  while (parent) {
    if (parent._$id) {
fxy060608's avatar
fxy060608 已提交
14
      return parent
fxy060608's avatar
fxy060608 已提交
15 16 17 18 19
    }
    parent = parent.$parent
  }
}

fxy060608's avatar
init v3  
fxy060608 已提交
20
export class VDomSync {
fxy060608's avatar
fxy060608 已提交
21
  constructor (pageId, options = {}) {
fxy060608's avatar
init v3  
fxy060608 已提交
22
    this.pageId = pageId
fxy060608's avatar
fxy060608 已提交
23
    this.addBatchVData = Object.create(null)
fxy060608's avatar
fxy060608 已提交
24
    this.updateBatchVData = []
fxy060608's avatar
init v3  
fxy060608 已提交
25
    this.vms = Object.create(null)
fxy060608's avatar
fxy060608 已提交
26 27

    this.version = options.version
fxy060608's avatar
init v3  
fxy060608 已提交
28 29
  }

fxy060608's avatar
fxy060608 已提交
30
  addVData (cid, data = {}, options = {}) {
fxy060608's avatar
fxy060608 已提交
31
    this.addBatchVData[cid] = [data, options]
fxy060608's avatar
init v3  
fxy060608 已提交
32 33
  }

fxy060608's avatar
fxy060608 已提交
34 35
  updateVData (cid, data = {}) {
    this.updateBatchVData.push([cid, data])
fxy060608's avatar
init v3  
fxy060608 已提交
36 37 38
  }

  initVm (vm) {
fxy060608's avatar
fxy060608 已提交
39
    vm._$id = generateId(vm, findParent(vm), this.version)
fxy060608's avatar
fxy060608 已提交
40 41
    let vData = this.addBatchVData[vm._$id]
    if (!vData) {
fxy060608's avatar
fxy060608 已提交
42
      console.error('cid unmatched', vm)
fxy060608's avatar
fxy060608 已提交
43 44 45 46
      vData = {
        data: {},
        options: {}
      }
fxy060608's avatar
init v3  
fxy060608 已提交
47
    } else {
fxy060608's avatar
fxy060608 已提交
48
      delete this.addBatchVData[vm._$id]
fxy060608's avatar
init v3  
fxy060608 已提交
49
    }
fxy060608's avatar
fxy060608 已提交
50
    const [data, options] = vData
fxy060608's avatar
fxy060608 已提交
51
    Object.assign(vm.$options, options)
fxy060608's avatar
init v3  
fxy060608 已提交
52 53 54 55
    vm.$r = data || Object.create(null)
    this.vms[vm._$id] = vm
  }

fxy060608's avatar
fxy060608 已提交
56 57 58 59 60 61 62 63 64 65 66
  sendUIEvent (cid, nid, event) {
    UniViewJSBridge.publishHandler(VD_SYNC, {
      data: [
        [UI_EVENT, [
          [cid, nid, event]
        ]]
      ],
      options: {
        timestamp: Date.now()
      }
    })
fxy060608's avatar
fxy060608 已提交
67 68
  }

fxy060608's avatar
fxy060608 已提交
69
  clearAddBatchVData () {
fxy060608's avatar
fxy060608 已提交
70 71 72 73 74 75
    if (process.env.NODE_ENV !== 'production') {
      if (Object.keys(this.addBatchVData).length) {
        console.error('this.addBatchVData...=' + JSON.stringify(this.addBatchVData))
      }
    }
    this.addBatchVData = Object.create(null)
fxy060608's avatar
fxy060608 已提交
76 77
  }

fxy060608's avatar
init v3  
fxy060608 已提交
78
  flush () {
fxy060608's avatar
fxy060608 已提交
79 80
    this.updateBatchVData.forEach(([cid, data]) => {
      const vm = this.vms[cid]
fxy060608's avatar
init v3  
fxy060608 已提交
81
      if (!vm) {
fxy060608's avatar
fxy060608 已提交
82
        return console.error(`Not found ${cid}`)
fxy060608's avatar
init v3  
fxy060608 已提交
83
      }
fxy060608's avatar
fxy060608 已提交
84 85
      Object.keys(data).forEach(cid => {
        Object.assign((vm.$r[cid] || (vm.$r[cid] = Object.create(null))), data[cid])
fxy060608's avatar
fxy060608 已提交
86 87
      })

fxy060608's avatar
init v3  
fxy060608 已提交
88 89
      vm.$forceUpdate()
    })
fxy060608's avatar
fxy060608 已提交
90
    this.updateBatchVData.length = 0
fxy060608's avatar
init v3  
fxy060608 已提交
91 92
  }
}