@mpxjs/webpack-plugin 2.9.0-beta.1 → 2.9.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/lib/dependencies/CommonJsExtractDependency.js +51 -0
  2. package/lib/extractor.js +1 -0
  3. package/lib/helpers.js +9 -1
  4. package/lib/index.js +103 -21
  5. package/lib/json-compiler/helper.js +20 -7
  6. package/lib/json-compiler/index.js +48 -19
  7. package/lib/loader.js +1 -1
  8. package/lib/native-loader.js +18 -6
  9. package/lib/platform/json/wx/index.js +44 -2
  10. package/lib/platform/run-rules.js +2 -1
  11. package/lib/platform/template/normalize-component-rules.js +2 -0
  12. package/lib/platform/template/wx/component-config/fix-html-tag.js +17 -0
  13. package/lib/platform/template/wx/component-config/index.js +2 -0
  14. package/lib/platform/template/wx/index.js +45 -14
  15. package/lib/runtime/base.styl +9 -6
  16. package/lib/runtime/components/web/filterTag.js +9 -30
  17. package/lib/runtime/components/web/getInnerListeners.js +2 -14
  18. package/lib/runtime/components/web/mpx-keep-alive.vue +8 -17
  19. package/lib/runtime/components/web/mpx-movable-view.vue +28 -9
  20. package/lib/runtime/components/web/mpx-picker-view.vue +1 -1
  21. package/lib/runtime/components/web/mpx-scroll-view.vue +21 -10
  22. package/lib/runtime/components/web/mpx-video.vue +123 -89
  23. package/lib/runtime/components/web/mpx-web-view.vue +119 -81
  24. package/lib/runtime/components/wx/default-page.mpx +27 -0
  25. package/lib/runtime/optionProcessor.js +27 -20
  26. package/lib/style-compiler/index.js +5 -1
  27. package/lib/template-compiler/bind-this.js +248 -48
  28. package/lib/template-compiler/compiler.js +69 -109
  29. package/lib/template-compiler/index.js +16 -1
  30. package/lib/utils/dom-tag-config.js +101 -0
  31. package/lib/utils/make-map.js +12 -0
  32. package/lib/utils/string.js +7 -1
  33. package/lib/utils/ts-loader-watch-run-loader-filter.js +1 -1
  34. package/lib/web/processJSON.js +35 -0
  35. package/lib/web/processMainScript.js +1 -1
  36. package/lib/web/processTemplate.js +18 -35
  37. package/lib/web/script-helper.js +5 -2
  38. package/package.json +4 -4
  39. package/lib/json-compiler/default-page.mpx +0 -3
  40. package/lib/template-compiler/preprocessor.js +0 -29
  41. package/lib/wxss/compile-exports.js +0 -52
  42. package/lib/wxss/createResolver.js +0 -36
  43. package/lib/wxss/css-base.js +0 -79
  44. package/lib/wxss/getLocalIdent.js +0 -25
  45. package/lib/wxss/localsLoader.js +0 -44
  46. package/lib/wxss/processCss.js +0 -274
@@ -3,6 +3,7 @@ const normalizeTest = require('../normalize-test')
3
3
  const changeKey = require('../change-key')
4
4
  const normalize = require('../../../utils/normalize')
5
5
  const { capitalToHyphen } = require('../../../utils/string')
6
+ const { isOriginTag } = require('../../../utils/dom-tag-config')
6
7
 
7
8
  const mpxViewPath = normalize.lib('runtime/components/ali/mpx-view.mpx')
8
9
  const mpxTextPath = normalize.lib('runtime/components/ali/mpx-text.mpx')
@@ -70,6 +71,19 @@ module.exports = function getSpec ({ warn, error }) {
70
71
  return input
71
72
  }
72
73
 
74
+ // 校验输出支付宝 componentGenerics 配置的正确性
75
+ function aliComponentGenericsValidate (input) {
76
+ const componentGenerics = input.componentGenerics
77
+ if (componentGenerics && typeof componentGenerics === 'object') {
78
+ Object.keys(componentGenerics).forEach(key => {
79
+ if (!componentGenerics[key].default) {
80
+ error(`Ali environment componentGenerics need to specify a default custom component! please check the configuration of component ${key}`)
81
+ }
82
+ })
83
+ }
84
+ return input
85
+ }
86
+
73
87
  function fillGlobalComponents (input, { globalComponents }) {
74
88
  if (globalComponents) {
75
89
  Object.assign(globalComponents, input.usingComponents)
@@ -112,10 +126,30 @@ module.exports = function getSpec ({ warn, error }) {
112
126
  }
113
127
  }
114
128
 
129
+ /**
130
+ * 将小程序代码中使用的与原生 HTML tag 同名组件进行转化,以解决与原生tag命名冲突问题。
131
+ * @param {string} type usingComponents
132
+ * @returns input
133
+ */
134
+ function webHTMLTagProcesser (type) {
135
+ return function (input) {
136
+ const usingComponents = input[type]
137
+ if (usingComponents) {
138
+ Object.keys(usingComponents).forEach(tag => {
139
+ if (isOriginTag(tag)) {
140
+ usingComponents[`mpx-com-${tag}`] = usingComponents[tag]
141
+ delete usingComponents[tag]
142
+ }
143
+ })
144
+ }
145
+ return input
146
+ }
147
+ }
148
+
115
149
  const componentRules = [
116
150
  {
117
151
  test: 'componentGenerics',
118
- ali: deletePath(true)
152
+ ali: aliComponentGenericsValidate
119
153
  },
120
154
  {
121
155
  test: 'componentPlaceholder',
@@ -124,6 +158,10 @@ module.exports = function getSpec ({ warn, error }) {
124
158
  tt: deletePath(),
125
159
  jd: deletePath()
126
160
  },
161
+ {
162
+ test: 'usingComponents',
163
+ web: webHTMLTagProcesser('usingComponents')
164
+ },
127
165
  {
128
166
  test: 'usingComponents',
129
167
  ali: componentNameCapitalToHyphen('usingComponents'),
@@ -224,7 +262,7 @@ module.exports = function getSpec ({ warn, error }) {
224
262
  }
225
263
 
226
264
  const spec = {
227
- supportedModes: ['ali', 'swan', 'qq', 'tt', 'jd', 'qa', 'dd'],
265
+ supportedModes: ['ali', 'swan', 'qq', 'tt', 'jd', 'qa', 'dd', 'web'],
228
266
  normalizeTest,
229
267
  page: [
230
268
  ...windowRules,
@@ -325,6 +363,10 @@ module.exports = function getSpec ({ warn, error }) {
325
363
  tt: deletePath(),
326
364
  jd: deletePath(true)
327
365
  },
366
+ {
367
+ test: 'usingComponents',
368
+ web: webHTMLTagProcesser('usingComponents')
369
+ },
328
370
  {
329
371
  test: 'usingComponents',
330
372
  ali: componentNameCapitalToHyphen('usingComponents'),
@@ -32,7 +32,8 @@ module.exports = function runRules (rules = [], input, options = {}) {
32
32
  if (result !== undefined) {
33
33
  input = result
34
34
  }
35
- if (!waterfall) break
35
+ // rule 内外 waterfall 均为 false 时跳过
36
+ if (!rule.waterfall && !waterfall) break
36
37
  }
37
38
  }
38
39
  return input
@@ -11,6 +11,8 @@ module.exports = function normalizeComponentRules (cfgs, spec) {
11
11
  if (cfg.test) {
12
12
  result.test = cfg.test
13
13
  }
14
+ // 透传 waterfall 信息
15
+ if (cfg.waterfall) result.waterfall = cfg.waterfall
14
16
  const supportedModes = cfg.supportedModes || spec.supportedModes
15
17
  // 合并component-config中组件的event 与index中公共的event规则
16
18
  const eventRules = (cfg.event || []).concat(spec.event.rules)
@@ -0,0 +1,17 @@
1
+ const { isOriginTag } = require('../../../../utils/dom-tag-config')
2
+
3
+ module.exports = function () {
4
+ return {
5
+ waterfall: true,
6
+ test: (input) => isOriginTag(input),
7
+ // 处理原生tag
8
+ web (tag, data = {}) {
9
+ // @see packages/webpack-plugin/lib/platform/json/wx/index.js webHTMLTagProcesser
10
+ const newTag = `mpx-com-${tag}`
11
+ const usingComponents = data.usingComponents || []
12
+ // 存在同名组件,则返回新tag
13
+ if (usingComponents.includes(newTag)) return newTag
14
+ return tag
15
+ }
16
+ }
17
+ }
@@ -39,6 +39,7 @@ const view = require('./view')
39
39
  const webView = require('./web-view')
40
40
  const wxs = require('./wxs')
41
41
  const component = require('./component')
42
+ const fixHTMLTag = require('./fix-html-tag')
42
43
 
43
44
  module.exports = function getComponentConfigs ({ warn, error }) {
44
45
  /**
@@ -79,6 +80,7 @@ module.exports = function getComponentConfigs ({ warn, error }) {
79
80
 
80
81
  // 转换规则只需以微信为基准配置微信和支付宝的差异部分,比如微信和支付宝都支持但是写法不一致,或者微信支持而支付宝不支持的部分(抛出错误或警告)
81
82
  return [
83
+ fixHTMLTag(),
82
84
  ...Nonsupport({ print }),
83
85
  ad({ print }),
84
86
  view({ print }),
@@ -190,15 +190,7 @@ module.exports = function getSpec ({ warn, error }) {
190
190
  el.isStyleParsed = true
191
191
  el.attrsList.filter(item => this.test.test(item.name)).forEach((item) => {
192
192
  const parsed = parseMustacheWithContext(item.value)
193
- if (item.name === 'style') {
194
- if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
195
- styleBinding.push(parsed.result)
196
- } else {
197
- styleBinding.push(JSON.stringify(item.value))
198
- }
199
- } else if (item.name === 'wx:style') {
200
- styleBinding.push(parsed.result)
201
- }
193
+ styleBinding.push(parsed.result)
202
194
  })
203
195
  return {
204
196
  name: ':style',
@@ -293,18 +285,39 @@ module.exports = function getSpec ({ warn, error }) {
293
285
  },
294
286
  swan ({ name, value }, { eventRules }) {
295
287
  const match = this.test.exec(name)
288
+ const prefix = match[1]
296
289
  const eventName = match[2]
297
- runRules(eventRules, eventName, { mode: 'swan' })
290
+ const modifierStr = match[3] || ''
291
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'swan' })
292
+ const rEventName = runRules(eventRules, eventName, { mode: 'swan' })
293
+ return {
294
+ name: rPrefix + rEventName + modifierStr,
295
+ value
296
+ }
298
297
  },
299
298
  qq ({ name, value }, { eventRules }) {
300
299
  const match = this.test.exec(name)
300
+ const prefix = match[1]
301
301
  const eventName = match[2]
302
- runRules(eventRules, eventName, { mode: 'qq' })
302
+ const modifierStr = match[3] || ''
303
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'qq' })
304
+ const rEventName = runRules(eventRules, eventName, { mode: 'qq' })
305
+ return {
306
+ name: rPrefix + rEventName + modifierStr,
307
+ value
308
+ }
303
309
  },
304
310
  jd ({ name, value }, { eventRules }) {
305
311
  const match = this.test.exec(name)
312
+ const prefix = match[1]
306
313
  const eventName = match[2]
307
- runRules(eventRules, eventName, { mode: 'jd' })
314
+ const modifierStr = match[3] || ''
315
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'jd' })
316
+ const rEventName = runRules(eventRules, eventName, { mode: 'jd' })
317
+ return {
318
+ name: rPrefix + rEventName + modifierStr,
319
+ value
320
+ }
308
321
  },
309
322
  // tt ({ name, value }, { eventRules }) {
310
323
  // const match = this.test.exec(name)
@@ -320,15 +333,33 @@ module.exports = function getSpec ({ warn, error }) {
320
333
  // },
321
334
  tt ({ name, value }, { eventRules }) {
322
335
  const match = this.test.exec(name)
336
+ const prefix = match[1]
323
337
  const eventName = match[2]
324
- runRules(eventRules, eventName, { mode: 'tt' })
338
+ const modifierStr = match[3] || ''
339
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'tt' })
340
+ const rEventName = runRules(eventRules, eventName, { mode: 'tt' })
341
+ return {
342
+ name: rPrefix + rEventName + modifierStr,
343
+ value
344
+ }
325
345
  },
326
346
  dd ({ name, value }, { eventRules }) {
327
347
  const match = this.test.exec(name)
348
+ const prefix = match[1]
328
349
  const eventName = match[2]
329
- runRules(eventRules, eventName, { mode: 'dd' })
350
+ const modifierStr = match[3] || ''
351
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'dd' })
352
+ const rEventName = runRules(eventRules, eventName, { mode: 'dd' })
353
+ return {
354
+ name: rPrefix + rEventName + modifierStr,
355
+ value
356
+ }
330
357
  },
331
358
  web ({ name, value }, { eventRules, el }) {
359
+ if (parseMustacheWithContext(value).hasBinding) {
360
+ error('Web environment does not support mustache binding in event props!')
361
+ return
362
+ }
332
363
  const match = this.test.exec(name)
333
364
  const prefix = match[1]
334
365
  const eventName = match[2]
@@ -48,11 +48,19 @@ span {
48
48
  white-space: pre-line;
49
49
  }
50
50
 
51
- html, body, .app {
51
+ html, body, #app {
52
+ display: block;
52
53
  width: 100%;
53
54
  height: 100%;
54
55
  }
55
56
 
57
+ page {
58
+ display: block;
59
+ width: 100%;
60
+ height: 100%;
61
+ background-color: #fff;
62
+ }
63
+
56
64
  .pull-down-loading {
57
65
  position: absolute;
58
66
  width: 100%;
@@ -120,8 +128,3 @@ html, body, .app {
120
128
  font-family "weui"
121
129
  src url('data:application/octet-stream;base64,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') format('truetype')
122
130
  }
123
-
124
- .mpx-root-view {
125
- display: inline
126
- line-height: normal
127
- }
@@ -1,3 +1,12 @@
1
+ const {
2
+ isRichTextTag,
3
+ isUnaryTag,
4
+ isSpace,
5
+ isContWidth,
6
+ isContHeight,
7
+ isContConRow
8
+ } = require('../../../utils/dom-tag-config')
9
+
1
10
  // eslint-disable-next-line
2
11
  const attribute = /^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/ // useless escape
3
12
  const ncname = '[a-zA-Z_][\\w\\-\\.]*'
@@ -11,36 +20,6 @@ const comment = /^<!\--/
11
20
  const invalidAttributeRE = /[\s"'<>\/=]/
12
21
  let currentParent
13
22
 
14
- function makeMap (str, expectsLowerCase) {
15
- const map = Object.create(null)
16
- const list = str.split(',')
17
- for (let i = 0; i < list.length; i++) {
18
- map[list[i]] = true
19
- }
20
- return expectsLowerCase
21
- ? val => map[val.toLowerCase()]
22
- : val => map[val]
23
- }
24
-
25
- const isRichTextTag = makeMap(
26
- 'a,abbr,address,article,aside,b,bdi,bdo,big,blockquote,br,caption,' +
27
- 'center,cite,code,col,colgroup,dd,del,div,dl,dt,em,fieldset,' +
28
- 'font,footer,h1,h2,h3,h4,h5,h6,header,hr,i,img,ins,label,legend,' +
29
- 'li,mark,nav,ol,p,pre,q,rt,ruby,s,section,small,span,strong,sub,sup,' +
30
- 'table,tbody,td,tfoot,th,thead,tr,tt,u,ul'
31
- )
32
- const isUnaryTag = makeMap(
33
- 'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
34
- 'link,meta,param,source,track,wbr'
35
- )
36
- const isSpace = makeMap('ensp,emsp,nbsp')
37
-
38
- const isContWidth = makeMap('col,colgroup,img,table,td,th,tr')
39
-
40
- const isContHeight = makeMap('img,td,th,tr')
41
-
42
- const isContConRow = makeMap('td,th,tr')
43
-
44
23
  function makeAttrsMap (attrs) {
45
24
  const map = {}
46
25
  for (let i = 0, l = attrs.length; i < l; i++) {
@@ -143,20 +143,8 @@ export function inheritEvent (type, oe, detail = {}) {
143
143
  }
144
144
 
145
145
  export function getCustomEvent (type, detail = {}, target = null) {
146
- const targetInfo = {}
147
- if (target) {
148
- const targetEl = target.$el || {}
149
- const info = {
150
- id: targetEl.id || '',
151
- dataset: targetEl.dataset || {},
152
- offsetTop: targetEl.offsetTop || 0,
153
- offsetLeft: targetEl.offsetLeft || 0
154
- }
155
- Object.assign(targetInfo, {
156
- target: info,
157
- currentTarget: info
158
- })
159
- }
146
+ const targetEl = (target && target.$el) || null
147
+ const targetInfo = targetEl ? { target: targetEl, currentTarget: targetEl } : {}
160
148
  return {
161
149
  type,
162
150
  detail,
@@ -30,9 +30,7 @@
30
30
  }
31
31
 
32
32
  function getVnodeKey (vnode) {
33
- if (vnode && vnode.componentOptions) {
34
- return vnode.componentOptions.Ctor.cid + (vnode.componentOptions.tag ? ('::' + (vnode.componentOptions.tag)) : '')
35
- }
33
+ return vnode.tag + (vnode.key ? `::${vnode.key}` : '')
36
34
  }
37
35
 
38
36
  export default {
@@ -44,12 +42,13 @@
44
42
  if (!isBrowser) {
45
43
  return vnode || (slot && slot[0])
46
44
  }
47
- const vnodeKey = getVnodeKey(vnode)
48
45
  const router = global.__mpxRouter
49
- if (vnodeKey && router && vnode.data.routerView) {
46
+ if (router) {
47
+ // 存在routeCount的情况下修改vnode.key避免patch时复用旧节点实例
48
+ if (router.currentRoute.query.routeCount) vnode.key = router.currentRoute.query.routeCount
49
+ const vnodeKey = getVnodeKey(vnode)
50
50
  if (router.needCache) {
51
51
  router.needCache.vnode = vnode
52
- router.needCache.vnodeKey = vnodeKey
53
52
  router.needCache = null
54
53
  }
55
54
 
@@ -69,25 +68,17 @@
69
68
 
70
69
  const stack = router.stack
71
70
  if (stack.length) {
72
- // 只要历史栈缓存中存在对应的页面存活实例,就进行复用
71
+ // 只要历史栈缓存中存在对应的页面存活实例且vnodeKey相同,就进行复用
73
72
  for (let i = stack.length; i > 0; i--) {
74
73
  const current = stack[i - 1]
75
- if (current.vnode && current.vnodeKey === vnodeKey && current.vnode.componentInstance) {
74
+ if (current.vnode && getVnodeKey(current.vnode) === vnodeKey && current.vnode.componentInstance) {
76
75
  vnode.componentInstance = current.vnode.componentInstance
77
- // 避免组件实例复用但是vnode.key不一致带来的bad case
78
- vnode.key = current.vnode.key
79
76
  break
80
77
  }
81
78
  }
82
79
  }
83
80
 
84
- if (router.__mpxAction) {
85
- if (router.__mpxAction.type === 'reLaunch') {
86
- // reLaunch时修改新vnode的key, 确保任何情况下都新创建组件实例
87
- vnode.key = (vnode.key || '') + router.__mpxAction.reLaunchCount
88
- }
89
- router.__mpxAction = null
90
- }
81
+ if (router.__mpxAction) router.__mpxAction = null
91
82
  vnode.data.keepAlive = true
92
83
  }
93
84
 
@@ -1,13 +1,13 @@
1
1
  <template>
2
- <div class="mpx-movable-scroll-content" ref="scrollContent">
3
- <div class="mpx-movable-scroll-item">
4
- <slot></slot>
5
- </div>
2
+ <div class="mpx-movable-scroll-content" ref="scrollContent">
3
+ <div class="mpx-movable-scroll-item">
4
+ <slot></slot>
6
5
  </div>
6
+ </div>
7
7
  </template>
8
8
 
9
9
  <script type="text/ecmascript-6">
10
- import {getCustomEvent} from './getInnerListeners'
10
+ import {getCustomEvent, extendEvent} from './getInnerListeners'
11
11
  import BScroll from '@better-scroll/core'
12
12
  import Movable from '@better-scroll/movable'
13
13
  import Zoom from '@better-scroll/zoom'
@@ -121,6 +121,13 @@
121
121
  newVal = 0.5
122
122
  }
123
123
  this.bs.zoomTo(newVal, 'center', 'center')
124
+ },
125
+ disabled (newVal) {
126
+ if (newVal) {
127
+ this.bs && this.bs.disable()
128
+ } else {
129
+ this.bs && this.bs.enable()
130
+ }
124
131
  }
125
132
  },
126
133
  mounted () {
@@ -204,6 +211,14 @@
204
211
  this.bs.movingDirectionY = -1
205
212
  }
206
213
  })
214
+ actionsHandlerHooks.on('start', (e) => {
215
+ extendEvent(e, { detail: Object.assign({}, e.detail) })
216
+ this.$emit('touchstart', e)
217
+ })
218
+ actionsHandlerHooks.on('end', (e) => {
219
+ extendEvent(e, { detail: Object.assign({}, e.detail) })
220
+ this.$emit('touchend', e)
221
+ })
207
222
  actionsHandlerHooks.on('move', ({ deltaX, deltaY, e }) => {
208
223
  if (this.isZooming) {
209
224
  return
@@ -215,7 +230,9 @@
215
230
  this.touchEvent = 'vtouchmove'
216
231
  }
217
232
  }
218
- this.$emit(this.touchEvent, getCustomEvent(this.touchEvent, {}, this))
233
+ extendEvent(e, { detail: Object.assign({}, e.detail), currentTarget: e.target })
234
+ this.$emit(this.touchEvent, e)
235
+ this.$emit('touchmove', e)
219
236
  this.isFirstTouch = false
220
237
  })
221
238
  if (this.inertia) { // movable-view是否带有惯性
@@ -302,7 +319,9 @@
302
319
  }
303
320
  </script>
304
321
  <style lang="stylus" rel="stylesheet/stylus" scoped>
305
- .mpx-movable-scroll-content {
306
- position: absolute
307
- }
322
+ .mpx-movable-scroll-content
323
+ position: absolute
324
+ .mpx-movable-scroll-item
325
+ width: 100%
326
+ height: 100%
308
327
  </style>
@@ -163,7 +163,7 @@
163
163
  height: 100%
164
164
  overflow: hidden
165
165
  text-align: center
166
- font-size: 14px
166
+ font-size: 16px
167
167
  position: relative
168
168
 
169
169
  &.mpx-picker-fade-enter, &.mpx-picker-fade-leave-active
@@ -113,7 +113,7 @@
113
113
  },
114
114
  watch: {
115
115
  scrollIntoView (val) {
116
- this.bs && this.bs.scrollToElement('#' + val, this.scrollWithAnimation ? 200 : 0)
116
+ this.scrollToView(val, this.scrollWithAnimation ? 200 : 0)
117
117
  },
118
118
  _scrollTop (val) {
119
119
  this.bs && this.bs.scrollTo(this.bs.x, -val, this.scrollWithAnimation ? 200 : 0)
@@ -201,9 +201,7 @@
201
201
  leading: true,
202
202
  trailing: false
203
203
  }))
204
- if (this.scrollIntoView) {
205
- this.bs.scrollToElement('#' + this.scrollIntoView)
206
- }
204
+ if (this.scrollIntoView) this.scrollToView(this.scrollIntoView)
207
205
  // 若开启自定义下拉刷新 或 开启 scroll-view 增强特性
208
206
  if (this.refresherEnabled || this.enhanced) {
209
207
  const actionsHandlerHooks = this.bs.scroller.actionsHandler.hooks
@@ -258,12 +256,17 @@
258
256
  }
259
257
  }
260
258
  },
259
+ scrollToView (id, duration = 0) {
260
+ if (!id) return
261
+ id = '#' + id
262
+ if (!document.querySelector(id)) return // 不存在元素时阻断,直接调用better-scroll的方法会报错
263
+ this.bs?.scrollToElement(id, duration)
264
+ },
261
265
  initLayerComputed () {
262
266
  const wrapper = this.$refs.wrapper
263
- const wrapperWidth = wrapper.offsetWidth
264
- const wrapperHeight = wrapper.offsetHeight
265
- this.$refs.innerWrapper.style.width = `${wrapperWidth}px`
266
- this.$refs.innerWrapper.style.height = `${wrapperHeight}px`
267
+ const computedStyle = getComputedStyle(wrapper)
268
+ this.$refs.innerWrapper.style.width = `${computedStyle.clientWidth - parseInt(computedStyle.paddingLeft) - parseInt(computedStyle.paddingRight)}px`
269
+ this.$refs.innerWrapper.style.height = `${computedStyle.clientHeight - parseInt(computedStyle.paddingTop) - parseInt(computedStyle.paddingBottom)}px`
267
270
  const innerWrapper = this.$refs.innerWrapper
268
271
  const childrenArr = Array.from(innerWrapper.children)
269
272
 
@@ -342,7 +345,11 @@
342
345
  class: 'circle circle-c'
343
346
  }),
344
347
  ]
345
- ) : null
348
+ ) : this.$slots.refresher
349
+ ? createElement('div', {
350
+ class: 'mpx-pull-down-slot',
351
+ }, this.$slots.refresher)
352
+ : null
346
353
 
347
354
  const pullDownWrapper = this.refresherEnabled ? createElement('div', {
348
355
  class: 'mpx-pull-down-wrapper',
@@ -376,7 +383,11 @@
376
383
  bottom: 20px
377
384
  left: 50%
378
385
  transform: translateX(-50%)
379
-
386
+ .mpx-pull-down-slot
387
+ position: absolute
388
+ width: 100%
389
+ height: auto
390
+ bottom: 0
380
391
  .mpx-pull-down-content-black
381
392
  .circle
382
393
  display: inline-block;