$u.route 函数永久 navigateTo 类型跳转的错误
ilxqx opened this issue · 1 comments
ilxqx commented
版本
1.8.7
转载链接
太简单,无需重现链接
重现步骤
备注一下,文件是:uview-ui/libs/function/route.js
// 对外的方法名称
async route(options = {}, params = {}) {
// 合并用户的配置和内部的默认配置
let mergeConfig = {}
if (typeof options === 'string') {
// 如果options为字符串,则为route(url, params)的形式
mergeConfig.url = this.mixinParam(options, params)
mergeConfig.type = 'navigateTo'
} else {
// 仔细看这句,this.config中的类型始终是 navigateTo,那么无论我 options 中传什么类型,都会被这个 this.config 覆盖
// 这里应该是 先将 this.config 复制一份,然后将 options的选项往这个 新复制的 this.config 中合并
mergeConfig = uni.$u.deepMerge(options, this.config)
// 否则正常使用mergeConfig中的url和params进行拼接
mergeConfig.url = this.mixinParam(options.url, options.params)
}
// ... 省略代码
}
可以使用:uni.$u.deepMerge(deepClone(this.config), options)
期望的结果是什么?
正常跳转非navigateTo类型路由
实际的结果是什么?
只进行navigateTo路由跳转,其他均失效
我修改后的代码
// 对外的方法名称
async route(options = {}, params = {}) {
// 合并用户的配置和内部的默认配置
let mergeConfig = {}
if (typeof options === 'string') {
// 如果options为字符串,则为route(url, params)的形式
mergeConfig.url = this.mixinParam(options, params)
mergeConfig.type = 'navigateTo'
} else {
mergeConfig = options
// 否则正常使用mergeConfig中的url和params进行拼接
mergeConfig.url = this.mixinParam(options.url, options.params)
}
const baseConfig = uni.$u.deepClone(this.config)
if(params.intercept) {
baseConfig.intercept = params.intercept
}
// params参数也带给拦截器
mergeConfig.params = params
// 合并内外部参数
mergeConfig = uni.$u.deepMerge(baseConfig, mergeConfig)
// 判断用户是否定义了拦截器
if (typeof uni.$u.routeIntercept === 'function') {
// 定一个promise,根据用户执行resolve(true)或者resolve(false)来决定是否进行路由跳转
const isNext = await new Promise((resolve, reject) => {
uni.$u.routeIntercept(mergeConfig, resolve)
})
// 如果isNext为true,则执行路由跳转
isNext && this.openPage(mergeConfig)
} else {
this.openPage(mergeConfig)
}
}
Lil-El commented
我今天也遇到这个问题了,永远都是type不管怎么设置都是navigateTo;
我看了一下,1.8.7的commit,其中有一个是“fix(route.js):调用方法错误”
他把原本的deepClone改成了deepMerge,导致type永远都是this.config中的type(navigateTo);
只要改回去就好了