@mpxjs/core 2.8.32 → 2.8.36
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/@types/index.d.ts +2 -0
- package/package.json +2 -2
- package/src/core/mergeOptions.js +6 -2
- package/src/core/proxy.js +26 -4
- package/src/observer/effect.js +18 -1
- package/src/observer/scheduler.js +8 -5
- package/src/observer/watch.js +1 -3
package/@types/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mpxjs/core",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.36",
|
|
4
4
|
"description": "mpx runtime core",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"miniprogram",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"url": "https://github.com/didi/mpx/issues"
|
|
48
48
|
},
|
|
49
49
|
"sideEffects": false,
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "f7d1fc9bf1aaf7aff6fe9f2a11288dc5e12f78d6"
|
|
51
51
|
}
|
package/src/core/mergeOptions.js
CHANGED
|
@@ -132,7 +132,9 @@ function extractObservers (options) {
|
|
|
132
132
|
},
|
|
133
133
|
deep: true,
|
|
134
134
|
// 延迟触发首次回调,处理转换支付宝时在observer中查询组件的行为,如vant/picker中,如不考虑该特殊情形可用immediate代替
|
|
135
|
-
immediateAsync: true
|
|
135
|
+
// immediateAsync: true
|
|
136
|
+
// 为了数据响应的标准化,不再提供immediateAsync选项,之前处理vant等原生组件跨平台转换遇到的问题推荐使用条件编译patch进行处理
|
|
137
|
+
immediate: true
|
|
136
138
|
})
|
|
137
139
|
}
|
|
138
140
|
})
|
|
@@ -174,7 +176,9 @@ function extractObservers (options) {
|
|
|
174
176
|
}
|
|
175
177
|
},
|
|
176
178
|
deep,
|
|
177
|
-
immediateAsync: watchProp
|
|
179
|
+
// immediateAsync: watchProp
|
|
180
|
+
// 为了数据响应的标准化,不再提供immediateAsync选项,之前处理vant等原生组件跨平台转换遇到的问题推荐使用条件编译patch进行处理
|
|
181
|
+
immediate: watchProp
|
|
178
182
|
})
|
|
179
183
|
}
|
|
180
184
|
})
|
package/src/core/proxy.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { reactive } from '../observer/reactive'
|
|
2
|
-
import { ReactiveEffect } from '../observer/effect'
|
|
2
|
+
import { ReactiveEffect, pauseTracking, resetTracking } from '../observer/effect'
|
|
3
3
|
import { effectScope } from '../platform/export/index'
|
|
4
4
|
import { watch } from '../observer/watch'
|
|
5
5
|
import { computed } from '../observer/computed'
|
|
6
|
-
import { queueJob, nextTick } from '../observer/scheduler'
|
|
6
|
+
import { queueJob, nextTick, flushPreFlushCbs } from '../observer/scheduler'
|
|
7
7
|
import Mpx from '../index'
|
|
8
8
|
import {
|
|
9
9
|
noop,
|
|
@@ -119,6 +119,7 @@ export default class MpxProxy {
|
|
|
119
119
|
// 下次是否需要强制更新全部渲染数据
|
|
120
120
|
this.forceUpdateAll = false
|
|
121
121
|
this.currentRenderTask = null
|
|
122
|
+
this.propsUpdatedFlag = false
|
|
122
123
|
}
|
|
123
124
|
this.initApi()
|
|
124
125
|
}
|
|
@@ -170,7 +171,9 @@ export default class MpxProxy {
|
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
propsUpdated () {
|
|
174
|
+
this.propsUpdatedFlag = true
|
|
173
175
|
const updateJob = this.updateJob || (this.updateJob = () => {
|
|
176
|
+
this.propsUpdatedFlag = false
|
|
174
177
|
// 只有当前没有渲染任务时,属性更新才需要单独触发updated,否则可以由渲染任务触发updated
|
|
175
178
|
if (this.currentRenderTask?.resolved && this.isMounted()) {
|
|
176
179
|
this.callHook(BEFOREUPDATE)
|
|
@@ -477,6 +480,7 @@ export default class MpxProxy {
|
|
|
477
480
|
return
|
|
478
481
|
}
|
|
479
482
|
|
|
483
|
+
pauseTracking()
|
|
480
484
|
// 使用forceUpdateData后清空
|
|
481
485
|
if (!isEmptyObject(this.forceUpdateData)) {
|
|
482
486
|
data = mergeData({}, data, this.forceUpdateData)
|
|
@@ -504,12 +508,30 @@ export default class MpxProxy {
|
|
|
504
508
|
}
|
|
505
509
|
|
|
506
510
|
this.target.__render(data, callback)
|
|
511
|
+
resetTracking()
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
toggleRecurse (allowed) {
|
|
515
|
+
if (this.effect && this.update) this.effect.allowRecurse = this.update.allowRecurse = allowed
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
updatePreRender () {
|
|
519
|
+
this.toggleRecurse(false)
|
|
520
|
+
pauseTracking()
|
|
521
|
+
flushPreFlushCbs(undefined, this.update)
|
|
522
|
+
resetTracking()
|
|
523
|
+
this.toggleRecurse(true)
|
|
507
524
|
}
|
|
508
525
|
|
|
509
526
|
initRender () {
|
|
510
527
|
if (this.options.__nativeRender__) return this.doRender()
|
|
511
528
|
|
|
512
529
|
const effect = this.effect = new ReactiveEffect(() => {
|
|
530
|
+
// pre render for props update
|
|
531
|
+
if (this.propsUpdatedFlag) {
|
|
532
|
+
this.updatePreRender()
|
|
533
|
+
}
|
|
534
|
+
|
|
513
535
|
if (this.target.__injectedRender) {
|
|
514
536
|
try {
|
|
515
537
|
return this.target.__injectedRender()
|
|
@@ -522,10 +544,10 @@ export default class MpxProxy {
|
|
|
522
544
|
}
|
|
523
545
|
}, () => queueJob(update), this.scope)
|
|
524
546
|
|
|
525
|
-
const update = this.update =
|
|
547
|
+
const update = this.update = effect.run.bind(effect)
|
|
526
548
|
update.id = this.uid
|
|
527
549
|
// render effect允许自触发
|
|
528
|
-
|
|
550
|
+
this.toggleRecurse(true)
|
|
529
551
|
update()
|
|
530
552
|
}
|
|
531
553
|
|
package/src/observer/effect.js
CHANGED
|
@@ -4,6 +4,19 @@ import { PausedState } from '../helper/const'
|
|
|
4
4
|
|
|
5
5
|
let uid = 0
|
|
6
6
|
|
|
7
|
+
let shouldTrack = true
|
|
8
|
+
const trackStack = []
|
|
9
|
+
|
|
10
|
+
export function pauseTracking () {
|
|
11
|
+
trackStack.push(shouldTrack)
|
|
12
|
+
shouldTrack = false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function resetTracking () {
|
|
16
|
+
const last = trackStack.pop()
|
|
17
|
+
shouldTrack = last === undefined ? true : last
|
|
18
|
+
}
|
|
19
|
+
|
|
7
20
|
export class ReactiveEffect {
|
|
8
21
|
active = true
|
|
9
22
|
deps = []
|
|
@@ -27,17 +40,21 @@ export class ReactiveEffect {
|
|
|
27
40
|
// run fn and return value
|
|
28
41
|
run () {
|
|
29
42
|
if (!this.active) return this.fn()
|
|
30
|
-
|
|
43
|
+
const lastShouldTrack = shouldTrack
|
|
31
44
|
try {
|
|
45
|
+
pushTarget(this)
|
|
46
|
+
shouldTrack = true
|
|
32
47
|
return this.fn()
|
|
33
48
|
} finally {
|
|
34
49
|
popTarget()
|
|
50
|
+
shouldTrack = lastShouldTrack
|
|
35
51
|
this.deferStop ? this.stop() : this.cleanupDeps()
|
|
36
52
|
}
|
|
37
53
|
}
|
|
38
54
|
|
|
39
55
|
// add dependency to this
|
|
40
56
|
addDep (dep) {
|
|
57
|
+
if (!shouldTrack) return
|
|
41
58
|
const id = dep.id
|
|
42
59
|
if (!this.newDepIds.has(id)) {
|
|
43
60
|
this.newDepIds.add(id)
|
|
@@ -17,6 +17,7 @@ let postFlushIndex = 0
|
|
|
17
17
|
|
|
18
18
|
const resolvedPromise = Promise.resolve()
|
|
19
19
|
let currentFlushPromise = null
|
|
20
|
+
let currentPreFlushParentJob = null
|
|
20
21
|
|
|
21
22
|
const RECURSION_LIMIT = 100
|
|
22
23
|
|
|
@@ -68,9 +69,9 @@ export function queueJob (job) {
|
|
|
68
69
|
// if the job is a watch() callback, the search will start with a +1 index to
|
|
69
70
|
// allow it recursively trigger itself - it is the user's responsibility to
|
|
70
71
|
// ensure it doesn't end up in an infinite loop.
|
|
71
|
-
if (
|
|
72
|
-
!queue.
|
|
73
|
-
|
|
72
|
+
if ((!queue.length ||
|
|
73
|
+
!queue.includes(job, isFlushing && job.allowRecurse ? flushIndex + 1 : flushIndex)) &&
|
|
74
|
+
job !== currentPreFlushParentJob
|
|
74
75
|
) {
|
|
75
76
|
if (job.id == null) {
|
|
76
77
|
queue.push(job)
|
|
@@ -92,8 +93,9 @@ function queueFlush () {
|
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
export function flushPreFlushCbs (seen) {
|
|
96
|
+
export function flushPreFlushCbs (seen, parentJob = null) {
|
|
96
97
|
if (pendingPreFlushCbs.length) {
|
|
98
|
+
currentPreFlushParentJob = parentJob
|
|
97
99
|
activePreFlushCbs = [...new Set(pendingPreFlushCbs)]
|
|
98
100
|
pendingPreFlushCbs.length = 0
|
|
99
101
|
if (isDev) seen = seen || new Map()
|
|
@@ -107,8 +109,9 @@ export function flushPreFlushCbs (seen) {
|
|
|
107
109
|
}
|
|
108
110
|
activePreFlushCbs = null
|
|
109
111
|
preFlushIndex = 0
|
|
112
|
+
currentPreFlushParentJob = null
|
|
110
113
|
// recursively flush until it drains
|
|
111
|
-
flushPreFlushCbs(seen)
|
|
114
|
+
flushPreFlushCbs(seen, parentJob)
|
|
112
115
|
}
|
|
113
116
|
}
|
|
114
117
|
|
package/src/observer/watch.js
CHANGED
|
@@ -42,7 +42,7 @@ const processWatchOptionsCompat = (options) => {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
export function watch (source, cb, options = {}) {
|
|
45
|
-
let { immediate, deep, flush
|
|
45
|
+
let { immediate, deep, flush } = processWatchOptionsCompat(options)
|
|
46
46
|
const instance = currentInstance
|
|
47
47
|
let getter
|
|
48
48
|
let isMultiSource = false
|
|
@@ -139,8 +139,6 @@ export function watch (source, cb, options = {}) {
|
|
|
139
139
|
if (cb) {
|
|
140
140
|
if (immediate) {
|
|
141
141
|
job()
|
|
142
|
-
} else if (immediateAsync) {
|
|
143
|
-
queuePreFlushCb(job)
|
|
144
142
|
} else {
|
|
145
143
|
oldValue = effect.run()
|
|
146
144
|
}
|