mirror of
https://github.com/terribleplan/next.js.git
synced 2024-01-19 02:48:18 +00:00
fix navigation failure (#546)
This commit is contained in:
parent
0c6efce5f0
commit
242758e3ee
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue