component-parser.js 2.3 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3
import {
  isPage,
  initRelation,
4 5
  handleLink,
  components
fxy060608's avatar
fxy060608 已提交
6 7 8 9 10 11 12 13 14
} from './util'

import {
  initSlots,
  initVueIds
} from 'uni-wrapper/util'

import parseBaseComponent from '../../../mp-weixin/runtime/wrapper/component-base-parser'

15 16 17 18 19 20 21
function currentComponents (mpInstance, callback) {
  const webviewId = mpInstance.__webviewId__
  const currentComponents = components[webviewId]
  if (currentComponents) {
    callback(currentComponents)
  }
}
22

fxy060608's avatar
fxy060608 已提交
23 24
export default function parseComponent (vueOptions) {
  const [componentOptions, VueComponent] = parseBaseComponent(vueOptions)
25
  const lifetimes = componentOptions.lifetimes
fxy060608's avatar
fxy060608 已提交
26

27
  // 基础库 2.0 以上 attached 顺序错乱,按照 created 顺序强制纠正
28 29 30 31
  lifetimes.created = function created () {
    currentComponents(this, components => {
      components.push(this)
    })
32 33
  }

34
  lifetimes.attached = function attached () {
35 36
    this.__lifetimes_attached = function () {
      const properties = this.properties
fxy060608's avatar
fxy060608 已提交
37

38 39 40 41 42
      const options = {
        mpType: isPage.call(this) ? 'page' : 'component',
        mpInstance: this,
        propsData: properties
      }
fxy060608's avatar
fxy060608 已提交
43

44
      initVueIds(properties.vueId, this)
fxy060608's avatar
fxy060608 已提交
45

46 47
      // 初始化 vue 实例
      this.$vm = new VueComponent(options)
fxy060608's avatar
fxy060608 已提交
48

49 50
      // 处理$slots,$scopedSlots(暂不支持动态变化$slots)
      initSlots(this.$vm, properties.vueSlots)
fxy060608's avatar
fxy060608 已提交
51

52 53 54 55 56
      // 处理父子关系
      initRelation.call(this, {
        vuePid: this._$vuePid,
        mpInstance: this
      })
fxy060608's avatar
fxy060608 已提交
57

58 59 60
      // 触发首次 setData
      this.$vm.$mount()
    }
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
    currentComponents(this, components => {
      let component = this
      while (component && component.__lifetimes_attached && components[0] && component === components[0]) {
        components.shift()
        component.__lifetimes_attached()
        delete component.__lifetimes_attached
        component = components[0]
      }
    })
  }

  lifetimes.detached = function detached () {
    currentComponents(this, components => {
      const index = components.indexOf(this)
      if (index >= 0) {
        components.splice(index, 1)
      }
    })
fxy060608's avatar
fxy060608 已提交
79 80 81
  }

  // ready 比 handleLink 还早,初始化逻辑放到 handleLink 中
82
  delete lifetimes.ready
fxy060608's avatar
fxy060608 已提交
83 84 85 86

  componentOptions.methods.__l = handleLink

  return componentOptions
87
}