react | 如何检测页面刷新 (F5)

IT技术 javascript reactjs browser page-refresh
2021-02-24 10:35:54

我正在使用React js我需要检测page refresh. 当用户点击刷新图标或按 F5 时,我需要找出事件。

通过使用 javascript 函数尝试了stackoverflow 帖子

我使用 javascript 函数beforeunload仍然没有运气。

onUnload(event) { 
  alert('page Refreshed')
}

componentDidMount() {
  window.addEventListener("beforeunload", this.onUnload)
}

componentWillUnmount() {
   window.removeEventListener("beforeunload", this.onUnload)
}

这里我有关于stackblitz 的完整代码

6个回答

把它放在构造函数中:

if (window.performance) {
  if (performance.navigation.type == 1) {
    alert( "This page is reloaded" );
  } else {
    alert( "This page is not reloaded");
  }
}

它将起作用,请在stackblitz上查看此示例

我正在使用反应路由器。当我切换菜单时它被触发
2021-04-29 10:35:54
但问题来了。即使页面更改也会触发它。不仅页面刷新。我只需要刷新页面
2021-05-12 10:35:54
请查看警告文本,如果页面刷新,将触发“此页面已重新加载”警告,否则将触发另一个警告“此页面未重新加载”。所以你可以只使用第一个条件
2021-05-13 10:35:54
@MariaJeysinghAnbu 说正确的它会触发刷新警报,即使在 IE 中更改了路由。在 IE 中,即使用户更改路由,其值为 1,但在 chrome 中其工作方式不同
2021-05-19 10:35:54
只需更改条件的内容
2021-05-20 10:35:54

如果您正在使用 React Hook、UseEffect,您可以将以下更改放入您的组件中。它对我有用

useEffect(() => {
    window.addEventListener("beforeunload", alertUser);
    return () => {
      window.removeEventListener("beforeunload", alertUser);
    };
  }, []);
  const alertUser = (e) => {
    e.preventDefault();
    e.returnValue = "";
  };

您的代码似乎工作得很好,您的警报将不起作用,因为您没有停止刷新。如果您console.log('hello')显示输出。

更新 - -

这应该会阻止用户刷新,但这取决于您想要发生的情况。

componentDidMount() {
    window.onbeforeunload = function() {
        this.onUnload();
        return "";
    }.bind(this);
}
谢谢。我认为,它已在页面加载之前被调用。用户刷新页面后我需要
2021-04-27 10:35:54
只有在页面刷新时,我才必须调用这样的函数 this.props.actions.loaddata()
2021-05-06 10:35:54
我可以调用该函数中的任何onUnload函数吗?因为我试过它似乎不起作用。
2021-05-17 10:35:54
您需要提示用户停止刷新的内容。你想把什么功能放在里面onUnload我会用一个例子来更新我的答案。
2021-05-19 10:35:54
Abdellatif 似乎有一个比我更好的解决方案。
2021-05-19 10:35:54

不幸的是,由于 performance.navigation.type 已被弃用,目前接受的答案不能被视为可以接受

最新的 API 是实验性的 ATM。作为一种解决方法,我只能建议在 redux(或您使用的任何东西)存储中保存一些值以指示重新加载后的状态,并在第一次路由更改时更新它以指示路由不是因为刷新而更改。

不是,但它可用于通过设置一些全局状态标志来识别路由更改。如果标志有默认值,则表示我们在刷新后处于状态,否则为路由更改。
2021-05-07 10:35:54
不认为 redux 在浏览器刷新后幸存下来
2021-05-08 10:35:54

它实际上非常简单,每当您重新加载页面时,这都会添加默认警报。

功能组件

useEffect(() => {
    window.onbeforeunload = function() {
        return true;
    };

    return () => {
        window.onbeforeunload = null;
    };
}, []);

类组件

componentDidMount(){
    window.onbeforeunload = function() {
        return true;
    };
}

componentDidUnmount(){
    window.onbeforeunload = null;
}

您可以将验证设置为仅在条件为 时添加警报true

功能组件

useEffect(() => {
    if (condition) {
        window.onbeforeunload = function() {
            return true;
        };
    }

    return () => {
        window.onbeforeunload = null;
    };
}, [condition]);

类组件

componentDidMount(){
    if (condition) {
        window.onbeforeunload = function() {
            return true;
        };
    }
}

componentDidUnmount(){
    window.onbeforeunload = null;
}
我如何在 react.js 类组件中使用此代码?
2021-04-25 10:35:54
有什么办法可以修改重新加载后出现的提示中的消息吗?
2021-05-17 10:35:54
@Mayur Vaghasiya,您可以为类组件使用componentDidMountcomponentDidUnmount运行。我的 useEffect 上的一个是 for componentDidMount,而我的 useEffect 返回上的一个是 for componentDidUnmount稍后我有时间时会编辑我的答案。
2021-05-18 10:35:54