service.js 4.2 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
fxy060608 已提交
6
  getNewId,
fxy060608's avatar
init v3  
fxy060608 已提交
7 8
  getForEl,
  processForKey,
fxy060608's avatar
fxy060608 已提交
9
  updateForEleId,
fxy060608's avatar
fxy060608 已提交
10 11
  traverseNode,
  updateScopedSlotEleId
fxy060608's avatar
init v3  
fxy060608 已提交
12 13
} = require('./util')

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

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

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

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

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

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

fxy060608's avatar
fxy060608 已提交
39 40 41 42 43 44
function createGenVar (id, isScopedSlot) {
  if (isScopedSlot) {
    return function genVar (name, value) {
      return `_svm.${SET_DATA}(${id},'${name}',${value})`
    }
  }
fxy060608's avatar
fxy060608 已提交
45 46
  return function genVar (name, value) {
    return `${SET_DATA}(${id},'${name}',${value})`
fxy060608's avatar
init v3  
fxy060608 已提交
47 48 49
  }
}

fxy060608's avatar
fxy060608 已提交
50
function parseKey (el, isScopedSlot) {
fxy060608's avatar
init v3  
fxy060608 已提交
51 52 53 54
  // add default key
  if (processForKey(el)) {
    el = el.children[0] // 当 template 下仅文本时,处理第一个动态文本
  }
fxy060608's avatar
fxy060608 已提交
55 56
  if (!el.key || el.key.indexOf(SET_DATA) === 0) {
    return
fxy060608's avatar
init v3  
fxy060608 已提交
57
  }
fxy060608's avatar
fxy060608 已提交
58 59
  const forEl = getForEl(el)
  if (!forEl) {
fxy060608's avatar
fxy060608 已提交
60
    return isVar(el.key) && (el.key = createGenVar(el.attrsMap[ID], isScopedSlot)('a-key', el.key))
fxy060608's avatar
init v3  
fxy060608 已提交
61
  }
fxy060608's avatar
fxy060608 已提交
62 63
  if (!isVar(forEl.for)) {
    return
fxy060608's avatar
init v3  
fxy060608 已提交
64
  }
fxy060608's avatar
fxy060608 已提交
65 66
  const forId = forEl.forId
  const it = forEl.iterator2
fxy060608's avatar
fxy060608 已提交
67
  const genVar = createGenVar(forId, isScopedSlot)
fxy060608's avatar
fxy060608 已提交
68 69 70 71 72
  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 已提交
73 74 75
  }
}

fxy060608's avatar
fxy060608 已提交
76 77 78 79 80 81 82 83 84 85 86 87
function parseComponentAttrs (el, genVar) {
  el.attrs && el.attrs.forEach(attr => {
    const {
      name,
      value
    } = attr
    if (name.indexOf('data-') === 0) {
      attr.value = genVar('a-' + name, value)
    }
  })
}

fxy060608's avatar
fxy060608 已提交
88
function transformNode (el, parent, state, isScopedSlot) {
fxy060608's avatar
fxy060608 已提交
89
  if (el.type === 3) {
fxy060608's avatar
init v3  
fxy060608 已提交
90 91
    return
  }
fxy060608's avatar
fxy060608 已提交
92
  parseBlock(el, parent)
fxy060608's avatar
fxy060608 已提交
93
  parseEvent(el)
fxy060608's avatar
init v3  
fxy060608 已提交
94

fxy060608's avatar
fxy060608 已提交
95
  updateForEleId(el, state)
fxy060608's avatar
fxy060608 已提交
96
  updateScopedSlotEleId(el, state)
97

fxy060608's avatar
fxy060608 已提交
98
  if (el.type === 2) {
fxy060608's avatar
fxy060608 已提交
99 100 101 102
    let pid = parent.attrsMap[ID]
    if (isScopedSlot && String(pid).indexOf('_si') === -1) {
      pid = getNewId(pid, '_si')
    }
fxy060608's avatar
fxy060608 已提交
103 104 105 106
    return parseText(el, parent, {
      index: 0,
      service: true,
      // <uni-popup>{{content}}</uni-popup>
fxy060608's avatar
fxy060608 已提交
107
      genVar: createGenVar(pid, isScopedSlot)
fxy060608's avatar
fxy060608 已提交
108
    })
fxy060608's avatar
fxy060608 已提交
109 110
  }

fxy060608's avatar
fxy060608 已提交
111
  const genVar = createGenVar(el.attrsMap[ID], isScopedSlot)
fxy060608's avatar
fxy060608 已提交
112

fxy060608's avatar
fxy060608 已提交
113
  parseIs(el, genVar)
fxy060608's avatar
fxy060608 已提交
114
  parseFor(el, createGenVar, isScopedSlot)
fxy060608's avatar
fxy060608 已提交
115
  parseKey(el, isScopedSlot)
fxy060608's avatar
init v3  
fxy060608 已提交
116

fxy060608's avatar
fxy060608 已提交
117
  parseIf(el, createGenVar, isScopedSlot)
fxy060608's avatar
fxy060608 已提交
118
  parseBinding(el, genVar)
fxy060608's avatar
fxy060608 已提交
119
  parseDirs(el, genVar, ['model'])
fxy060608's avatar
init v3  
fxy060608 已提交
120

fxy060608's avatar
fxy060608 已提交
121 122 123 124
  parseWxsProps(el, {
    isAppService: true
  })

fxy060608's avatar
fxy060608 已提交
125 126
  if (!isComponent(el.tag)) {
    parseAttrs(el, genVar)
fxy060608's avatar
fxy060608 已提交
127 128
  } else { // 目前的方案需要同步dataset
    parseComponentAttrs(el, genVar)
fxy060608's avatar
fxy060608 已提交
129
  }
fxy060608's avatar
init v3  
fxy060608 已提交
130

fxy060608's avatar
fxy060608 已提交
131
  parseProps(el, genVar)
fxy060608's avatar
fxy060608 已提交
132 133 134 135 136

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

fxy060608's avatar
fxy060608 已提交
139
function postTransformNode (el, options) {
fxy060608's avatar
fxy060608 已提交
140 141 142
  if (!el.parent) { // 从根节点开始递归处理
    traverseNode(el, false, {
      forIteratorId: 0,
fxy060608's avatar
fxy060608 已提交
143 144
      transformNode,
      filterModules: options.filterModules
fxy060608's avatar
fxy060608 已提交
145
    })
fxy060608's avatar
fxy060608 已提交
146
    optimize(el, options)
fxy060608's avatar
fxy060608 已提交
147 148
  }
}
fxy060608's avatar
fxy060608 已提交
149

fxy060608's avatar
fxy060608 已提交
150
function genVModel (el, isScopedSlot) {
fxy060608's avatar
fxy060608 已提交
151 152 153 154 155 156
  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')
fxy060608's avatar
fxy060608 已提交
157
    prop.value = createGenVar(el.attrsMap[ID], isScopedSlot)('v-model', prop.value)
fxy060608's avatar
fxy060608 已提交
158
  }
fxy060608's avatar
fxy060608 已提交
159
  if (el.model) {
fxy060608's avatar
fxy060608 已提交
160
    el.model.value = createGenVar(el.attrsMap[ID], isScopedSlot)('v-model', el.model.value)
fxy060608's avatar
fxy060608 已提交
161 162 163 164 165 166
  }
}

function genData (el) {
  delete el.$parentIterator3

fxy060608's avatar
fxy060608 已提交
167
  genVModel(el)
fxy060608's avatar
fxy060608 已提交
168 169 170 171

  return ''
}

fxy060608's avatar
init v3  
fxy060608 已提交
172
module.exports = {
fxy060608's avatar
fxy060608 已提交
173
  preTransformNode,
fxy060608's avatar
init v3  
fxy060608 已提交
174 175
  postTransformNode,
  genData
fxy060608's avatar
fxy060608 已提交
176
}