提交 242758e3 编写于 作者: N Naoyuki Kanezawa 提交者: Guillermo Rauch

fix navigation failure (#546)

上级 0c6efce5
......@@ -14,7 +14,7 @@ export default class Link extends Component {
return
}
const { href, as } = this.props
const { href, as = href } = this.props
if (!isLocal(href)) {
// ignore click if it's outside our scope
......@@ -23,17 +23,14 @@ export default class Link extends Component {
e.preventDefault()
const route = as ? href : null
const url = as || href
// avoid scroll for urls with anchor refs
let { scroll } = this.props
if (scroll == null) {
scroll = url.indexOf('#') < 0
scroll = as.indexOf('#') < 0
}
// straight up redirect
Router.push(route, url)
Router.push(href, as)
.then((success) => {
if (!success) return
if (scroll) window.scrollTo(0, 0)
......
......@@ -29,9 +29,10 @@ export default class Router {
onPopState (e) {
this.abortComponentLoad()
let { route } = e.state || {}
const { pathname, query } = parse(route || window.location.href, true)
if (!route) route = toRoute(pathname)
const as = getURL()
const { url = as } = e.state || {}
const { pathname, query } = parse(url, true)
const route = toRoute(pathname)
Promise.resolve()
.then(async () => {
......@@ -40,7 +41,7 @@ export default class Router {
const props = await this.getInitialProps(data.Component, ctx)
this.route = route
this.set(getURL(), { ...data, props })
this.set(pathname, query, { ...data, props })
})
.catch(async (err) => {
if (err.cancelled) return
......@@ -50,7 +51,7 @@ export default class Router {
const props = await this.getInitialProps(data.Component, ctx)
this.route = route
this.set(getURL(), { ...data, props })
this.set(pathname, query, { ...data, props })
console.error(err)
})
.catch((err) => {
......@@ -102,18 +103,17 @@ export default class Router {
window.history.back()
}
push (route, url = route) {
return this.change('pushState', route, url)
push (url, as = url) {
return this.change('pushState', url, as)
}
replace (route, url = route) {
return this.change('replaceState', route, url)
replace (url, as = url) {
return this.change('replaceState', url, as)
}
async change (method, route, url) {
const { pathname, query } = parse(route || url, true)
if (!route) route = toRoute(pathname)
async change (method, url, as) {
const { pathname, query } = parse(url, true)
const route = toRoute(pathname)
this.abortComponentLoad()
......@@ -135,29 +135,27 @@ export default class Router {
console.error(err)
}
if (method !== 'pushState' || getURL() !== url) {
window.history[method]({ route }, null, url)
if (method !== 'pushState' || getURL() !== as) {
window.history[method]({ url }, null, as)
}
this.route = route
this.set(url, { ...data, props })
this.set(pathname, query, { ...data, props })
if (_err) throw _err
return true
}
set (url, data) {
const parsed = parse(url, true)
if (this.urlIsNew(parsed)) {
this.pathname = parsed.pathname
this.query = parsed.query
set (pathname, query, data) {
if (this.urlIsNew(pathname, query)) {
this.pathname = pathname
this.query = query
this.notify(data)
}
}
urlIsNew ({ pathname, query }) {
urlIsNew (pathname, query) {
return this.pathname !== pathname || !shallowEquals(query, this.query)
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册