React Router -- 区分listen()中的goBack()和goForward()
React Router -- Differentiate goBack() and goForward() in listen()
问题
使用 React Router v4,如何区分使用 listen()
方法的 goBack()
和 goForward()
调用?
据我所知,location
和 action
参数没有提供足够的信息来区分。 action
参数对于后退和前进都是 POP
。
history.listen((location, action) => {
// action = 'POP' when goBack() and goForward() are called.
}
我正在使用 history 节点模块。
目的
我有一个面包屑组件,其项目保持状态。当用户返回时,我需要弹出最后一个面包屑。
您可以从数组中的 location
对象中收集所有 key
值,并使用它来确定键是按顺序出现在前一个键之前还是之后,并使用它来区分在 goBack
和 goForward
之间。
例子
const keys = [];
let previousKey;
history.listen((location, action) => {
const { key } = location;
// If there is no key, it was a goBack.
if (key === undefined) {
console.log('goBack')
return;
}
// If it's an entirely new key, it was a goForward.
// If it was neither of the above, you can compare the index
// of `key` to the previous key in your keys array.
if (!keys.includes(key)) {
keys.push(key);
console.log('goForward');
} else if (keys.indexOf(key) < keys.indexOf(previousKey)) {
console.log('goBack');
} else {
console.log('goForward');
}
previousKey = key;
});
history.push("/test");
history.push("/test/again");
setTimeout(() => history.goBack(), 1000);
setTimeout(() => history.goBack(), 2000);
setTimeout(() => history.goForward(), 3000);
问题
使用 React Router v4,如何区分使用 listen()
方法的 goBack()
和 goForward()
调用?
据我所知,location
和 action
参数没有提供足够的信息来区分。 action
参数对于后退和前进都是 POP
。
history.listen((location, action) => {
// action = 'POP' when goBack() and goForward() are called.
}
我正在使用 history 节点模块。
目的
我有一个面包屑组件,其项目保持状态。当用户返回时,我需要弹出最后一个面包屑。
您可以从数组中的 location
对象中收集所有 key
值,并使用它来确定键是按顺序出现在前一个键之前还是之后,并使用它来区分在 goBack
和 goForward
之间。
例子
const keys = [];
let previousKey;
history.listen((location, action) => {
const { key } = location;
// If there is no key, it was a goBack.
if (key === undefined) {
console.log('goBack')
return;
}
// If it's an entirely new key, it was a goForward.
// If it was neither of the above, you can compare the index
// of `key` to the previous key in your keys array.
if (!keys.includes(key)) {
keys.push(key);
console.log('goForward');
} else if (keys.indexOf(key) < keys.indexOf(previousKey)) {
console.log('goBack');
} else {
console.log('goForward');
}
previousKey = key;
});
history.push("/test");
history.push("/test/again");
setTimeout(() => history.goBack(), 1000);
setTimeout(() => history.goBack(), 2000);
setTimeout(() => history.goForward(), 3000);