反应 |如何检测页面刷新(F5)
React | How to detect Page Refresh (F5)
我正在使用 React js。我需要检测 page refresh
。当用户点击刷新图标或按 F5 时,我需要找出事件。
我尝试使用 javascript 函数 Whosebug post
我用了javascript函数beforeunload
还是不行。
onUnload(event) {
alert('page Refreshed')
}
componentDidMount() {
window.addEventListener("beforeunload", this.onUnload)
}
componentWillUnmount() {
window.removeEventListener("beforeunload", this.onUnload)
}
这里我有 stackblitz
的完整代码
您的代码似乎工作正常,您的警报将不起作用,因为您没有停止刷新。如果你 console.log('hello')
显示输出。
更新---
这应该会阻止用户刷新,但这取决于您想要发生什么。
componentDidMount() {
window.onbeforeunload = function() {
this.onUnload();
return "";
}.bind(this);
}
将其放入构造函数中:
if (window.performance) {
if (performance.navigation.type == 1) {
alert( "This page is reloaded" );
} else {
alert( "This page is not reloaded");
}
}
它会起作用,请在 stackblitz 上查看此示例。
不幸的是,目前接受的答案不能被认为是可接受的,因为 performance.navigation.type 是 deprecated
最新的 API 是实验性 ATM。
作为一种解决方法,我只能建议在 redux(或你使用的任何东西)存储中保存一些值以指示重新加载后的状态,并在第一次路由更改时更新它以指示路由更改不是因为刷新。
如果您使用的是 REDUX 或 CONTEXT API,那么这很容易。您可以检查 REDUX 或 CONTEXT 状态变量。当用户刷新页面时,它会重置 CONTEXT 或 REDUX 状态,您必须再次手动设置它们。因此,如果它们未设置或等于您提供的初始值,那么您可以假设页面已刷新。
如果您正在使用 React Hook、UseEffect,您可以将以下更改放入您的组件中。它对我有用
useEffect(() => {
window.addEventListener("beforeunload", alertUser);
return () => {
window.removeEventListener("beforeunload", alertUser);
};
}, []);
const alertUser = (e) => {
e.preventDefault();
e.returnValue = "";
};
它实际上非常简单,这将在您重新加载页面时添加默认警报。
功能组件
useEffect(() => {
window.onbeforeunload = function() {
return true;
};
return () => {
window.onbeforeunload = null;
};
}, []);
Class 组件
componentDidMount(){
window.onbeforeunload = function() {
return true;
};
}
componentDidUnmount(){
window.onbeforeunload = null;
}
您可以将验证设置为仅在条件为 true
时添加警报。
功能组件
useEffect(() => {
if (condition) {
window.onbeforeunload = function() {
return true;
};
}
return () => {
window.onbeforeunload = null;
};
}, [condition]);
Class 组件
componentDidMount(){
if (condition) {
window.onbeforeunload = function() {
return true;
};
}
}
componentDidUnmount(){
window.onbeforeunload = null;
}
我正在使用 React js。我需要检测 page refresh
。当用户点击刷新图标或按 F5 时,我需要找出事件。
我尝试使用 javascript 函数 Whosebug post
我用了javascript函数beforeunload
还是不行。
onUnload(event) {
alert('page Refreshed')
}
componentDidMount() {
window.addEventListener("beforeunload", this.onUnload)
}
componentWillUnmount() {
window.removeEventListener("beforeunload", this.onUnload)
}
这里我有 stackblitz
的完整代码您的代码似乎工作正常,您的警报将不起作用,因为您没有停止刷新。如果你 console.log('hello')
显示输出。
更新---
这应该会阻止用户刷新,但这取决于您想要发生什么。
componentDidMount() {
window.onbeforeunload = function() {
this.onUnload();
return "";
}.bind(this);
}
将其放入构造函数中:
if (window.performance) {
if (performance.navigation.type == 1) {
alert( "This page is reloaded" );
} else {
alert( "This page is not reloaded");
}
}
它会起作用,请在 stackblitz 上查看此示例。
不幸的是,目前接受的答案不能被认为是可接受的,因为 performance.navigation.type 是 deprecated
最新的 API 是实验性 ATM。 作为一种解决方法,我只能建议在 redux(或你使用的任何东西)存储中保存一些值以指示重新加载后的状态,并在第一次路由更改时更新它以指示路由更改不是因为刷新。
如果您使用的是 REDUX 或 CONTEXT API,那么这很容易。您可以检查 REDUX 或 CONTEXT 状态变量。当用户刷新页面时,它会重置 CONTEXT 或 REDUX 状态,您必须再次手动设置它们。因此,如果它们未设置或等于您提供的初始值,那么您可以假设页面已刷新。
如果您正在使用 React Hook、UseEffect,您可以将以下更改放入您的组件中。它对我有用
useEffect(() => {
window.addEventListener("beforeunload", alertUser);
return () => {
window.removeEventListener("beforeunload", alertUser);
};
}, []);
const alertUser = (e) => {
e.preventDefault();
e.returnValue = "";
};
它实际上非常简单,这将在您重新加载页面时添加默认警报。
功能组件
useEffect(() => {
window.onbeforeunload = function() {
return true;
};
return () => {
window.onbeforeunload = null;
};
}, []);
Class 组件
componentDidMount(){
window.onbeforeunload = function() {
return true;
};
}
componentDidUnmount(){
window.onbeforeunload = null;
}
您可以将验证设置为仅在条件为 true
时添加警报。
功能组件
useEffect(() => {
if (condition) {
window.onbeforeunload = function() {
return true;
};
}
return () => {
window.onbeforeunload = null;
};
}, [condition]);
Class 组件
componentDidMount(){
if (condition) {
window.onbeforeunload = function() {
return true;
};
}
}
componentDidUnmount(){
window.onbeforeunload = null;
}