diff --git a/src/core/service/plugins/page/index.js b/src/core/service/plugins/page/index.js index 19ea007617fe97342d075e5acb9da3e70419e9f1..482419d9b5fea1352a74142dbe7cdb596749a4cb 100644 --- a/src/core/service/plugins/page/index.js +++ b/src/core/service/plugins/page/index.js @@ -1,26 +1,17 @@ +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') diff --git a/src/platforms/app-plus/service/framework/plugins/lifecycle.js b/src/platforms/app-plus/service/framework/plugins/lifecycle.js index 604fa427666eda61854bd08592d68ca3f6416ac3..40f38fe9735030699b37e298041f7e5888450333 100644 --- a/src/platforms/app-plus/service/framework/plugins/lifecycle.js +++ b/src/platforms/app-plus/service/framework/plugins/lifecycle.js @@ -1,5 +1,6 @@ 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') } }, diff --git a/src/shared/query.js b/src/shared/query.js index db0865c6306bb2ab682b0c5b64c827d7b1f4c6d8..7203db996c4bf4058fd65d0a837c0e834439d7e3 100644 --- a/src/shared/query.js +++ b/src/shared/query.js @@ -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 }