提交 27877d5b 编写于 作者: fxy060608's avatar fxy060608

Merge branch 'dev' of https://github.com/dcloudio/uni-app into alpha

......@@ -12,4 +12,4 @@ MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
function e(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var u=arguments[t],i=0,c=u.length;i<c;i++,o++)n[o]=u[i];return n}var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),r=new Uint8Array(16);function n(){if(!t)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(r)}for(var o=[],u=0;u<256;++u)o[u]=(u+256).toString(16).substr(1);function i(e,t,r){var u=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||n)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var c=0;c<16;++c)t[u+c]=i[c];return t||function(e,t){var r=t||0,n=o;return[n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]]].join("")}(i)}var c=Object.prototype.hasOwnProperty,a=Array.isArray,s=function(e){var t=Object.create(null);return function(r){return t[r]||(t[r]=e(r))}},l=/-(\w)/g,f=s((function(e){return e.replace(l,(function(e,t){return t?t.toUpperCase():""}))})),p=s((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),g=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;function d(e,t){if(a(e))return e;if(t&&(r=t,n=e,c.call(r,n)))return[e];var r,n,o=[];return e.replace(g,(function(e,t,r,n){return o.push(r?n.replace(/\\(\\)?/g,"$1"):t||e),n})),o}function m(e,t){var r,n=d(t,e);for(r=n.shift();null!=r;){if(null==(e=e[r]))return;r=n.shift()}return e}var v=new Map;function h(e){if(!function(e){if(e){var t=e.tagName;return 0===t.indexOf("UNI-")||"BODY"===t}return!1}(e))throw Error("no such element");var t,r,n={elementId:(t=e,r=t._id,r||(r=i(),t._id=r,v.set(r,{id:r,element:t})),r),tagName:e.tagName.toLocaleLowerCase().replace("uni-","")},o=e.__vue__;return o&&!o.$options.isReserved&&(n.nodeId=function(e){if(e._$weex)return e._uid;if(e._$id)return e._$id;var t=function(e){for(var t=e.$parent;t;){if(t._$id)return t;t=t.$parent}}(e);if(!e.$parent)return"-1";var r=e.$vnode,n=r.context;return n&&n!==t&&n._$id?n._$id+";"+t._$id+","+r.data.attrs._i:t._$id+","+r.data.attrs._i}(o)),"video"===n.tagName&&(n.videoId=n.nodeId),n}var _={input:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},textarea:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},"scroll-view":{scrollTo:function(e,t,r){var n=e.__vue__.$refs.main;n.scrollLeft=t,n.scrollTop=r},scrollTop:function(e){return e.__vue__.$refs.main.scrollTop},scrollLeft:function(e){return e.__vue__.$refs.main.scrollLeft},scrollWidth:function(e){return e.__vue__.$refs.main.scrollWidth},scrollHeight:function(e){return e.__vue__.$refs.main.scrollHeight}},swiper:{swipeTo:function(e,t){e.__vue__.current=t}},"movable-view":{moveTo:function(e,t,r){e.__vue__._animationTo(t,r)}},switch:{tap:function(e){e.click()}},slider:{slideTo:function(e,t){var r=e.__vue__,n=r.$refs["uni-slider"],o=n.offsetWidth,u=n.getBoundingClientRect().left;r.value=t,r._onClick({x:(t-r.min)*o/(r.max-r.min)+u})}}},y={getWindow:function(e){return window},getDocument:function(e){return document},getEl:function(e){var t=v.get(e);if(!t)throw Error("element destroyed");return t.element},getOffset:function(e){var t=e.getBoundingClientRect();return Promise.resolve({left:t.left+window.pageXOffset,top:t.top+window.pageYOffset})},querySelector:function(e,t){return Promise.resolve(h(e.querySelector(t)))},querySelectorAll:function(e,t){var r=[];return document.querySelectorAll(t).forEach((function(e){try{r.push(h(e))}catch(e){}})),Promise.resolve({elements:r})},queryProperties:function(e,t){return Promise.resolve({properties:t.map((function(t){var r=m(e,t);return"document.documentElement.scrollTop"===t&&0===r&&(r=m(e,"document.body.scrollTop")),r}))})},queryAttributes:function(e,t){return Promise.resolve({attributes:t.map((function(t){return String(e.getAttribute(t))}))})},queryStyles:function(e,t){var r=getComputedStyle(e);return Promise.resolve({styles:t.map((function(e){return r[e]}))})},queryHTML:function(e,t){return Promise.resolve({html:(r="outer"===t?e.outerHTML:e.innerHTML,r.replace(/\n/g,"").replace(/(<uni-text[^>]*>)(<span[^>]*>[^<]*<\/span>)(.*?<\/uni-text>)/g,"$1$3").replace(/<\/?[^>]*>/g,(function(e){return-1<e.indexOf("<body")?"<page>":"</body>"===e?"</page>":0!==e.indexOf("<uni-")&&0!==e.indexOf("</uni-")?"":e.replace(/uni-/g,"").replace(/ role=""/g,"").replace(/ aria-label=""/g,"")})))});var r},dispatchTapEvent:function(e){return e.click(),Promise.resolve()},dispatchLongpressEvent:function(e){return Promise.resolve()},dispatchTouchEvent:function(e,t,r){r||(r={}),r.touches||(r.touches=[]),r.changedTouches||(r.changedTouches=[]),r.touches.length||r.touches.push({identifier:Date.now(),target:e});var n=r.touches.map((function(e){return new Touch(e)})),o=r.changedTouches.map((function(e){return new Touch(e)}));return e.dispatchEvent(new TouchEvent(t,{cancelable:!0,bubbles:!0,touches:n,targetTouches:[],changedTouches:o})),Promise.resolve()},callFunction:function(t,r,n){var o=m(_,r);return o?Promise.resolve({result:o.apply(null,e([t],n))}):Promise.reject(Error(r+" not exists"))},triggerEvent:function(e,t,r){var n=e.__vue__;return n.$trigger&&n.$trigger(t,{},r),Promise.resolve()}};["movable-view","picker","ad","button","checkbox-group","checkbox","form","icon","label","movable-area","navigator","picker-view-column","picker-view","progress","radio-group","radio","rich-text","u-slider","swiper-item","swiper","switch"].map((function(e){return p(f(e))}));var E=Object.assign({},function(e){return{"Page.getElement":function(t){return e.querySelector(e.getDocument(t.pageId),t.selector)},"Page.getElements":function(t){return e.querySelectorAll(e.getDocument(t.pageId),t.selector)},"Page.getWindowProperties":function(t){return e.queryProperties(e.getWindow(t.pageId),t.names)}}}(y),function(e){var t=function(t){return e.getEl(t.elementId,t.pageId)};return{"Element.getElement":function(r){return e.querySelector(t(r),r.selector)},"Element.getElements":function(r){return e.querySelectorAll(t(r),r.selector)},"Element.getDOMProperties":function(r){return e.queryProperties(t(r),r.names)},"Element.getProperties":function(r){var n=t(r),o=n.__vue__||n.attr||{};return e.queryProperties(o,r.names)},"Element.getOffset":function(r){return e.getOffset(t(r))},"Element.getAttributes":function(r){return e.queryAttributes(t(r),r.names)},"Element.getStyles":function(r){return e.queryStyles(t(r),r.names)},"Element.getHTML":function(r){return e.queryHTML(t(r),r.type)},"Element.tap":function(r){return e.dispatchTapEvent(t(r))},"Element.longpress":function(r){return e.dispatchLongpressEvent(t(r))},"Element.touchstart":function(r){return e.dispatchTouchEvent(t(r),"touchstart",r)},"Element.touchmove":function(r){return e.dispatchTouchEvent(t(r),"touchmove",r)},"Element.touchend":function(r){return e.dispatchTouchEvent(t(r),"touchend",r)},"Element.callFunction":function(r){return e.callFunction(t(r),r.functionName,r.args)},"Element.triggerEvent":function(r){return e.triggerEvent(t(r),r.type,r.detail)}}}(y));function w(e){return UniViewJSBridge.publishHandler("onAutoMessageReceive",e)}UniViewJSBridge.subscribe("sendAutoMessage",(function(e){var t=e.id,r=e.method,n=e.params,o={id:t},u=E[r];if(!u)return o.error={message:r+" unimplemented"},w(o);try{u(n).then((function(e){e&&(o.result=e)})).catch((function(e){o.error={message:e.message}})).finally((function(){w(o)}))}catch(e){o.error={message:e.message},w(o)}}));
function e(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var n=Array(e),o=0;for(t=0;t<r;t++)for(var u=arguments[t],i=0,c=u.length;i<c;i++,o++)n[o]=u[i];return n}var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),r=new Uint8Array(16);function n(){if(!t)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(r)}for(var o=[],u=0;u<256;++u)o[u]=(u+256).toString(16).substr(1);function i(e,t,r){var u=t&&r||0;"string"==typeof e&&(t="binary"===e?new Array(16):null,e=null);var i=(e=e||{}).random||(e.rng||n)();if(i[6]=15&i[6]|64,i[8]=63&i[8]|128,t)for(var c=0;c<16;++c)t[u+c]=i[c];return t||function(e,t){var r=t||0,n=o;return[n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],"-",n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]],n[e[r++]]].join("")}(i)}var c=Object.prototype.hasOwnProperty,a=Array.isArray,s=function(e){var t=Object.create(null);return function(r){return t[r]||(t[r]=e(r))}},l=/-(\w)/g,f=s((function(e){return e.replace(l,(function(e,t){return t?t.toUpperCase():""}))})),p=s((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),g=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;function d(e,t){if(a(e))return e;if(t&&(r=t,n=e,c.call(r,n)))return[e];var r,n,o=[];return e.replace(g,(function(e,t,r,n){return o.push(r?n.replace(/\\(\\)?/g,"$1"):t||e),n})),o}function m(e,t){var r,n=d(t,e);for(r=n.shift();null!=r;){if(null==(e=e[r]))return;r=n.shift()}return e}var v=new Map;function h(e){if(!function(e){if(e){var t=e.tagName;return 0===t.indexOf("UNI-")||"BODY"===t}return!1}(e))throw Error("no such element");var t,r,n={elementId:(t=e,r=t._id,r||(r=i(),t._id=r,v.set(r,{id:r,element:t})),r),tagName:e.tagName.toLocaleLowerCase().replace("uni-","")},o=e.__vue__;return o.$parent&&o.$parent.$el===e&&(o=o.$parent),o&&!o.$options.isReserved&&(n.nodeId=function(e){if(e._$weex)return e._uid;if(e._$id)return e._$id;var t=function(e){for(var t=e.$parent;t;){if(t._$id)return t;t=t.$parent}}(e);if(!e.$parent)return"-1";var r=e.$vnode,n=r.context;return n&&n!==t&&n._$id?n._$id+";"+t._$id+","+r.data.attrs._i:t._$id+","+r.data.attrs._i}(o)),"video"===n.tagName&&(n.videoId=n.nodeId),n}var _={input:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},textarea:{input:function(e,t){var r=e.__vue__;r.valueSync=t,r.$triggerInput({},{value:t})}},"scroll-view":{scrollTo:function(e,t,r){var n=e.__vue__.$refs.main;n.scrollLeft=t,n.scrollTop=r},scrollTop:function(e){return e.__vue__.$refs.main.scrollTop},scrollLeft:function(e){return e.__vue__.$refs.main.scrollLeft},scrollWidth:function(e){return e.__vue__.$refs.main.scrollWidth},scrollHeight:function(e){return e.__vue__.$refs.main.scrollHeight}},swiper:{swipeTo:function(e,t){e.__vue__.current=t}},"movable-view":{moveTo:function(e,t,r){e.__vue__._animationTo(t,r)}},switch:{tap:function(e){e.click()}},slider:{slideTo:function(e,t){var r=e.__vue__,n=r.$refs["uni-slider"],o=n.offsetWidth,u=n.getBoundingClientRect().left;r.value=t,r._onClick({x:(t-r.min)*o/(r.max-r.min)+u})}}},y={getWindow:function(e){return window},getDocument:function(e){return document},getEl:function(e){var t=v.get(e);if(!t)throw Error("element destroyed");return t.element},getOffset:function(e){var t=e.getBoundingClientRect();return Promise.resolve({left:t.left+window.pageXOffset,top:t.top+window.pageYOffset})},querySelector:function(e,t){return Promise.resolve(h(e.querySelector(t)))},querySelectorAll:function(e,t){var r=[];return document.querySelectorAll(t).forEach((function(e){try{r.push(h(e))}catch(e){}})),Promise.resolve({elements:r})},queryProperties:function(e,t){return Promise.resolve({properties:t.map((function(t){var r=m(e,t);return"document.documentElement.scrollTop"===t&&0===r&&(r=m(e,"document.body.scrollTop")),r}))})},queryAttributes:function(e,t){return Promise.resolve({attributes:t.map((function(t){return String(e.getAttribute(t))}))})},queryStyles:function(e,t){var r=getComputedStyle(e);return Promise.resolve({styles:t.map((function(e){return r[e]}))})},queryHTML:function(e,t){return Promise.resolve({html:(r="outer"===t?e.outerHTML:e.innerHTML,r.replace(/\n/g,"").replace(/(<uni-text[^>]*>)(<span[^>]*>[^<]*<\/span>)(.*?<\/uni-text>)/g,"$1$3").replace(/<\/?[^>]*>/g,(function(e){return-1<e.indexOf("<body")?"<page>":"</body>"===e?"</page>":0!==e.indexOf("<uni-")&&0!==e.indexOf("</uni-")?"":e.replace(/uni-/g,"").replace(/ role=""/g,"").replace(/ aria-label=""/g,"")})))});var r},dispatchTapEvent:function(e){return e.click(),Promise.resolve()},dispatchLongpressEvent:function(e){return Promise.resolve()},dispatchTouchEvent:function(e,t,r){r||(r={}),r.touches||(r.touches=[]),r.changedTouches||(r.changedTouches=[]),r.touches.length||r.touches.push({identifier:Date.now(),target:e});var n=r.touches.map((function(e){return new Touch(e)})),o=r.changedTouches.map((function(e){return new Touch(e)}));return e.dispatchEvent(new TouchEvent(t,{cancelable:!0,bubbles:!0,touches:n,targetTouches:[],changedTouches:o})),Promise.resolve()},callFunction:function(t,r,n){var o=m(_,r);return o?Promise.resolve({result:o.apply(null,e([t],n))}):Promise.reject(Error(r+" not exists"))},triggerEvent:function(e,t,r){var n=e.__vue__;return n.$trigger&&n.$trigger(t,{},r),Promise.resolve()}};["movable-view","picker","ad","button","checkbox-group","checkbox","form","icon","label","movable-area","navigator","picker-view-column","picker-view","progress","radio-group","radio","rich-text","u-slider","swiper-item","swiper","switch"].map((function(e){return p(f(e))}));var E=Object.assign({},function(e){return{"Page.getElement":function(t){return e.querySelector(e.getDocument(t.pageId),t.selector)},"Page.getElements":function(t){return e.querySelectorAll(e.getDocument(t.pageId),t.selector)},"Page.getWindowProperties":function(t){return e.queryProperties(e.getWindow(t.pageId),t.names)}}}(y),function(e){var t=function(t){return e.getEl(t.elementId,t.pageId)};return{"Element.getElement":function(r){return e.querySelector(t(r),r.selector)},"Element.getElements":function(r){return e.querySelectorAll(t(r),r.selector)},"Element.getDOMProperties":function(r){return e.queryProperties(t(r),r.names)},"Element.getProperties":function(r){var n=t(r),o=n.__vue__||n.attr||{};return e.queryProperties(o,r.names)},"Element.getOffset":function(r){return e.getOffset(t(r))},"Element.getAttributes":function(r){return e.queryAttributes(t(r),r.names)},"Element.getStyles":function(r){return e.queryStyles(t(r),r.names)},"Element.getHTML":function(r){return e.queryHTML(t(r),r.type)},"Element.tap":function(r){return e.dispatchTapEvent(t(r))},"Element.longpress":function(r){return e.dispatchLongpressEvent(t(r))},"Element.touchstart":function(r){return e.dispatchTouchEvent(t(r),"touchstart",r)},"Element.touchmove":function(r){return e.dispatchTouchEvent(t(r),"touchmove",r)},"Element.touchend":function(r){return e.dispatchTouchEvent(t(r),"touchend",r)},"Element.callFunction":function(r){return e.callFunction(t(r),r.functionName,r.args)},"Element.triggerEvent":function(r){return e.triggerEvent(t(r),r.type,r.detail)}}}(y));function w(e){return UniViewJSBridge.publishHandler("onAutoMessageReceive",e)}UniViewJSBridge.subscribe("sendAutoMessage",(function(e){var t=e.id,r=e.method,n=e.params,o={id:t},u=E[r];if(!u)return o.error={message:r+" unimplemented"},w(o);try{u(n).then((function(e){e&&(o.result=e)})).catch((function(e){o.error={message:e.message}})).finally((function(){w(o)}))}catch(e){o.error={message:e.message},w(o)}}));
......@@ -425,6 +425,18 @@ var serviceContext = (function () {
return encodeStr(key) + '=' + encodeStr(val)
}).filter(x => x.length > 0).join('&') : null;
return res ? `?${res}` : ''
}
function decodedQuery (query = {}) {
const decodedQuery = {};
Object.keys(query).forEach(name => {
try {
decodedQuery[name] = decode(query[name]);
} catch (e) {
decodedQuery[name] = query[name];
}
});
return decodedQuery
}
let id = 0;
......@@ -1659,7 +1671,11 @@ var serviceContext = (function () {
}
// switchTab不允许传递参数,reLaunch到一个tabBar页面是可以的
if (type === 'switchTab' && routeOptions.meta.isTabBar) {
if (
type === 'switchTab' &&
routeOptions.meta.isTabBar &&
params.openType !== 'appLaunch'
) {
url = pagePath;
}
......@@ -1670,12 +1686,12 @@ var serviceContext = (function () {
// 参数格式化
params.url = encodeQueryString(url);
// 主要拦截目标为用户快速点击时触发的多次跳转,该情况,通常前后 url 是一样的
if (navigatorLock === url) {
return `${navigatorLock} locked`
}
// 至少 onLaunch 之后,再启用lock逻辑(onLaunch之前可能开发者手动调用路由API,来提前跳转)
// 至少 onLaunch 之后,再启用lock逻辑(onLaunch之前可能开发者手动调用路由API,来提前跳转)
// enableNavigatorLock 临时开关(不对外开放),避免该功能上线后,有部分情况异常,可以让开发者临时关闭 lock 功能
if (__uniConfig.ready && __uniConfig.enableNavigatorLock !== false) {
navigatorLock = url;
......@@ -2058,6 +2074,17 @@ var serviceContext = (function () {
backgroundColor: {
type: String
},
backgroundImage: {
type: String,
validator (backgroundImage, params) {
if (backgroundImage && !(/^(linear|radial)-gradient\(.+?\);?$/.test(backgroundImage))) {
params.backgroundImage = getRealPath(backgroundImage);
}
}
},
backgroundRepeat: {
type: String
},
borderStyle: {
type: String,
validator (borderStyle, params) {
......@@ -8554,7 +8581,8 @@ var serviceContext = (function () {
function _switchTab ({
url,
path,
path,
query,
from
}, callbackId) {
tabBar$1.switchTab(path.slice(1));
......@@ -8564,7 +8592,7 @@ var serviceContext = (function () {
let callOnHide = false;
let callOnShow = false;
let currentPage;
if (len >= 1) { // 前一个页面是非 tabBar 页面
currentPage = pages[len - 1];
......@@ -8624,7 +8652,7 @@ var serviceContext = (function () {
return showWebview(registerPage({
url,
path,
query: {},
query,
openType: 'switchTab'
}), 'none', 0, () => {
setStatusBarStyle();
......@@ -8645,11 +8673,15 @@ var serviceContext = (function () {
from,
openType
}, callbackId) {
const path = url.split('?')[0];
// 直达时,允许 tabBar 带参数
const urls = url.split('?');
const path = urls[0];
const query = parseQuery(urls[1] || '');
navigate(path, function () {
_switchTab({
url,
path,
path,
query,
from
}, callbackId);
}, openType === 'appLaunch');
......@@ -8665,9 +8697,16 @@ var serviceContext = (function () {
const type = object.type;
if (types.indexOf(type) >= 0) {
const keys = Object.keys(object);
// eslint-disable-next-line valid-typeof
if (keys.length === 2 && 'data' in object && typeof object.data === type) {
return object.data
if (keys.length === 2 && 'data' in object) {
// eslint-disable-next-line valid-typeof
if (typeof object.data === type) {
return object.data
}
// eslint-disable-next-line no-useless-escape
if (type === 'object' && /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z$/.test(object.data)) {
// ISO 8601 格式返回 Date
return new Date(object.data)
}
} else if (keys.length === 1) {
return ''
}
......@@ -8739,8 +8778,12 @@ var serviceContext = (function () {
data = object;
if (typeof object === 'string') {
object = JSON.parse(object);
// eslint-disable-next-line valid-typeof
data = typeof object === (type === 'null' ? 'object' : type) ? object : data;
const objectType = typeof object;
if (objectType === 'number' && type === 'date') {
data = new Date(object);
} else if (objectType === (['null', 'array'].indexOf(type) < 0 ? type : 'object')) {
data = object;
}
}
}
} catch (error) {}
......@@ -13724,7 +13767,8 @@ var serviceContext = (function () {
},
created () {
if (this.mpType === 'page') {
callPageHook(this.$scope, 'onLoad', this.$options.pageQuery);
// 理论上应该从最开始的 parseQuery 的地方直接 decode 两次,为了减少影响范围,先仅处理 onLoad 参数
callPageHook(this.$scope, 'onLoad', decodedQuery(this.$options.pageQuery));
callPageHook(this.$scope, 'onShow');
}
},
......
此差异已折叠。
......@@ -61,7 +61,11 @@ function createValidator (type) {
}
// switchTab不允许传递参数,reLaunch到一个tabBar页面是可以的
if (type === 'switchTab' && routeOptions.meta.isTabBar) {
if (
type === 'switchTab' &&
routeOptions.meta.isTabBar &&
params.openType !== 'appLaunch'
) {
url = pagePath
}
......@@ -72,12 +76,12 @@ function createValidator (type) {
// 参数格式化
params.url = encodeQueryString(url)
// 主要拦截目标为用户快速点击时触发的多次跳转,该情况,通常前后 url 是一样的
if (navigatorLock === url) {
return `${navigatorLock} locked`
}
// 至少 onLaunch 之后,再启用lock逻辑(onLaunch之前可能开发者手动调用路由API,来提前跳转)
// 至少 onLaunch 之后,再启用lock逻辑(onLaunch之前可能开发者手动调用路由API,来提前跳转)
// enableNavigatorLock 临时开关(不对外开放),避免该功能上线后,有部分情况异常,可以让开发者临时关闭 lock 功能
if (__uniConfig.ready && __uniConfig.enableNavigatorLock !== false) {
navigatorLock = url
......
import {
getLen
} from 'uni-shared'
import getRealPath from 'uni-platform/helpers/get-real-path'
const indexValidator = {
type: Number,
......@@ -30,6 +31,17 @@ export const setTabBarStyle = {
backgroundColor: {
type: String
},
backgroundImage: {
type: String,
validator (backgroundImage, params) {
if (backgroundImage && !(/^(linear|radial)-gradient\(.+?\);?$/.test(backgroundImage))) {
params.backgroundImage = getRealPath(backgroundImage)
}
}
},
backgroundRepeat: {
type: String
},
borderStyle: {
type: String,
validator (borderStyle, params) {
......
import {
decodedQuery
} from 'uni-shared'
import {
callPageHook
} from '../util'
import createPage from './create-page'
// 与小程序保持一致,尝试decodeURIComponent一次参数
function getDecodedQuery (query = {}) {
const decodedQuery = {}
Object.keys(query).forEach(name => {
try {
decodedQuery[name] = decodeURIComponent(query[name])
} catch (e) {
decodedQuery[name] = query[name]
}
})
return decodedQuery
}
export function createPageMixin () {
return {
created: function pageCreated () {
const options = getDecodedQuery(this.$route.query)
const options = decodedQuery(this.$route.query)
createPage(this, options)
callPageHook(this, 'onLoad', options)
callPageHook(this, 'onShow')
......
import {
parseQuery
} from 'uni-shared'
import {
ANI_CLOSE,
ANI_DURATION
......@@ -24,7 +28,8 @@ import tabBar from '../../framework/tab-bar'
function _switchTab ({
url,
path,
path,
query,
from
}, callbackId) {
tabBar.switchTab(path.slice(1))
......@@ -34,7 +39,7 @@ function _switchTab ({
let callOnHide = false
let callOnShow = false
let currentPage
if (len >= 1) { // 前一个页面是非 tabBar 页面
currentPage = pages[len - 1]
......@@ -94,7 +99,7 @@ function _switchTab ({
return showWebview(registerPage({
url,
path,
query: {},
query,
openType: 'switchTab'
}), 'none', 0, () => {
setStatusBarStyle()
......@@ -115,11 +120,15 @@ export function switchTab ({
from,
openType
}, callbackId) {
const path = url.split('?')[0]
// 直达时,允许 tabBar 带参数
const urls = url.split('?')
const path = urls[0]
const query = parseQuery(urls[1] || '')
navigate(path, function () {
_switchTab({
url,
path,
path,
query,
from
}, callbackId)
}, openType === 'appLaunch')
......
......@@ -12,9 +12,16 @@ function parseValue (value) {
const type = object.type
if (types.indexOf(type) >= 0) {
const keys = Object.keys(object)
// eslint-disable-next-line valid-typeof
if (keys.length === 2 && 'data' in object && typeof object.data === type) {
return object.data
if (keys.length === 2 && 'data' in object) {
// eslint-disable-next-line valid-typeof
if (typeof object.data === type) {
return object.data
}
// eslint-disable-next-line no-useless-escape
if (type === 'object' && /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z$/.test(object.data)) {
// ISO 8601 格式返回 Date
return new Date(object.data)
}
} else if (keys.length === 1) {
return ''
}
......@@ -86,8 +93,12 @@ function parseGetStorage (type, value) {
data = object
if (typeof object === 'string') {
object = JSON.parse(object)
// eslint-disable-next-line valid-typeof
data = typeof object === (type === 'null' ? 'object' : type) ? object : data
const objectType = typeof object
if (objectType === 'number' && type === 'date') {
data = new Date(object)
} else if (objectType === (['null', 'array'].indexOf(type) < 0 ? type : 'object')) {
data = object
}
}
}
} catch (error) {}
......
import {
hasOwn
hasOwn,
decodedQuery
} from 'uni-shared'
import {
......@@ -86,7 +87,8 @@ export function initLifecycle (Vue) {
},
created () {
if (this.mpType === 'page') {
callPageHook(this.$scope, 'onLoad', this.$options.pageQuery)
// 理论上应该从最开始的 parseQuery 的地方直接 decode 两次,为了减少影响范围,先仅处理 onLoad 参数
callPageHook(this.$scope, 'onLoad', decodedQuery(this.$options.pageQuery))
callPageHook(this.$scope, 'onShow')
}
},
......
......@@ -167,8 +167,7 @@ export default {
// tabBar是否遮挡内容区域
get cover () {
const array = ['extralight', 'light', 'dark']
// 设置背景颜色会失效
return isIOS && array.indexOf(config.blurEffect) >= 0 && !config.backgroundColor
return isIOS && array.indexOf(config.blurEffect) >= 0
},
setStyle ({ mask }) {
tabBar.setMask({
......
const STORAGE_DATA_TYPE = '__TYPE'
const STORAGE_KEYS = 'uni-storage-keys'
function parseValue (value) {
......@@ -8,9 +7,16 @@ function parseValue (value) {
const type = object.type
if (types.indexOf(type) >= 0) {
const keys = Object.keys(object)
// eslint-disable-next-line valid-typeof
if (keys.length === 2 && 'data' in object && typeof object.data === type) {
return object.data
if (keys.length === 2 && 'data' in object) {
// eslint-disable-next-line valid-typeof
if (typeof object.data === type) {
return object.data
}
// eslint-disable-next-line no-useless-escape
if (type === 'object' && /^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}\.\d{3}Z$/.test(object.data)) {
// ISO 8601 格式返回 Date
return new Date(object.data)
}
} else if (keys.length === 1) {
return ''
}
......@@ -28,11 +34,6 @@ export function setStorage ({
data: data
})
try {
if (type === 'string' && parseValue(value) !== undefined) {
localStorage.setItem(key + STORAGE_DATA_TYPE, type)
} else {
localStorage.removeItem(key + STORAGE_DATA_TYPE)
}
localStorage.setItem(key, value)
} catch (error) {
return {
......@@ -62,26 +63,13 @@ export function getStorage ({
}
}
let data = value
const typeOrigin = localStorage.getItem(key + STORAGE_DATA_TYPE) || ''
const type = typeOrigin.toLowerCase()
if (type !== 'string' || (typeOrigin === 'String' && value === '{"type":"undefined"}')) {
try {
// 兼容H5和V3初期历史格式
let object = JSON.parse(value)
const result = parseValue(object)
if (result !== undefined) {
data = result
} else if (type) {
// 兼容App端历史格式
data = object
if (typeof object === 'string') {
object = JSON.parse(object)
// eslint-disable-next-line valid-typeof
data = typeof object === (type === 'null' ? 'object' : type) ? object : data
}
}
} catch (error) { }
}
try {
const object = JSON.parse(value)
const result = parseValue(object)
if (result !== undefined) {
data = result
}
} catch (error) { }
return {
data,
errMsg: 'getStorage:ok'
......@@ -99,8 +87,6 @@ export function removeStorage ({
key
} = {}) {
if (localStorage) {
// 兼容App端历史格式
localStorage.removeItem(key + STORAGE_DATA_TYPE)
localStorage.removeItem(key)
}
return {
......@@ -126,14 +112,14 @@ export function clearStorageSync () {
}
export function getStorageInfo () {
const length = (localStorage && (localStorage.length || localStorage.getLength())) || 0
const length = (localStorage && localStorage.length) || 0
const keys = []
let currentSize = 0
for (let index = 0; index < length; index++) {
const key = localStorage.key(index)
if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) {
const value = localStorage.getItem(key)
currentSize += key.length + value.length
const value = localStorage.getItem(key)
currentSize += key.length + value.length
if (key !== STORAGE_KEYS) {
keys.push(key)
}
}
......
......@@ -69,4 +69,16 @@ export function stringifyQuery (obj, encodeStr = encode) {
return encodeStr(key) + '=' + encodeStr(val)
}).filter(x => x.length > 0).join('&') : null
return res ? `?${res}` : ''
}
export function decodedQuery (query = {}) {
const decodedQuery = {}
Object.keys(query).forEach(name => {
try {
decodedQuery[name] = decode(query[name])
} catch (e) {
decodedQuery[name] = query[name]
}
})
return decodedQuery
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册