service.js 3.4 KB
Newer Older
fxy060608's avatar
init v3  
fxy060608 已提交
1 2
const {
  ID,
fxy060608's avatar
fxy060608 已提交
3 4
  V_FOR,
  SET_DATA,
fxy060608's avatar
fxy060608 已提交
5
  isVar,
fxy060608's avatar
init v3  
fxy060608 已提交
6 7
  getForEl,
  processForKey,
fxy060608's avatar
fxy060608 已提交
8 9
  updateForEleId,
  traverseNode
fxy060608's avatar
init v3  
fxy060608 已提交
10 11
} = require('./util')

fxy060608's avatar
fxy060608 已提交
12 13 14 15
const {
  isComponent
} = require('../util')

fxy060608's avatar
fxy060608 已提交
16
const {
fxy060608's avatar
fxy060608 已提交
17
  parseIs,
fxy060608's avatar
fxy060608 已提交
18 19 20 21 22 23 24 25 26
  parseIf,
  parseFor,
  parseText,
  parseDirs,
  parseAttrs,
  parseProps,
  parseBinding
} = require('./parser/base-parser')

fxy060608's avatar
fxy060608 已提交
27 28
const parseEvent = require('./parser/event-parser')
const parseBlock = require('./parser/block-parser')
fxy060608's avatar
init v3  
fxy060608 已提交
29

fxy060608's avatar
fxy060608 已提交
30 31 32
const parseWxsProps = require('./parser/wxs-props-parser')
const parseWxsEvents = require('./parser/wxs-events-parser')

fxy060608's avatar
fxy060608 已提交
33
const preTransformNode = require('./pre-transform-node')
fxy060608's avatar
init v3  
fxy060608 已提交
34

fxy060608's avatar
fxy060608 已提交
35 36
const optimize = require('./optimizer')

fxy060608's avatar
fxy060608 已提交
37 38 39
function createGenVar (id) {
  return function genVar (name, value) {
    return `${SET_DATA}(${id},'${name}',${value})`
fxy060608's avatar
init v3  
fxy060608 已提交
40 41 42
  }
}

fxy060608's avatar
fxy060608 已提交
43
function parseKey (el) {
fxy060608's avatar
init v3  
fxy060608 已提交
44 45 46 47
  // add default key
  if (processForKey(el)) {
    el = el.children[0] // 当 template 下仅文本时,处理第一个动态文本
  }
fxy060608's avatar
fxy060608 已提交
48 49
  if (!el.key || el.key.indexOf(SET_DATA) === 0) {
    return
fxy060608's avatar
init v3  
fxy060608 已提交
50
  }
fxy060608's avatar
fxy060608 已提交
51 52
  const forEl = getForEl(el)
  if (!forEl) {
53
    return isVar(el.key) && (el.key = createGenVar(el.attrsMap[ID])('a-key', el.key))
fxy060608's avatar
init v3  
fxy060608 已提交
54
  }
fxy060608's avatar
fxy060608 已提交
55 56
  if (!isVar(forEl.for)) {
    return
fxy060608's avatar
init v3  
fxy060608 已提交
57
  }
fxy060608's avatar
fxy060608 已提交
58 59 60 61 62 63 64 65
  const forId = forEl.forId
  const it = forEl.iterator2
  const genVar = createGenVar(forId)
  if (forEl === el) { // <view v-for="item in items" :key="item.id"></view>
    el.key = genVar(V_FOR, `{forIndex:${it},key:${el.key}}`)
  } else { // <template v-for="item in items"><view :key="item.id+'1'"></view><view :key="item.id+'2'"></view></template>
    const keyIndex = forEl.children.indexOf(el)
    el.key = genVar(V_FOR, `{forIndex:${it},keyIndex:${keyIndex},key:${el.key}}`)
fxy060608's avatar
init v3  
fxy060608 已提交
66 67 68
  }
}

fxy060608's avatar
fxy060608 已提交
69 70
function transformNode (el, parent, state) {
  if (el.type === 3) {
fxy060608's avatar
init v3  
fxy060608 已提交
71 72
    return
  }
fxy060608's avatar
fxy060608 已提交
73
  parseBlock(el, parent)
fxy060608's avatar
fxy060608 已提交
74
  parseEvent(el)
fxy060608's avatar
init v3  
fxy060608 已提交
75

fxy060608's avatar
fxy060608 已提交
76
  updateForEleId(el, state)
77

fxy060608's avatar
fxy060608 已提交
78 79 80 81 82 83 84
  if (el.type === 2) {
    return parseText(el, parent, {
      index: 0,
      service: true,
      // <uni-popup>{{content}}</uni-popup>
      genVar: createGenVar(parent.attrsMap[ID])
    })
fxy060608's avatar
fxy060608 已提交
85 86
  }

fxy060608's avatar
fxy060608 已提交
87
  const genVar = createGenVar(el.attrsMap[ID])
fxy060608's avatar
fxy060608 已提交
88

fxy060608's avatar
fxy060608 已提交
89
  parseIs(el, genVar)
fxy060608's avatar
fxy060608 已提交
90 91
  parseFor(el, createGenVar)
  parseKey(el)
fxy060608's avatar
init v3  
fxy060608 已提交
92

fxy060608's avatar
fxy060608 已提交
93 94
  parseIf(el, createGenVar)
  parseBinding(el, genVar)
fxy060608's avatar
fxy060608 已提交
95
  parseDirs(el, genVar, ['model'])
fxy060608's avatar
init v3  
fxy060608 已提交
96

fxy060608's avatar
fxy060608 已提交
97 98 99 100
  parseWxsProps(el, {
    isAppService: true
  })

fxy060608's avatar
fxy060608 已提交
101 102 103
  if (!isComponent(el.tag)) {
    parseAttrs(el, genVar)
  }
fxy060608's avatar
init v3  
fxy060608 已提交
104

fxy060608's avatar
fxy060608 已提交
105
  parseProps(el, genVar)
fxy060608's avatar
fxy060608 已提交
106 107 108 109 110

  parseWxsEvents(el, {
    filterModules: state.filterModules,
    isAppService: true
  })
fxy060608's avatar
init v3  
fxy060608 已提交
111 112
}

fxy060608's avatar
fxy060608 已提交
113
function postTransformNode (el, options) {
fxy060608's avatar
fxy060608 已提交
114 115 116
  if (!el.parent) { // 从根节点开始递归处理
    traverseNode(el, false, {
      forIteratorId: 0,
fxy060608's avatar
fxy060608 已提交
117 118
      transformNode,
      filterModules: options.filterModules
fxy060608's avatar
fxy060608 已提交
119
    })
fxy060608's avatar
fxy060608 已提交
120
    optimize(el, options)
fxy060608's avatar
fxy060608 已提交
121 122
  }
}
fxy060608's avatar
fxy060608 已提交
123

fxy060608's avatar
fxy060608 已提交
124 125 126 127 128 129 130 131 132
function genVModel (el) {
  if (
    (el.tag === 'input' || el.tag === 'textarea') &&
    el.directives &&
    el.directives.find(dir => dir.name === 'model')
  ) {
    const prop = el.props.find(prop => prop.name === 'value')
    prop.value = createGenVar(el.attrsMap[ID])('v-model', prop.value)
  }
fxy060608's avatar
fxy060608 已提交
133
  if (el.model) {
fxy060608's avatar
fxy060608 已提交
134
    el.model.value = createGenVar(el.attrsMap[ID])('v-model', el.model.value)
fxy060608's avatar
fxy060608 已提交
135 136 137 138 139 140
  }
}

function genData (el) {
  delete el.$parentIterator3

fxy060608's avatar
fxy060608 已提交
141
  genVModel(el)
fxy060608's avatar
fxy060608 已提交
142 143 144 145

  return ''
}

fxy060608's avatar
init v3  
fxy060608 已提交
146
module.exports = {
fxy060608's avatar
fxy060608 已提交
147
  preTransformNode,
fxy060608's avatar
init v3  
fxy060608 已提交
148 149
  postTransformNode,
  genData
fxy060608's avatar
fxy060608 已提交
150
}