mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import {
  VD_SYNC,
  UI_EVENT
} from '../../../constants'
 
import {
  generateId
} from '../../../helpers/util'
 
function findParent (vm) {
  let parent = vm.$parent
  while (parent) {
    if (parent._$id) {
      return parent
    }
    parent = parent.$parent
  }
}
 
export class VDomSync {
  constructor (pageId, options = {}) {
    this.pageId = pageId
    this.addBatchVData = Object.create(null)
    this.updateBatchVData = []
    this.vms = Object.create(null)
 
    this.version = options.version
  }
 
  addVData (cid, data = {}, options = {}) {
    this.addBatchVData[cid] = [data, options]
  }
 
  updateVData (cid, data = {}) {
    this.updateBatchVData.push([cid, data])
  }
 
  addVm (vm) {
    const id = vm._$id
    const oldVm = this.vms[id]
    if (oldVm) {
      const newId = generateId(oldVm, findParent(oldVm), this.version)
      oldVm._$id = newId
      this.vms[newId] = oldVm
    }
    this.vms[id] = vm
  }
 
  initVm (vm) {
    vm._$id = generateId(vm, findParent(vm), this.version)
    let vData = this.addBatchVData[vm._$id]
    if (!vData) {
      // console.error('cid unmatched', vm)
      vData = [{}, {}]
    } else {
      delete this.addBatchVData[vm._$id]
    }
    const [data, options] = vData
    Object.assign(vm.$options, options)
    vm.$r = data || Object.create(null)
    this.addVm(vm)
  }
 
  sendUIEvent (cid, nid, event) {
    UniViewJSBridge.publishHandler(VD_SYNC, {
      data: [
        [UI_EVENT, [
          [cid, nid, event]
        ]]
      ],
      options: {
        timestamp: Date.now()
      }
    })
  }
 
  clearAddBatchVData () {
    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)
  }
 
  flush () {
    this.updateBatchVData.forEach(([cid, data]) => {
      const vm = this.vms[cid]
      if (!vm) {
        return console.error(`Not found ${cid}`)
      }
      Object.keys(data).forEach(cid => {
        Object.assign((vm.$r[cid] || (vm.$r[cid] = Object.create(null))), data[cid])
      })
 
      vm.$forceUpdate()
    })
    this.updateBatchVData.length = 0
  }
}