Skip to content

Commit 0f9d82c

Browse files
committed
feat(scroll): allow behavior in scrollBehavior
Close #2069
1 parent 2c77247 commit 0f9d82c

File tree

2 files changed

+32
-20
lines changed

2 files changed

+32
-20
lines changed

Diff for: src/util/scroll.js

+31-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* @flow */
22

33
import type Router from '../index'
4-
import { assert } from './warn'
4+
import { assert, warn } from './warn'
55
import { getStateKey, setStateKey } from './state-key'
66
import { extend } from './misc'
77

@@ -82,8 +82,8 @@ export function saveScrollPosition () {
8282
const key = getStateKey()
8383
if (key) {
8484
positionStore[key] = {
85-
x: window.pageXOffset,
86-
y: window.pageYOffset
85+
left: window.pageXOffset,
86+
top: window.pageYOffset
8787
}
8888
}
8989
}
@@ -107,26 +107,33 @@ function getElementPosition (el: Element, offset: Object): Object {
107107
const docRect = docEl.getBoundingClientRect()
108108
const elRect = el.getBoundingClientRect()
109109
return {
110-
x: elRect.left - docRect.left - offset.x,
111-
y: elRect.top - docRect.top - offset.y
110+
behavior: offset.behavior,
111+
left: elRect.left - docRect.left - offset.left,
112+
top: elRect.top - docRect.top - offset.top
112113
}
113114
}
114115

115116
function isValidPosition (obj: Object): boolean {
116-
return isNumber(obj.x) || isNumber(obj.y)
117+
return isNumber(obj.left) || isNumber(obj.top)
117118
}
118119

119-
function normalizePosition (obj: Object): Object {
120-
return {
121-
x: isNumber(obj.x) ? obj.x : window.pageXOffset,
122-
y: isNumber(obj.y) ? obj.y : window.pageYOffset
120+
function normalizePosition (obj: Object, defaultLeft?: number, defaultTop?: number): Object {
121+
const left = isNumber(obj.left) ? obj.left : obj.x
122+
const top = isNumber(obj.top) ? obj.top : obj.y
123+
// defaultLeft = isNumber(defaultLeft) ? defaultLeft : window.pageXOffset
124+
// defaultTop = isNumber(defaultTop) ? defaultTop : window.pageYOffset
125+
126+
if (process.env.NODE_ENV !== 'production') {
127+
if (isNumber(obj.x) || isNumber(obj.y)) {
128+
const original = JSON.stringify(obj, null, 2)
129+
warn(false, 'Position objects returned by "scrollBehavior" with "x" and "y" positions are deprecated, replace it with "left" and "top" respectively. Replace\n\n' + original + '\n\nwith\n\n' + original.replace('"x"', '"left"').replace('"y"', '"top"'))
130+
}
123131
}
124-
}
125132

126-
function normalizeOffset (obj: Object): Object {
127133
return {
128-
x: isNumber(obj.x) ? obj.x : 0,
129-
y: isNumber(obj.y) ? obj.y : 0
134+
behavior: obj.behavior,
135+
left: isNumber(left) ? left : defaultLeft,
136+
top: isNumber(top) ? top : defaultTop
130137
}
131138
}
132139

@@ -150,16 +157,21 @@ function scrollToPosition (shouldScroll, position) {
150157
shouldScroll.offset && typeof shouldScroll.offset === 'object'
151158
? shouldScroll.offset
152159
: {}
153-
offset = normalizeOffset(offset)
160+
offset = normalizePosition(offset, 0, 0)
154161
position = getElementPosition(el, offset)
155-
} else if (isValidPosition(shouldScroll)) {
162+
} else {
156163
position = normalizePosition(shouldScroll)
157164
}
158-
} else if (isObject && isValidPosition(shouldScroll)) {
165+
} else if (isObject) {
159166
position = normalizePosition(shouldScroll)
160167
}
161168

162-
if (position) {
163-
window.scrollTo(position.x, position.y)
169+
if (position && isValidPosition(position)) {
170+
const docEl: any = document.documentElement
171+
if ('scrollBehavior' in docEl.style) {
172+
window.scrollTo(position)
173+
} else {
174+
window.scrollTo(position.left, position.top)
175+
}
164176
}
165177
}

Diff for: src/util/warn.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ export function isError (err: any): boolean {
1616
return Object.prototype.toString.call(err).indexOf('Error') > -1
1717
}
1818

19-
export function isRouterError (err: any, errorType: ?string): boolean {
19+
export function isRouterError (err: any, errorType: ?number): boolean {
2020
return isError(err) && err._isRouter && (errorType == null || err.type === errorType)
2121
}

0 commit comments

Comments
 (0)