【问题标题】:How to know which component was being rendered before the page was refreshed without using react-router?如何在不使用 react-router 的情况下知道刷新页面之前正在渲染哪个组件?
【发布时间】:2019-09-03 05:11:54
【问题描述】:

基本上,我想要做的是在页面刷新时呈现与刷新页面时呈现的相同组件。如何获取正在渲染的组件的名称。另外,我还没有在项目中的任何地方使用 react-router。没有 react-router 是否可以做我要求的事情?

我使用 onbeforeunload 事件来检测页面刷新。现在我应该在它的函数中做什么来渲染相同的组件? 此代码在我的 app.js 组件的 componentDidMount() 中

window.onbeforeunload = function(e) { e.preventDefault()
  return console.log('Hello123')
};

这是在控制台中记录 Hello123。唯一的问题是获取最后呈现的组件的名称。有什么方法可以让应用记住最后渲染的组件的名称,刷新后检查是否有名称,如果有则渲染该组件。

例如,假设我正在渲染一个名为 TravellerList 的组件,并且在单击按钮时我正在渲染名为 AddTraveller 的组件。现在如何获取正在渲染的组件的名称并将其存储在变量中 不使用 react-router

【问题讨论】:

  • 您可以考虑使用 localStorage 来设置正在加载的最新视图组件。如果您使用的是 React 路由器,那么您可以检查这个 localStorage 项并强制加载某个路由。
  • 是的,我看到了这个问题,但在这里我想做的是记住最后呈现的组件的名称,并将其存储在一个变量中,而不使用 react-router。我也没有在我的项目中的任何地方使用过 react-router
  • @Winston 是的,这就是我在项目中没有使用 react-router 的问题,这就是为什么询问是否有办法在不使用 react-router 的情况下完成此操作

标签: javascript reactjs


【解决方案1】:

如果您想在页面刷新后获取值,我认为您必须使用本地存储或 Cookie,因为在页面刷新后,JavaScript 中的所有对象都会被刷新。您可以做的是创建一个本地存储或 cookie 对象,就像在最高级别组件中一样。

var myObj = {
        component1Rendered:false,
        component2Rendered:false,
        component3Rendered:false,
        component4Rendered:false

    };  

然后在你渲染一些组件时为该对象设置值 举个例子: 在组件 1 在所有组件中的 componentDidMount 内,在渲染时更新该对象。

        componentDidMount() {
        var myObj = {
            component1Rendered:true,
            component2Rendered:false,
            component3Rendered:false,
            component4Rendered:false

        };

            localStorage.setItem('storeObj', JSON.stringify(myObj));
        // please not that this is a sample set statement in your scenario update only the specific value of that object in local-storage 
       }

页面刷新发生后,检查本地存储对象,找到之前使用您的函数渲染过的组件,

window.onbeforeunload = function(e) { e.preventDefault()
  return console.log('Hello123')
 storeObj = localStorage.getItem('storeObj');
// Filter storeObj and get the rendered components
};

【讨论】:

  • 是的,这很有用
  • 好的..你试过了吗?
  • 现在有一个新问题。请参阅我有呈现 TravellerList 组件的 App 组件,该组件在单击按钮时在对话框内呈现 AddTraveller 组件。现在我在 AddTraveller 中,然后以某种方式刷新了我从本地存储中存储和检索的页面。现在如何在对话框中显示 AddTraveller 组件,就像在单击按钮时显示一样?
  • 您必须向本地存储添加另一个参数,例如 dialogBoxOn=false 并且当您单击按钮时创建一个单独的方法将其设置为 true。当刷新发生时,检查 TravellerList(inside componentDidMount) 该对话框的值,如果为真,则从代码端打开对话框。
【解决方案2】:

你可以试试这个

  componentDidMount() {
      window.addEventListener('beforeunload', this.onBeforeUnload);
  }
  componentWillUnmount() {
    window.removeEventListener('beforeunload', this.onBeforeUnload);

  }
  onBeforeUnload = (e) => {
    const msg = 'Do you want to leave this site?\n\nChanges you made may not be saved.';
    e.returnValue = msg;
    return msg;
  }

你需要反应路由器。检查这个React Router - Stay at the same page after refresh

【讨论】:

  • 主要目的是即使在页面刷新后也渲染相同的页面。这可能吗?
  • 我不明白。你想要重定向吗?
  • 我已经编辑了这个问题,也许现在更清楚了
  • 我想要的是让用户刷新页面,但它应该呈现与用户再次加载页面时刷新页面时相同的组件。
  • 你在用 react-router 吗?
猜你喜欢
  • 2017-12-31
  • 2018-12-31
  • 2020-08-31
  • 2019-06-26
  • 1970-01-01
  • 2021-01-11
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多