@tarojs/router 3.3.13 → 3.3.17
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/dist/index.js +297 -192
- package/dist/index.js.map +1 -1
- package/dist/router.esm.js +287 -192
- package/dist/router.esm.js.map +1 -1
- package/package.json +3 -3
- package/types/index.d.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var runtime = require('@tarojs/runtime');
|
|
6
|
+
var taro = require('@tarojs/taro');
|
|
6
7
|
|
|
7
8
|
function _extends() {
|
|
8
9
|
_extends = Object.assign || function (target) {
|
|
@@ -56,39 +57,116 @@ function prependBasename(url) {
|
|
|
56
57
|
if ( url === void 0 ) url = '';
|
|
57
58
|
|
|
58
59
|
return basename.replace(/\/$/, '') + '/' + url.replace(/^\//, '');
|
|
59
|
-
}
|
|
60
|
+
}
|
|
61
|
+
var hasBasename = function (path, prefix) { return new RegExp('^' + prefix + '(\\/|\\?|#|$)', 'i').test(path); };
|
|
62
|
+
var stripBasename = function (path, prefix) { return hasBasename(path, prefix) ? path.substr(prefix.length) : path; };
|
|
60
63
|
|
|
61
|
-
var
|
|
64
|
+
var Stacks = function Stacks() {
|
|
65
|
+
this.stacks = [];
|
|
66
|
+
this.backDelta = 0;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
var prototypeAccessors = { delta: { configurable: true },length: { configurable: true },last: { configurable: true } };
|
|
70
|
+
prototypeAccessors.delta.set = function (delta) {
|
|
71
|
+
if (delta > 0) {
|
|
72
|
+
this.backDelta = delta;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
--this.backDelta;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
prototypeAccessors.length.get = function () {
|
|
79
|
+
return this.stacks.length;
|
|
80
|
+
};
|
|
81
|
+
prototypeAccessors.last.get = function () {
|
|
82
|
+
return this.stacks[this.length - 1];
|
|
83
|
+
};
|
|
84
|
+
Stacks.prototype.get = function get () {
|
|
85
|
+
return this.stacks;
|
|
86
|
+
};
|
|
87
|
+
Stacks.prototype.getItem = function getItem (index) {
|
|
88
|
+
return this.stacks[index];
|
|
89
|
+
};
|
|
90
|
+
Stacks.prototype.getLastIndex = function getLastIndex (pathname) {
|
|
91
|
+
var list = [].concat( this.stacks ).reverse();
|
|
92
|
+
return list.findIndex(function (page, i) { var _a; return i !== 0 && ((_a = page.path) === null || _a === void 0 ? void 0 : _a.replace(/\?.*/g, '')) === pathname; });
|
|
93
|
+
};
|
|
94
|
+
Stacks.prototype.getDelta = function getDelta (pathname) {
|
|
95
|
+
if (this.backDelta >= 1) {
|
|
96
|
+
return this.backDelta;
|
|
97
|
+
}
|
|
98
|
+
// NOTE: 此处为了修复浏览器后退多级页面,在大量重复路由状况下可能出现判断错误的情况 (增强判断能力只能考虑在 query 中新增参数来判断,暂时搁置)
|
|
99
|
+
return this.getLastIndex(pathname) || 1;
|
|
100
|
+
};
|
|
101
|
+
Stacks.prototype.getPrevIndex = function getPrevIndex (pathname) {
|
|
102
|
+
var lastIndex = this.getLastIndex(pathname);
|
|
103
|
+
if (lastIndex < 0) {
|
|
104
|
+
return -1;
|
|
105
|
+
}
|
|
106
|
+
return this.length - 1 - lastIndex;
|
|
107
|
+
};
|
|
108
|
+
Stacks.prototype.pop = function pop () {
|
|
109
|
+
return this.stacks.pop();
|
|
110
|
+
};
|
|
111
|
+
Stacks.prototype.push = function push (page) {
|
|
112
|
+
return this.stacks.push(page);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
Object.defineProperties( Stacks.prototype, prototypeAccessors );
|
|
116
|
+
var stacks = new Stacks();
|
|
62
117
|
|
|
63
|
-
var routesAlias = {};
|
|
64
|
-
function setRoutesAlias(alias) {
|
|
65
|
-
routesAlias = alias;
|
|
66
|
-
}
|
|
67
118
|
function addLeadingSlash(path) {
|
|
68
119
|
if (path == null) {
|
|
69
120
|
return '';
|
|
70
121
|
}
|
|
71
122
|
return path.charAt(0) === '/' ? path : '/' + path;
|
|
72
123
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
function
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
var lastTime = 0;
|
|
83
|
-
return function () {
|
|
84
|
-
var now = Date.now();
|
|
85
|
-
if (now - lastTime > threshold) {
|
|
86
|
-
fn.apply(this, arguments);
|
|
87
|
-
lastTime = now;
|
|
88
|
-
}
|
|
124
|
+
var RoutesAlias = function RoutesAlias() {
|
|
125
|
+
var this$1 = this;
|
|
126
|
+
|
|
127
|
+
this.conf = [];
|
|
128
|
+
this.getConfig = function (url) {
|
|
129
|
+
var customRoute = this$1.conf.filter(function (arr) {
|
|
130
|
+
return arr.includes(url);
|
|
131
|
+
});
|
|
132
|
+
return customRoute[0];
|
|
89
133
|
};
|
|
134
|
+
this.getOrigin = function (url) {
|
|
135
|
+
var _a;
|
|
136
|
+
return ((_a = this$1.getConfig(url)) === null || _a === void 0 ? void 0 : _a[0]) || url;
|
|
137
|
+
};
|
|
138
|
+
this.getAlias = function (url) {
|
|
139
|
+
var _a;
|
|
140
|
+
return ((_a = this$1.getConfig(url)) === null || _a === void 0 ? void 0 : _a[1]) || url;
|
|
141
|
+
};
|
|
142
|
+
this.getAll = function (url) {
|
|
143
|
+
return this$1.conf.filter(function (arr) {
|
|
144
|
+
return arr.includes(url);
|
|
145
|
+
}).reduce(function (p, a) {
|
|
146
|
+
p.push(a[1]);
|
|
147
|
+
return p;
|
|
148
|
+
}, [url]);
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
RoutesAlias.prototype.set = function set (customRoutes) {
|
|
152
|
+
var this$1 = this;
|
|
153
|
+
var ref;
|
|
154
|
+
|
|
155
|
+
if ( customRoutes === void 0 ) customRoutes = {};
|
|
156
|
+
var loop = function ( key ) {
|
|
157
|
+
var path = customRoutes[key];
|
|
158
|
+
key = addLeadingSlash(key);
|
|
159
|
+
if (typeof path === 'string') {
|
|
160
|
+
this$1.conf.push([key, addLeadingSlash(path)]);
|
|
161
|
+
}
|
|
162
|
+
else if ((path === null || path === void 0 ? void 0 : path.length) > 0) {
|
|
163
|
+
(ref = this$1.conf).push.apply(ref, path.map(function (p) { return [key, addLeadingSlash(p)]; }));
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
for (var key in customRoutes) loop( key );
|
|
90
168
|
};
|
|
91
|
-
var
|
|
169
|
+
var routesAlias = new RoutesAlias();
|
|
92
170
|
var isTabBar = function (config) {
|
|
93
171
|
var _a, _b;
|
|
94
172
|
var ref = config.router;
|
|
@@ -98,20 +176,35 @@ var isTabBar = function (config) {
|
|
|
98
176
|
var routePath = stripBasename(pathname, basename);
|
|
99
177
|
var pagePath = ((_a = Object.entries(customRoutes).find(function (ref) {
|
|
100
178
|
var target = ref[1];
|
|
101
|
-
|
|
102
|
-
|
|
179
|
+
|
|
180
|
+
if (typeof target === 'string') {
|
|
181
|
+
return target === routePath;
|
|
182
|
+
}
|
|
183
|
+
else if ((target === null || target === void 0 ? void 0 : target.length) > 0) {
|
|
184
|
+
return target.includes(routePath);
|
|
185
|
+
}
|
|
186
|
+
return false;
|
|
103
187
|
})) === null || _a === void 0 ? void 0 : _a[0]) || routePath;
|
|
104
188
|
return !!pagePath && (((_b = config.tabBar) === null || _b === void 0 ? void 0 : _b.list) || []).some(function (t) { return t.pagePath === pagePath; });
|
|
105
189
|
};
|
|
106
190
|
|
|
107
191
|
function processNavigateUrl(option) {
|
|
192
|
+
var _a;
|
|
108
193
|
var pathPieces = J(option.url);
|
|
109
194
|
// 处理自定义路由
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
195
|
+
pathPieces.pathname = routesAlias.getAlias(addLeadingSlash(pathPieces.pathname));
|
|
196
|
+
// 处理相对路径
|
|
197
|
+
if ((_a = pathPieces === null || pathPieces === void 0 ? void 0 : pathPieces.pathname) === null || _a === void 0 ? void 0 : _a.includes('./')) {
|
|
198
|
+
var parts = exports.history.location.pathname.split('/');
|
|
199
|
+
parts.pop();
|
|
200
|
+
pathPieces.pathname.split('/').forEach(function (item) {
|
|
201
|
+
if (item === '.') {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
item === '..' ? parts.pop() : parts.push(item);
|
|
205
|
+
});
|
|
206
|
+
pathPieces.pathname = parts.join('/');
|
|
207
|
+
}
|
|
115
208
|
// 处理 basename
|
|
116
209
|
pathPieces.pathname = prependBasename(pathPieces.pathname);
|
|
117
210
|
// hack fix history v5 bug: https://github.com/remix-run/history/issues/814
|
|
@@ -125,9 +218,10 @@ async function navigate(option, method) {
|
|
|
125
218
|
var complete = option.complete;
|
|
126
219
|
var fail = option.fail;
|
|
127
220
|
var unListen = exports.history.listen(function () {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
221
|
+
var res = { errMsg: (method + ": ok") };
|
|
222
|
+
success === null || success === void 0 ? void 0 : success(res);
|
|
223
|
+
complete === null || complete === void 0 ? void 0 : complete(res);
|
|
224
|
+
resolve(res);
|
|
131
225
|
unListen();
|
|
132
226
|
});
|
|
133
227
|
try {
|
|
@@ -137,19 +231,24 @@ async function navigate(option, method) {
|
|
|
137
231
|
if (method === 'navigateTo') {
|
|
138
232
|
exports.history.push(pathPieces, state);
|
|
139
233
|
}
|
|
140
|
-
else if (method === 'redirectTo') {
|
|
234
|
+
else if (method === 'redirectTo' || method === 'switchTab') {
|
|
235
|
+
exports.history.replace(pathPieces, state);
|
|
236
|
+
}
|
|
237
|
+
else if (method === 'reLaunch') {
|
|
238
|
+
stacks.delta = stacks.length;
|
|
141
239
|
exports.history.replace(pathPieces, state);
|
|
142
240
|
}
|
|
143
241
|
}
|
|
144
242
|
else if (method === 'navigateBack') {
|
|
145
|
-
|
|
243
|
+
stacks.delta = option.delta;
|
|
146
244
|
exports.history.go(-option.delta);
|
|
147
245
|
}
|
|
148
246
|
}
|
|
149
247
|
catch (error) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
248
|
+
var res = { errMsg: (method + ": fail " + (error.message || error)) };
|
|
249
|
+
fail === null || fail === void 0 ? void 0 : fail(res);
|
|
250
|
+
complete === null || complete === void 0 ? void 0 : complete(res);
|
|
251
|
+
reject(res);
|
|
153
252
|
}
|
|
154
253
|
});
|
|
155
254
|
}
|
|
@@ -168,15 +267,14 @@ function navigateBack(options) {
|
|
|
168
267
|
return navigate(options, 'navigateBack');
|
|
169
268
|
}
|
|
170
269
|
function switchTab(option) {
|
|
171
|
-
|
|
172
|
-
return redirectTo(option);
|
|
270
|
+
return navigate(option, 'switchTab');
|
|
173
271
|
}
|
|
174
272
|
function reLaunch(option) {
|
|
175
|
-
|
|
176
|
-
return redirectTo(option);
|
|
273
|
+
return navigate(option, 'reLaunch');
|
|
177
274
|
}
|
|
178
275
|
function getCurrentPages() {
|
|
179
|
-
|
|
276
|
+
var pages = stacks.get();
|
|
277
|
+
return pages.map(function (e) { return (Object.assign(Object.assign({}, e), { route: e.path || '' })); });
|
|
180
278
|
}
|
|
181
279
|
|
|
182
280
|
/**
|
|
@@ -822,18 +920,18 @@ var UniversalRouter = function () {
|
|
|
822
920
|
|
|
823
921
|
UniversalRouter.pathToRegexp = pathToRegexp_1;
|
|
824
922
|
|
|
923
|
+
// @ts-nocheck
|
|
825
924
|
function initTabbar(config) {
|
|
826
925
|
if (config.tabBar == null) {
|
|
827
926
|
return;
|
|
828
927
|
}
|
|
829
928
|
// TODO: 找到 tabbar 的类型
|
|
830
929
|
var tabbar = document.createElement('taro-tabbar');
|
|
831
|
-
var homePage = config.pages ? config.pages[0] : '';
|
|
930
|
+
var homePage = config.entryPagePath || (config.pages ? config.pages[0] : '');
|
|
832
931
|
tabbar.conf = config.tabBar;
|
|
833
932
|
tabbar.conf.homePage = exports.history.location.pathname === '/' ? homePage : exports.history.location.pathname;
|
|
834
933
|
var routerConfig = config.router;
|
|
835
934
|
tabbar.conf.mode = routerConfig && routerConfig.mode ? routerConfig.mode : 'hash';
|
|
836
|
-
tabbar.conf.custom = !!routerConfig.customRoutes;
|
|
837
935
|
if (routerConfig.customRoutes) {
|
|
838
936
|
tabbar.conf.custom = true;
|
|
839
937
|
tabbar.conf.customRoutes = routerConfig.customRoutes;
|
|
@@ -848,6 +946,7 @@ function initTabbar(config) {
|
|
|
848
946
|
var container = document.getElementById('container');
|
|
849
947
|
// eslint-disable-next-line no-unused-expressions
|
|
850
948
|
container === null || container === void 0 ? void 0 : container.appendChild(tabbar);
|
|
949
|
+
taro.initTabBarApis(config);
|
|
851
950
|
}
|
|
852
951
|
|
|
853
952
|
var routerConfig = Object.create(null);
|
|
@@ -871,6 +970,58 @@ function init(config) {
|
|
|
871
970
|
initTabbar(config);
|
|
872
971
|
}
|
|
873
972
|
|
|
973
|
+
var pageScrollFn;
|
|
974
|
+
var pageDOM = window;
|
|
975
|
+
function bindPageScroll(page, config) {
|
|
976
|
+
pageDOM.removeEventListener('scroll', pageScrollFn);
|
|
977
|
+
pageDOM = getScrollContainer();
|
|
978
|
+
var distance = config.onReachBottomDistance || 50;
|
|
979
|
+
var isReachBottom = false;
|
|
980
|
+
pageScrollFn = function () {
|
|
981
|
+
page.onPageScroll && page.onPageScroll({
|
|
982
|
+
scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
|
|
983
|
+
});
|
|
984
|
+
if (isReachBottom && getOffset() > distance) {
|
|
985
|
+
isReachBottom = false;
|
|
986
|
+
}
|
|
987
|
+
if (page.onReachBottom &&
|
|
988
|
+
!isReachBottom &&
|
|
989
|
+
getOffset() < distance) {
|
|
990
|
+
isReachBottom = true;
|
|
991
|
+
page.onReachBottom();
|
|
992
|
+
}
|
|
993
|
+
};
|
|
994
|
+
pageDOM.addEventListener('scroll', pageScrollFn, false);
|
|
995
|
+
}
|
|
996
|
+
window.addEventListener('DOMSubtreeModified', function (e) {
|
|
997
|
+
var _a;
|
|
998
|
+
// @ts-ignore
|
|
999
|
+
var className = (_a = e.target) === null || _a === void 0 ? void 0 : _a.className;
|
|
1000
|
+
if (className && /taro-tabbar__/.test(className)) {
|
|
1001
|
+
pageDOM.removeEventListener('scroll', pageScrollFn);
|
|
1002
|
+
pageDOM = getScrollContainer();
|
|
1003
|
+
pageDOM.addEventListener('scroll', pageScrollFn, false);
|
|
1004
|
+
}
|
|
1005
|
+
}, false);
|
|
1006
|
+
function getScrollContainer() {
|
|
1007
|
+
if (document.querySelector('.taro-tabbar__tabbar') === null) {
|
|
1008
|
+
// 没设置tabbar
|
|
1009
|
+
return window;
|
|
1010
|
+
}
|
|
1011
|
+
else {
|
|
1012
|
+
// 有设置tabbar
|
|
1013
|
+
return document.querySelector('.taro-tabbar__panel') || window;
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
function getOffset() {
|
|
1017
|
+
if (pageDOM instanceof Window) {
|
|
1018
|
+
return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
|
|
1019
|
+
}
|
|
1020
|
+
else {
|
|
1021
|
+
return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
|
|
874
1025
|
function createCommonjsModule(fn, module) {
|
|
875
1026
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
876
1027
|
}
|
|
@@ -1427,14 +1578,25 @@ var queryString_5 = queryString.stringifyUrl;
|
|
|
1427
1578
|
var queryString_6 = queryString.pick;
|
|
1428
1579
|
var queryString_7 = queryString.exclude;
|
|
1429
1580
|
|
|
1581
|
+
function getSearch() {
|
|
1582
|
+
var search = '?';
|
|
1583
|
+
if (routerConfig.router.mode === 'hash') {
|
|
1584
|
+
var idx = location.hash.indexOf('?');
|
|
1585
|
+
if (idx > -1) {
|
|
1586
|
+
search = location.hash.slice(idx);
|
|
1587
|
+
}
|
|
1588
|
+
}
|
|
1589
|
+
else {
|
|
1590
|
+
search = location.search;
|
|
1591
|
+
}
|
|
1592
|
+
return search.substr(1);
|
|
1593
|
+
}
|
|
1430
1594
|
var qs = function (stamp) {
|
|
1431
1595
|
if ( stamp === void 0 ) stamp = 0;
|
|
1432
1596
|
|
|
1433
|
-
var search =
|
|
1434
|
-
? location.hash.slice(routerConfig.router.pathname.length + 1)
|
|
1435
|
-
: location.search;
|
|
1597
|
+
var search = getSearch();
|
|
1436
1598
|
var query = search
|
|
1437
|
-
? queryString.parse(search
|
|
1599
|
+
? queryString.parse(search)
|
|
1438
1600
|
: {};
|
|
1439
1601
|
if (stamp) {
|
|
1440
1602
|
query.stamp = stamp.toString();
|
|
@@ -1442,99 +1604,15 @@ var qs = function (stamp) {
|
|
|
1442
1604
|
return query;
|
|
1443
1605
|
};
|
|
1444
1606
|
|
|
1445
|
-
var pageScrollFn;
|
|
1446
|
-
var pageDOM = window;
|
|
1447
|
-
function bindPageScroll(page, config) {
|
|
1448
|
-
pageDOM.removeEventListener('scroll', pageScrollFn);
|
|
1449
|
-
pageDOM = getScrollContainer();
|
|
1450
|
-
var distance = config.onReachBottomDistance || 50;
|
|
1451
|
-
var isReachBottom = false;
|
|
1452
|
-
pageScrollFn = function () {
|
|
1453
|
-
page.onPageScroll && page.onPageScroll({
|
|
1454
|
-
scrollTop: pageDOM instanceof Window ? window.scrollY : pageDOM.scrollTop
|
|
1455
|
-
});
|
|
1456
|
-
if (isReachBottom && getOffset() > distance) {
|
|
1457
|
-
isReachBottom = false;
|
|
1458
|
-
}
|
|
1459
|
-
if (page.onReachBottom &&
|
|
1460
|
-
!isReachBottom &&
|
|
1461
|
-
getOffset() < distance) {
|
|
1462
|
-
isReachBottom = true;
|
|
1463
|
-
page.onReachBottom();
|
|
1464
|
-
}
|
|
1465
|
-
};
|
|
1466
|
-
pageDOM.addEventListener('scroll', pageScrollFn, false);
|
|
1467
|
-
}
|
|
1468
|
-
window.addEventListener('DOMSubtreeModified', function (e) {
|
|
1469
|
-
var _a;
|
|
1470
|
-
// @ts-ignore
|
|
1471
|
-
var className = (_a = e.target) === null || _a === void 0 ? void 0 : _a.className;
|
|
1472
|
-
if (className && /taro-tabbar__/.test(className)) {
|
|
1473
|
-
pageDOM.removeEventListener('scroll', pageScrollFn);
|
|
1474
|
-
pageDOM = getScrollContainer();
|
|
1475
|
-
pageDOM.addEventListener('scroll', pageScrollFn, false);
|
|
1476
|
-
}
|
|
1477
|
-
}, false);
|
|
1478
|
-
function getScrollContainer() {
|
|
1479
|
-
if (document.querySelector('.taro-tabbar__tabbar') === null) {
|
|
1480
|
-
// 没设置tabbar
|
|
1481
|
-
return window;
|
|
1482
|
-
}
|
|
1483
|
-
else {
|
|
1484
|
-
// 有设置tabbar
|
|
1485
|
-
return document.querySelector('.taro-tabbar__panel') || window;
|
|
1486
|
-
}
|
|
1487
|
-
}
|
|
1488
|
-
function getOffset() {
|
|
1489
|
-
if (pageDOM instanceof Window) {
|
|
1490
|
-
return document.documentElement.scrollHeight - window.scrollY - window.innerHeight;
|
|
1491
|
-
}
|
|
1492
|
-
else {
|
|
1493
|
-
return pageDOM.scrollHeight - pageDOM.scrollTop - pageDOM.clientHeight;
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
|
|
1497
1607
|
/* eslint-disable dot-notation */
|
|
1498
|
-
function
|
|
1499
|
-
if (page != null) {
|
|
1500
|
-
page.onHide();
|
|
1501
|
-
var pageEl = document.getElementById(page.path);
|
|
1502
|
-
if (pageEl) {
|
|
1503
|
-
pageEl.style.display = 'none';
|
|
1504
|
-
}
|
|
1505
|
-
}
|
|
1506
|
-
}
|
|
1507
|
-
function showPage(page, pageConfig, stacksIndex) {
|
|
1508
|
-
if ( stacksIndex === void 0 ) stacksIndex = 0;
|
|
1509
|
-
|
|
1510
|
-
if (page != null) {
|
|
1511
|
-
page.onShow();
|
|
1512
|
-
var pageEl = document.getElementById(page.path);
|
|
1513
|
-
if (pageEl) {
|
|
1514
|
-
pageEl.style.display = 'block';
|
|
1515
|
-
}
|
|
1516
|
-
else {
|
|
1517
|
-
page.onLoad(qs(stacksIndex));
|
|
1518
|
-
pageEl = document.getElementById(page.path);
|
|
1519
|
-
pageOnReady(pageEl, page, false);
|
|
1520
|
-
}
|
|
1521
|
-
bindPageScroll(page, pageConfig || {});
|
|
1522
|
-
}
|
|
1523
|
-
}
|
|
1524
|
-
function unloadPage(page) {
|
|
1525
|
-
if (page != null) {
|
|
1526
|
-
stacks.pop();
|
|
1527
|
-
page.onUnload();
|
|
1528
|
-
}
|
|
1529
|
-
}
|
|
1530
|
-
function pageOnReady(pageEl, page, onLoad) {
|
|
1608
|
+
function pageOnReady(page, onLoad) {
|
|
1531
1609
|
if ( onLoad === void 0 ) onLoad = true;
|
|
1532
1610
|
|
|
1533
|
-
var _a;
|
|
1611
|
+
var _a, _b;
|
|
1612
|
+
var pageEl = document.getElementById(page.path);
|
|
1534
1613
|
if (pageEl && !(pageEl === null || pageEl === void 0 ? void 0 : pageEl['__isReady'])) {
|
|
1535
1614
|
var el = pageEl.firstElementChild;
|
|
1536
|
-
|
|
1537
|
-
(_a = el === null || el === void 0 ? void 0 : el['componentOnReady']) === null || _a === void 0 ? void 0 : _a.call(el).then(function () {
|
|
1615
|
+
(_b = (_a = el === null || el === void 0 ? void 0 : el['componentOnReady']) === null || _a === void 0 ? void 0 : _a.call(el)) === null || _b === void 0 ? void 0 : _b.then(function () {
|
|
1538
1616
|
runtime.requestAnimationFrame(function () {
|
|
1539
1617
|
page.onReady();
|
|
1540
1618
|
pageEl['__isReady'] = true;
|
|
@@ -1544,43 +1622,82 @@ function pageOnReady(pageEl, page, onLoad) {
|
|
|
1544
1622
|
}
|
|
1545
1623
|
}
|
|
1546
1624
|
function loadPage(page, pageConfig, stacksIndex) {
|
|
1625
|
+
if ( pageConfig === void 0 ) pageConfig = {};
|
|
1547
1626
|
if ( stacksIndex === void 0 ) stacksIndex = 0;
|
|
1548
1627
|
|
|
1549
|
-
if (page
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1628
|
+
if (!page)
|
|
1629
|
+
{ return; }
|
|
1630
|
+
var pageEl = document.getElementById(page.path);
|
|
1631
|
+
if (pageEl) {
|
|
1632
|
+
pageEl.style.display = 'block';
|
|
1633
|
+
}
|
|
1634
|
+
else {
|
|
1635
|
+
page.onLoad(qs(stacksIndex), function () { return pageOnReady(page, true); });
|
|
1636
|
+
}
|
|
1637
|
+
stacks.push(page);
|
|
1638
|
+
page.onShow();
|
|
1639
|
+
bindPageScroll(page, pageConfig);
|
|
1640
|
+
}
|
|
1641
|
+
function unloadPage(page, delta) {
|
|
1642
|
+
if ( delta === void 0 ) delta = 1;
|
|
1643
|
+
|
|
1644
|
+
if (!page)
|
|
1645
|
+
{ return; }
|
|
1646
|
+
stacks.delta = --delta;
|
|
1647
|
+
stacks.pop();
|
|
1648
|
+
page.onUnload();
|
|
1649
|
+
if (delta >= 1)
|
|
1650
|
+
{ unloadPage(stacks.last, delta); }
|
|
1651
|
+
}
|
|
1652
|
+
function showPage(page, pageConfig, stacksIndex) {
|
|
1653
|
+
if ( pageConfig === void 0 ) pageConfig = {};
|
|
1654
|
+
if ( stacksIndex === void 0 ) stacksIndex = 0;
|
|
1655
|
+
|
|
1656
|
+
if (!page)
|
|
1657
|
+
{ return; }
|
|
1658
|
+
page.onShow();
|
|
1659
|
+
var pageEl = document.getElementById(page.path);
|
|
1660
|
+
if (pageEl) {
|
|
1661
|
+
pageEl.style.display = 'block';
|
|
1662
|
+
}
|
|
1663
|
+
else {
|
|
1664
|
+
page.onLoad(qs(stacksIndex), function () { return pageOnReady(page, false); });
|
|
1563
1665
|
}
|
|
1666
|
+
bindPageScroll(page, pageConfig);
|
|
1564
1667
|
}
|
|
1668
|
+
function hidePage(page) {
|
|
1669
|
+
if (!page)
|
|
1670
|
+
{ return; }
|
|
1671
|
+
// NOTE: 修复多页并发问题,此处可能因为路由跳转过快,执行时页面可能还没有创建成功
|
|
1672
|
+
var pageEl = document.getElementById(page.path);
|
|
1673
|
+
if (pageEl) {
|
|
1674
|
+
pageEl.style.display = 'none';
|
|
1675
|
+
page.onHide();
|
|
1676
|
+
}
|
|
1677
|
+
else {
|
|
1678
|
+
setTimeout(function () { return hidePage(page); }, 0);
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
/* eslint-disable dot-notation */
|
|
1565
1683
|
function createRouter(app, config, framework) {
|
|
1566
1684
|
var _a;
|
|
1567
1685
|
init(config);
|
|
1568
1686
|
var routes = [];
|
|
1569
|
-
var alias = (_a = config.router.customRoutes) !== null && _a !== void 0 ? _a : {};
|
|
1570
1687
|
var runtimeHooks = runtime.container.get(runtime.SERVICE_IDENTIFIER.Hooks);
|
|
1571
|
-
|
|
1688
|
+
routesAlias.set(config.router.customRoutes);
|
|
1572
1689
|
for (var i = 0; i < config.routes.length; i++) {
|
|
1573
1690
|
var route = config.routes[i];
|
|
1574
1691
|
var path = addLeadingSlash(route.path);
|
|
1575
1692
|
routes.push({
|
|
1576
|
-
path:
|
|
1693
|
+
path: routesAlias.getAll(path),
|
|
1577
1694
|
action: route.load
|
|
1578
1695
|
});
|
|
1579
1696
|
}
|
|
1580
1697
|
var basename = config.router.basename;
|
|
1581
1698
|
var router = new UniversalRouter(routes, { baseUrl: basename || '' });
|
|
1582
1699
|
app.onLaunch();
|
|
1583
|
-
var render =
|
|
1700
|
+
var render = async function (ref) {
|
|
1584
1701
|
var location = ref.location;
|
|
1585
1702
|
var action = ref.action;
|
|
1586
1703
|
|
|
@@ -1603,8 +1720,10 @@ function createRouter(app, config, framework) {
|
|
|
1603
1720
|
if (!element)
|
|
1604
1721
|
{ return; }
|
|
1605
1722
|
var pageConfig = config.routes.find(function (r) {
|
|
1723
|
+
var _a;
|
|
1606
1724
|
var path = addLeadingSlash(r.path);
|
|
1607
|
-
|
|
1725
|
+
var urlPath = stripBasename(location.pathname, routerConfig.router.basename);
|
|
1726
|
+
return path === urlPath || ((_a = routesAlias.getConfig(path)) === null || _a === void 0 ? void 0 : _a.includes(urlPath));
|
|
1608
1727
|
});
|
|
1609
1728
|
var enablePullDownRefresh = false;
|
|
1610
1729
|
runtime.eventCenter.trigger('__taroRouterChange', {
|
|
@@ -1616,67 +1735,53 @@ function createRouter(app, config, framework) {
|
|
|
1616
1735
|
document.title = (_b = pageConfig.navigationBarTitleText) !== null && _b !== void 0 ? _b : document.title;
|
|
1617
1736
|
enablePullDownRefresh = pageConfig.enablePullDownRefresh;
|
|
1618
1737
|
}
|
|
1738
|
+
var currentPage = runtime.Current.page;
|
|
1739
|
+
var pathname = location.pathname;
|
|
1619
1740
|
var shouldLoad = false;
|
|
1620
1741
|
if (action === 'POP') {
|
|
1621
|
-
|
|
1622
|
-
var
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
setHistoryBackDelta(1);
|
|
1628
|
-
var prevIndex = stacks.reduceRight(function (p, s, i) {
|
|
1629
|
-
if (p !== 0)
|
|
1630
|
-
{ return p; }
|
|
1631
|
-
else if (s.path === location.pathname + runtime.stringify(qs(i)))
|
|
1632
|
-
{ return i; }
|
|
1633
|
-
else
|
|
1634
|
-
{ return 0; }
|
|
1635
|
-
}, 0);
|
|
1636
|
-
var prev = stacks[prevIndex];
|
|
1637
|
-
if (prev) {
|
|
1638
|
-
showPage(prev, pageConfig, prevIndex);
|
|
1742
|
+
// NOTE: 浏览器事件退后多次时,该事件只会被触发一次
|
|
1743
|
+
var prevIndex = stacks.getPrevIndex(pathname);
|
|
1744
|
+
var delta = stacks.getDelta(pathname);
|
|
1745
|
+
unloadPage(currentPage, delta);
|
|
1746
|
+
if (prevIndex > -1) {
|
|
1747
|
+
showPage(stacks.getItem(prevIndex), pageConfig, prevIndex);
|
|
1639
1748
|
}
|
|
1640
1749
|
else {
|
|
1641
1750
|
shouldLoad = true;
|
|
1642
1751
|
}
|
|
1643
1752
|
}
|
|
1644
1753
|
else if (action === 'PUSH') {
|
|
1645
|
-
hidePage(
|
|
1754
|
+
hidePage(currentPage);
|
|
1646
1755
|
shouldLoad = true;
|
|
1647
1756
|
}
|
|
1648
1757
|
else if (action === 'REPLACE') {
|
|
1649
1758
|
if (isTabBar(config)) {
|
|
1650
|
-
hidePage(
|
|
1651
|
-
var
|
|
1652
|
-
var prevIndex$1 = stacks.findIndex(function (r) {
|
|
1653
|
-
var _a;
|
|
1654
|
-
return ((_a = r.path) === null || _a === void 0 ? void 0 : _a.replace(/\?.*/g, '')) === pathname;
|
|
1655
|
-
});
|
|
1759
|
+
hidePage(currentPage);
|
|
1760
|
+
var prevIndex$1 = stacks.getPrevIndex(pathname);
|
|
1656
1761
|
if (prevIndex$1 > -1) {
|
|
1657
|
-
// tabbar 页且之前出现过,直接复用
|
|
1658
|
-
|
|
1659
|
-
return showPage(prev$1, pageConfig, prevIndex$1);
|
|
1762
|
+
// NOTE: tabbar 页且之前出现过,直接复用
|
|
1763
|
+
return showPage(stacks.getItem(prevIndex$1), pageConfig, prevIndex$1);
|
|
1660
1764
|
}
|
|
1661
1765
|
}
|
|
1662
1766
|
else {
|
|
1663
|
-
|
|
1767
|
+
var delta$1 = stacks.getDelta(pathname);
|
|
1768
|
+
// NOTE: 页面路由记录并不会清空,只是移除掉缓存的 stack 以及页面
|
|
1769
|
+
unloadPage(currentPage, delta$1);
|
|
1664
1770
|
}
|
|
1665
1771
|
shouldLoad = true;
|
|
1666
1772
|
}
|
|
1667
|
-
if (shouldLoad) {
|
|
1773
|
+
if (shouldLoad || stacks.length < 1) {
|
|
1668
1774
|
var el = (_c = element.default) !== null && _c !== void 0 ? _c : element;
|
|
1669
1775
|
var loadConfig = Object.assign({}, pageConfig);
|
|
1776
|
+
var stacksIndex = stacks.length;
|
|
1670
1777
|
delete loadConfig['path'];
|
|
1671
1778
|
delete loadConfig['load'];
|
|
1672
|
-
var
|
|
1673
|
-
|
|
1674
|
-
var page = runtime.createPageConfig(enablePullDownRefresh ? (_d = runtimeHooks.createPullDownComponent) === null || _d === void 0 ? void 0 : _d.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname$1 + runtime.stringify(qs(routerIndex)), {}, loadConfig);
|
|
1675
|
-
loadPage(page, pageConfig, routerIndex);
|
|
1779
|
+
var page = runtime.createPageConfig(enablePullDownRefresh ? (_d = runtimeHooks.createPullDownComponent) === null || _d === void 0 ? void 0 : _d.call(runtimeHooks, el, location.pathname, framework, routerConfig.PullDownRefresh) : el, pathname + runtime.stringify(qs(stacksIndex)), {}, loadConfig);
|
|
1780
|
+
return loadPage(page, pageConfig, stacksIndex);
|
|
1676
1781
|
}
|
|
1677
|
-
}
|
|
1782
|
+
};
|
|
1678
1783
|
if (exports.history.location.pathname === '/') {
|
|
1679
|
-
exports.history.replace(prependBasename(routes[0].path + exports.history.location.search));
|
|
1784
|
+
exports.history.replace(prependBasename((config.entryPagePath || ((_a = routes[0].path) === null || _a === void 0 ? void 0 : _a[0])) + exports.history.location.search));
|
|
1680
1785
|
}
|
|
1681
1786
|
render({ location: exports.history.location, action: r.Push });
|
|
1682
1787
|
app.onShow(qs(stacks.length));
|