@mpxjs/webpack-plugin 2.8.39 → 2.8.40-test

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 (51) hide show
  1. package/lib/dependencies/CommonJsExtractDependency.js +51 -0
  2. package/lib/dependencies/ResolveDependency.js +11 -9
  3. package/lib/extractor.js +1 -0
  4. package/lib/helpers.js +9 -1
  5. package/lib/index.js +173 -72
  6. package/lib/json-compiler/helper.js +25 -9
  7. package/lib/json-compiler/index.js +77 -28
  8. package/lib/loader.js +3 -10
  9. package/lib/native-loader.js +21 -14
  10. package/lib/platform/json/wx/index.js +65 -2
  11. package/lib/platform/run-rules.js +2 -1
  12. package/lib/platform/template/normalize-component-rules.js +2 -0
  13. package/lib/platform/template/wx/component-config/README.md +1 -1
  14. package/lib/platform/template/wx/component-config/fix-html-tag.js +17 -0
  15. package/lib/platform/template/wx/component-config/hypen-tag-name.js +2 -6
  16. package/lib/platform/template/wx/component-config/index.js +4 -2
  17. package/lib/platform/template/wx/component-config/view.js +0 -11
  18. package/lib/platform/template/wx/index.js +65 -18
  19. package/lib/runtime/base.styl +0 -5
  20. package/lib/runtime/components/web/filterTag.js +9 -30
  21. package/lib/runtime/components/web/getInnerListeners.js +2 -14
  22. package/lib/runtime/components/web/mpx-keep-alive.vue +10 -17
  23. package/lib/runtime/components/web/mpx-movable-view.vue +105 -23
  24. package/lib/runtime/components/web/mpx-picker-view.vue +1 -1
  25. package/lib/runtime/components/web/mpx-scroll-view.vue +69 -23
  26. package/lib/runtime/components/web/mpx-swiper.vue +152 -62
  27. package/lib/runtime/components/web/mpx-video.vue +123 -89
  28. package/lib/runtime/components/web/mpx-web-view.vue +120 -81
  29. package/lib/runtime/components/web/promisify.js +19 -0
  30. package/lib/runtime/components/wx/default-page.mpx +27 -0
  31. package/lib/runtime/optionProcessor.js +12 -18
  32. package/lib/style-compiler/index.js +5 -1
  33. package/lib/template-compiler/bind-this.js +280 -49
  34. package/lib/template-compiler/compiler.js +54 -58
  35. package/lib/template-compiler/index.js +35 -23
  36. package/lib/utils/dom-tag-config.js +115 -0
  37. package/lib/utils/make-map.js +12 -0
  38. package/lib/utils/string.js +7 -1
  39. package/lib/utils/ts-loader-watch-run-loader-filter.js +4 -5
  40. package/lib/web/processJSON.js +35 -0
  41. package/lib/web/processScript.js +7 -4
  42. package/lib/web/processTemplate.js +7 -34
  43. package/package.json +4 -4
  44. package/lib/partial-compile/index.js +0 -35
  45. package/lib/template-compiler/preprocessor.js +0 -29
  46. package/lib/wxss/compile-exports.js +0 -52
  47. package/lib/wxss/createResolver.js +0 -36
  48. package/lib/wxss/css-base.js +0 -79
  49. package/lib/wxss/getLocalIdent.js +0 -25
  50. package/lib/wxss/localsLoader.js +0 -44
  51. package/lib/wxss/processCss.js +0 -274
@@ -190,17 +190,10 @@ module.exports = function getSpec ({ warn, error }) {
190
190
  }
191
191
  const styleBinding = []
192
192
  el.isStyleParsed = true
193
- el.attrsList.forEach((item) => {
193
+ // 不过滤的话每一个属性都要 parse
194
+ el.attrsList.filter(item => this.test.test(item.name)).forEach((item) => {
194
195
  const parsed = parseMustache(item.value)
195
- if (item.name === 'style') {
196
- if (parsed.hasBinding || parsed.result.indexOf('rpx') > -1) {
197
- styleBinding.push(parseMustache(item.value).result)
198
- } else {
199
- styleBinding.push(JSON.stringify(item.value))
200
- }
201
- } else if (item.name === 'wx:style') {
202
- styleBinding.push(parseMustache(item.value).result)
203
- }
196
+ styleBinding.push(parsed.result)
204
197
  })
205
198
  return {
206
199
  name: ':style',
@@ -295,18 +288,39 @@ module.exports = function getSpec ({ warn, error }) {
295
288
  },
296
289
  swan ({ name, value }, { eventRules }) {
297
290
  const match = this.test.exec(name)
291
+ const prefix = match[1]
298
292
  const eventName = match[2]
299
- runRules(eventRules, eventName, { mode: 'swan' })
293
+ const modifierStr = match[3] || ''
294
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'swan' })
295
+ const rEventName = runRules(eventRules, eventName, { mode: 'swan' })
296
+ return {
297
+ name: rPrefix + rEventName + modifierStr,
298
+ value
299
+ }
300
300
  },
301
301
  qq ({ name, value }, { eventRules }) {
302
302
  const match = this.test.exec(name)
303
+ const prefix = match[1]
303
304
  const eventName = match[2]
304
- runRules(eventRules, eventName, { mode: 'qq' })
305
+ const modifierStr = match[3] || ''
306
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'qq' })
307
+ const rEventName = runRules(eventRules, eventName, { mode: 'qq' })
308
+ return {
309
+ name: rPrefix + rEventName + modifierStr,
310
+ value
311
+ }
305
312
  },
306
313
  jd ({ name, value }, { eventRules }) {
307
314
  const match = this.test.exec(name)
315
+ const prefix = match[1]
308
316
  const eventName = match[2]
309
- runRules(eventRules, eventName, { mode: 'jd' })
317
+ const modifierStr = match[3] || ''
318
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'jd' })
319
+ const rEventName = runRules(eventRules, eventName, { mode: 'jd' })
320
+ return {
321
+ name: rPrefix + rEventName + modifierStr,
322
+ value
323
+ }
310
324
  },
311
325
  // tt ({ name, value }, { eventRules }) {
312
326
  // const match = this.test.exec(name)
@@ -322,15 +336,33 @@ module.exports = function getSpec ({ warn, error }) {
322
336
  // },
323
337
  tt ({ name, value }, { eventRules }) {
324
338
  const match = this.test.exec(name)
339
+ const prefix = match[1]
325
340
  const eventName = match[2]
326
- runRules(eventRules, eventName, { mode: 'tt' })
341
+ const modifierStr = match[3] || ''
342
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'tt' })
343
+ const rEventName = runRules(eventRules, eventName, { mode: 'tt' })
344
+ return {
345
+ name: rPrefix + rEventName + modifierStr,
346
+ value
347
+ }
327
348
  },
328
349
  dd ({ name, value }, { eventRules }) {
329
350
  const match = this.test.exec(name)
351
+ const prefix = match[1]
330
352
  const eventName = match[2]
331
- runRules(eventRules, eventName, { mode: 'dd' })
353
+ const modifierStr = match[3] || ''
354
+ const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'dd' })
355
+ const rEventName = runRules(eventRules, eventName, { mode: 'dd' })
356
+ return {
357
+ name: rPrefix + rEventName + modifierStr,
358
+ value
359
+ }
332
360
  },
333
- web ({ name, value }, { eventRules, el }) {
361
+ web ({ name, value }, { eventRules, el, usingComponents }) {
362
+ if (parseMustache(value).hasBinding) {
363
+ error('Web environment does not support mustache binding in event props!')
364
+ return
365
+ }
334
366
  const match = this.test.exec(name)
335
367
  const prefix = match[1]
336
368
  const eventName = match[2]
@@ -338,10 +370,11 @@ module.exports = function getSpec ({ warn, error }) {
338
370
  const meta = {
339
371
  modifierStr
340
372
  }
373
+ const isComponent = usingComponents.indexOf(el.tag) !== -1 || el.tag === 'component'
341
374
  // 记录event监听信息用于后续判断是否需要使用内置基础组件
342
375
  el.hasEvent = true
343
376
  const rPrefix = runRules(spec.event.prefix, prefix, { mode: 'web', meta })
344
- const rEventName = runRules(eventRules, eventName, { mode: 'web' })
377
+ const rEventName = runRules(eventRules, eventName, { mode: 'web', data: { isComponent } })
345
378
  return {
346
379
  name: rPrefix + rEventName + meta.modifierStr,
347
380
  value
@@ -411,7 +444,11 @@ module.exports = function getSpec ({ warn, error }) {
411
444
  touchcancel: 'touchCancel',
412
445
  tap: 'tap',
413
446
  longtap: 'longTap',
414
- longpress: 'longTap'
447
+ longpress: 'longTap',
448
+ transitionend: 'transitionEnd',
449
+ animationstart: 'animationStart',
450
+ animationiteration: 'animationIteration',
451
+ animationend: 'animationEnd'
415
452
  }
416
453
  if (eventMap[eventName]) {
417
454
  return eventMap[eventName]
@@ -424,6 +461,16 @@ module.exports = function getSpec ({ warn, error }) {
424
461
  error(`Web environment does not support [${eventName}] event!`)
425
462
  }
426
463
  }
464
+ },
465
+ // 特殊web事件
466
+ {
467
+ test: /^click$/,
468
+ web (eventName, data) {
469
+ // 自定义组件根节点
470
+ if (data.isComponent) {
471
+ return '_' + eventName
472
+ }
473
+ }
427
474
  }
428
475
  ]
429
476
  }
@@ -120,8 +120,3 @@ html, body, .app {
120
120
  font-family "weui"
121
121
  src url('data:application/octet-stream;base64,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') format('truetype')
122
122
  }
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++) {
@@ -144,20 +144,8 @@ export function inheritEvent (type, oe, detail = {}) {
144
144
  }
145
145
 
146
146
  export function getCustomEvent (type, detail = {}, target = null) {
147
- const targetInfo = {}
148
- if (target) {
149
- const targetEl = target.$el || {}
150
- const info = {
151
- id: targetEl.id || '',
152
- dataset: targetEl.dataset || {},
153
- offsetTop: targetEl.offsetTop || 0,
154
- offsetLeft: targetEl.offsetLeft || 0
155
- }
156
- Object.assign(targetInfo, {
157
- target: info,
158
- currentTarget: info
159
- })
160
- }
147
+ const targetEl = (target && target.$el) || null
148
+ const targetInfo = targetEl ? { target: targetEl, currentTarget: targetEl } : {}
161
149
  return {
162
150
  type,
163
151
  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
 
@@ -65,29 +64,23 @@
65
64
  removeItem.vnode.componentInstance.$destroy()
66
65
  }
67
66
  })
67
+ // 在执行完destroy后再同步lastStack信息,让用户在destroy钩子中还能够访问到销毁之前的页面栈,与小程序保持一致
68
+ router.lastStack = router.stack.slice()
68
69
  router.needRemove.length = 0
69
70
 
70
71
  const stack = router.stack
71
72
  if (stack.length) {
72
- // 只要历史栈缓存中存在对应的页面存活实例,就进行复用
73
+ // 只要历史栈缓存中存在对应的页面存活实例且vnodeKey相同,就进行复用
73
74
  for (let i = stack.length; i > 0; i--) {
74
75
  const current = stack[i - 1]
75
- if (current.vnode && current.vnodeKey === vnodeKey && current.vnode.componentInstance) {
76
+ if (current.vnode && getVnodeKey(current.vnode) === vnodeKey && current.vnode.componentInstance) {
76
77
  vnode.componentInstance = current.vnode.componentInstance
77
- // 避免组件实例复用但是vnode.key不一致带来的bad case
78
- vnode.key = current.vnode.key
79
78
  break
80
79
  }
81
80
  }
82
81
  }
83
82
 
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
- }
83
+ if (router.__mpxAction) router.__mpxAction = null
91
84
  vnode.data.keepAlive = true
92
85
  }
93
86
 
@@ -1,19 +1,21 @@
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
+ import ObserveDOM from '@better-scroll/observe-dom'
13
14
  import Zoom from '@better-scroll/zoom'
14
15
 
15
16
  BScroll.use(Movable)
16
17
  BScroll.use(Zoom)
18
+ BScroll.use(ObserveDOM)
17
19
 
18
20
  export default {
19
21
  data () {
@@ -23,6 +25,8 @@
23
25
  maxScrollX: 0,
24
26
  minScrollY: 0,
25
27
  maxScrollY: 0,
28
+ currentX: this.x,
29
+ currentY: this.y,
26
30
  lastestX: 0,
27
31
  lastestY: 0,
28
32
  lastestScale: 1,
@@ -30,7 +34,10 @@
30
34
  isZooming: false,
31
35
  isFirstTouch: true,
32
36
  source: '',
33
- touchEvent: ''
37
+ touchEvent: '',
38
+ isInited: false,
39
+ deactivatedX: 0,
40
+ deactivatedY: 0
34
41
  }
35
42
  },
36
43
  props: {
@@ -89,7 +96,13 @@
89
96
  speed: {
90
97
  type: Number,
91
98
  default: 1000
92
- }
99
+ },
100
+ scrollOptions: {
101
+ type: Object,
102
+ default: () => {
103
+ return {}
104
+ }
105
+ },
93
106
  },
94
107
  watch: {
95
108
  x (newVal) {
@@ -100,6 +113,7 @@
100
113
  if (newVal < this.bs.maxScrollX) {
101
114
  newVal = this.bs.maxScrollX
102
115
  }
116
+ this.currentX = newVal
103
117
  this.bs.scrollTo(newVal, this.bs.y, this.speed)
104
118
  },
105
119
  y (newVal) {
@@ -110,6 +124,7 @@
110
124
  if (newVal < this.bs.maxScrollY) {
111
125
  newVal = this.bs.maxScrollY
112
126
  }
127
+ this.currentY = newVal
113
128
  this.bs.scrollTo(this.bs.x, newVal, this.speed)
114
129
  },
115
130
  scaleValue (newVal) {
@@ -121,16 +136,61 @@
121
136
  newVal = 0.5
122
137
  }
123
138
  this.bs.zoomTo(newVal, 'center', 'center')
139
+ },
140
+ disabled () {
141
+ this.init()
124
142
  }
125
143
  },
126
144
  mounted () {
145
+ if (!this.scrollOptions.closeResizeObserver) {
146
+ this.createResizeObserver()
147
+ }
127
148
  this.init()
128
149
  },
150
+ activated () {
151
+ if (this.deactivatedX || this.deactivatedY) {
152
+ this.refresh()
153
+ this.bs.putAt(this.deactivatedX, this.deactivatedY, 0)
154
+ }
155
+ },
156
+ deactivated () {
157
+ // when the hook is triggered
158
+ // bs will recalculate the boundary of movable to 0
159
+ // so record the position of the movable
160
+ this.deactivatedX = this.bs.x
161
+ this.deactivatedY = this.bs.y
162
+ },
129
163
  beforeDestroy () {
130
- this.bs && this.bs.destroy()
164
+ this.destroyBs()
165
+ if (this.resizeObserver) {
166
+ this.resizeObserver.disconnect()
167
+ this.resizeObserver = null
168
+ }
131
169
  },
132
170
  methods: {
171
+ createResizeObserver () {
172
+ if (typeof ResizeObserver !== 'undefined') {
173
+ this.resizeObserver = new ResizeObserver(entries => {
174
+ if (!this.isInited) {
175
+ this.isInited = true
176
+ return
177
+ }
178
+ this.refresh()
179
+ })
180
+ const elementToObserve = document.querySelector('.mpx-movable-scroll-content')
181
+ this.resizeObserver.observe(elementToObserve)
182
+ }
183
+ },
184
+ refresh () {
185
+ this.bs && this.bs.refresh()
186
+ },
187
+ destroyBs () {
188
+ if (!this.bs) return
189
+ this.bs.destroy()
190
+ delete this.bs
191
+ },
133
192
  init () {
193
+ this.destroyBs()
134
194
  if (!this.$refs.scrollContent.parentNode || (this.$refs.scrollContent.parentNode && this.$refs.scrollContent.parentNode.className !== 'mpx-movable-scroll-wrapper')) {
135
195
  return
136
196
  }
@@ -143,8 +203,8 @@
143
203
  scrollX: false,
144
204
  scrollY: false,
145
205
  movable: true,
146
- startX: this.x,
147
- startY: this.y,
206
+ startX: this.currentX,
207
+ startY: this.currentY,
148
208
  bounce: this.outOfBounds,
149
209
  bounceTime: 800 / (this.damping / 20),
150
210
  probeType: 3,
@@ -153,7 +213,7 @@
153
213
  const BehaviorHooks = this.bs.scroller.scrollBehaviorY.hooks
154
214
  const actionsHandlerHooks = this.bs.scroller.actionsHandler.hooks
155
215
  const scrollerHooks = this.bs.scroller.hooks
156
- this.bs.putAt(this.x, this.y, 0)
216
+ this.bs.putAt(this.currentX, this.currentY, 0)
157
217
  this.lastestX = this.roundFun(this.x)
158
218
  this.lastestY = this.roundFun(this.y)
159
219
  this.lastestScale = this.roundFun(this.scaleValue)
@@ -184,6 +244,10 @@
184
244
  this.lastestX = this.roundFun(position.x)
185
245
  this.lastestY = this.roundFun(position.y)
186
246
  })
247
+ scrollerHooks.on('scrollEnd', (position) =>{
248
+ this.currentX = this.bs.x
249
+ this.currentY = this.bs.y
250
+ })
187
251
  scrollerHooks.on('touchEnd', (position) => {
188
252
  this.isFirstTouch = true
189
253
  if (position.x > this.minScrollX || position.x < this.maxScrollX ||
@@ -204,6 +268,14 @@
204
268
  this.bs.movingDirectionY = -1
205
269
  }
206
270
  })
271
+ actionsHandlerHooks.on('start', (e) => {
272
+ extendEvent(e, { detail: Object.assign({}, e.detail) })
273
+ this.$emit('touchstart', e)
274
+ })
275
+ actionsHandlerHooks.on('end', (e) => {
276
+ extendEvent(e, { detail: Object.assign({}, e.detail) })
277
+ this.$emit('touchend', e)
278
+ })
207
279
  actionsHandlerHooks.on('move', ({ deltaX, deltaY, e }) => {
208
280
  if (this.isZooming) {
209
281
  return
@@ -215,7 +287,9 @@
215
287
  this.touchEvent = 'vtouchmove'
216
288
  }
217
289
  }
218
- this.$emit(this.touchEvent, getCustomEvent(this.touchEvent, {}, this))
290
+ extendEvent(e, { detail: Object.assign({}, e.detail), currentTarget: e.target })
291
+ this.$emit(this.touchEvent, e)
292
+ this.$emit('touchmove', e)
219
293
  this.isFirstTouch = false
220
294
  })
221
295
  if (this.inertia) { // movable-view是否带有惯性
@@ -240,9 +314,6 @@
240
314
  this.isZooming = false
241
315
  })
242
316
  }
243
- if (this.disabled) { // 禁用
244
- this.bs.disable()
245
- }
246
317
  },
247
318
  initOptions () {
248
319
  if (!this.friction || this.friction < 0) {
@@ -273,19 +344,24 @@
273
344
  swipeTime: 50
274
345
  }
275
346
  }
276
- if (this.direction === 'vertical') {
347
+ if (this.disabled) {
348
+ this.bsOptions = {
349
+ ...this.bsOptions,
350
+ freeScroll: false,
351
+ scrollY: false,
352
+ scrollX: false
353
+ }
354
+ } else if (this.direction === 'vertical') {
277
355
  this.bsOptions = {
278
356
  ...this.bsOptions,
279
357
  scrollY: true
280
358
  }
281
- }
282
- if (this.direction === 'horizontal') {
359
+ } else if (this.direction === 'horizontal') {
283
360
  this.bsOptions = {
284
361
  ...this.bsOptions,
285
362
  scrollX: true
286
363
  }
287
- }
288
- if (this.direction === 'all') {
364
+ } else if (this.direction === 'all') {
289
365
  this.bsOptions = {
290
366
  ...this.bsOptions,
291
367
  freeScroll: true,
@@ -293,6 +369,10 @@
293
369
  scrollY: true
294
370
  }
295
371
  }
372
+ this.bsOptions = {
373
+ ...this.bsOptions,
374
+ ...this.scrollOptions
375
+ }
296
376
  },
297
377
  // 处理小数点,四舍五入,默认保留一位小数
298
378
  roundFun(value, n = 1) {
@@ -302,7 +382,9 @@
302
382
  }
303
383
  </script>
304
384
  <style lang="stylus" rel="stylesheet/stylus" scoped>
305
- .mpx-movable-scroll-content {
306
- position: absolute
307
- }
385
+ .mpx-movable-scroll-content
386
+ position: absolute
387
+ .mpx-movable-scroll-item
388
+ width: 100%
389
+ height: 100%
308
390
  </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