未验证 提交 a5b00946 编写于 作者: K kaykdm 提交者: GitHub

Fix shallow routing scroll (#21437)

This ensures that Next.js will not scroll to the top of the page in shallow routing.

Fixes: https://github.com/vercel/next.js/issues/21386
Fixes: https://github.com/vercel/next.js/issues/21366
上级 74b6389b
......@@ -1093,13 +1093,16 @@ export default class Router implements BaseRouter {
!(routeInfo.Component as any).getInitialProps
}
// shallow routing is only allowed for same page URL changes.
const isValidShallowRoute = options.shallow && this.route === route
await this.set(
route,
pathname!,
query,
cleanedAs,
routeInfo,
forcedScroll || (options.scroll ? { x: 0, y: 0 } : null)
forcedScroll ||
(isValidShallowRoute || !options.scroll ? null : { x: 0, y: 0 })
).catch((e) => {
if (e.cancelled) error = error || e
else throw e
......
......@@ -27,6 +27,17 @@ export default class extends Component {
Router.push(href, href, { shallow: true })
}
increaseNonShallow() {
const counter = this.getCurrentCounter()
const href = `/nav/shallow-routing?counter=${counter + 1}`
Router.push(href, href, {})
}
gotoNavShallow() {
const href = `/nav`
Router.push(href, href, { shallow: true })
}
render() {
return (
<div className="shallow-routing">
......@@ -35,13 +46,21 @@ export default class extends Component {
Home
</a>
</Link>
<div id="counter">Counter: {this.getCurrentCounter()}</div>
<div id="counter" style={{ marginBottom: 4000 }}>
Counter: {this.getCurrentCounter()}
</div>
<div id="get-initial-props-run-count">
getInitialProps run count: {this.props.getInitialPropsRunCount}
</div>
<button id="increase" onClick={() => this.increase()}>
Increase
</button>
<button id="increase2" onClick={() => this.increaseNonShallow()}>
Increase Non-Shallow
</button>
<button id="invalidShallow" onClick={() => this.gotoNavShallow()}>
Invalid Shallow Nav
</button>
</div>
)
}
......
......@@ -854,6 +854,41 @@ describe('Client Navigation', () => {
await browser.close()
})
it('should keep the scroll position on shallow routing', async () => {
const browser = await webdriver(context.appPort, '/nav/shallow-routing')
await browser.eval(() =>
document.querySelector('#increase').scrollIntoView()
)
const scrollPosition = await browser.eval('window.pageYOffset')
expect(scrollPosition).toBeGreaterThan(3000)
await browser.elementByCss('#increase').click()
await waitFor(500)
const newScrollPosition = await browser.eval('window.pageYOffset')
expect(newScrollPosition).toBe(scrollPosition)
await browser.elementByCss('#increase2').click()
await waitFor(500)
const newScrollPosition2 = await browser.eval('window.pageYOffset')
expect(newScrollPosition2).toBe(0)
await browser.eval(() =>
document.querySelector('#invalidShallow').scrollIntoView()
)
const scrollPositionDown = await browser.eval('window.pageYOffset')
expect(scrollPositionDown).toBeGreaterThan(3000)
await browser.elementByCss('#invalidShallow').click()
await waitFor(500)
const newScrollPosition3 = await browser.eval('window.pageYOffset')
expect(newScrollPosition3).toBe(0)
})
})
describe('with URL objects', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册