@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.
- package/lib/dependencies/CommonJsExtractDependency.js +51 -0
- package/lib/extractor.js +1 -0
- package/lib/helpers.js +9 -1
- package/lib/index.js +103 -21
- package/lib/json-compiler/helper.js +20 -7
- package/lib/json-compiler/index.js +48 -19
- package/lib/loader.js +1 -1
- package/lib/native-loader.js +18 -6
- package/lib/platform/json/wx/index.js +44 -2
- package/lib/platform/run-rules.js +2 -1
- package/lib/platform/template/normalize-component-rules.js +2 -0
- package/lib/platform/template/wx/component-config/fix-html-tag.js +17 -0
- package/lib/platform/template/wx/component-config/index.js +2 -0
- package/lib/platform/template/wx/index.js +45 -14
- package/lib/runtime/base.styl +9 -6
- package/lib/runtime/components/web/filterTag.js +9 -30
- package/lib/runtime/components/web/getInnerListeners.js +2 -14
- package/lib/runtime/components/web/mpx-keep-alive.vue +8 -17
- package/lib/runtime/components/web/mpx-movable-view.vue +28 -9
- package/lib/runtime/components/web/mpx-picker-view.vue +1 -1
- package/lib/runtime/components/web/mpx-scroll-view.vue +21 -10
- package/lib/runtime/components/web/mpx-video.vue +123 -89
- package/lib/runtime/components/web/mpx-web-view.vue +119 -81
- package/lib/runtime/components/wx/default-page.mpx +27 -0
- package/lib/runtime/optionProcessor.js +27 -20
- package/lib/style-compiler/index.js +5 -1
- package/lib/template-compiler/bind-this.js +248 -48
- package/lib/template-compiler/compiler.js +69 -109
- package/lib/template-compiler/index.js +16 -1
- package/lib/utils/dom-tag-config.js +101 -0
- package/lib/utils/make-map.js +12 -0
- package/lib/utils/string.js +7 -1
- package/lib/utils/ts-loader-watch-run-loader-filter.js +1 -1
- package/lib/web/processJSON.js +35 -0
- package/lib/web/processMainScript.js +1 -1
- package/lib/web/processTemplate.js +18 -35
- package/lib/web/script-helper.js +5 -2
- package/package.json +4 -4
- package/lib/json-compiler/default-page.mpx +0 -3
- package/lib/template-compiler/preprocessor.js +0 -29
- package/lib/wxss/compile-exports.js +0 -52
- package/lib/wxss/createResolver.js +0 -36
- package/lib/wxss/css-base.js +0 -79
- package/lib/wxss/getLocalIdent.js +0 -25
- package/lib/wxss/localsLoader.js +0 -44
- 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:
|
|
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'),
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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]
|
package/lib/runtime/base.styl
CHANGED
|
@@ -48,11 +48,19 @@ span {
|
|
|
48
48
|
white-space: pre-line;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
html, body,
|
|
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
|
|
147
|
-
|
|
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
|
-
|
|
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 (
|
|
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.
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
322
|
+
.mpx-movable-scroll-content
|
|
323
|
+
position: absolute
|
|
324
|
+
.mpx-movable-scroll-item
|
|
325
|
+
width: 100%
|
|
326
|
+
height: 100%
|
|
308
327
|
</style>
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
},
|
|
114
114
|
watch: {
|
|
115
115
|
scrollIntoView (val) {
|
|
116
|
-
this.
|
|
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
|
|
264
|
-
|
|
265
|
-
this.$refs.innerWrapper.style.
|
|
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
|
-
) :
|
|
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;
|