当前位置: 首页 > 面试题库 >

Redux路由器-刷新后如何重播状态?

郁鸿博
2023-03-14
问题内容

我有一个多步骤表单应用程序,而我正在努力解决如何保存我的redux状态并在例如刷新后重播它的问题?在应用程序中前进/后退可以按预期工作,但是刷新浏览器后,我以前的状态为空。理想情况下,我希望能够将与路径相关的先前状态保存在会话存储中,以便以后可以重播,但是我不知道如何轻松地做到这一点。有没有人做过这样的事情并且可以提供一些指示?谢谢。


问题答案:

看来您正在尝试在多页上下文中使用单页应用程序框架。为了使两者更好地配合使用,您可以研究制作自己的中间件,该中间件使状态之间来回同步,localStorage以创建在刷新/页面导航后似乎没有丢失任何状态的应用程序。

  1. 与redux-logger记录前一个状态和下一个状态的方式类似,我可能会从在函数创建的开始(localStorageLoad)和结束(localStorageDumpcreateStoreWithMiddleware(恰好在redux-logger)之前插入中间件开始:
    // store/configureStore.js

    const createStoreWithMiddleware = applyMiddleware(
        localStorageLoad, thunk, promise, localStorageDump, logger
    )(createStore);
  1. 然后,当您初始化应用以在应用呈现之前加载存储状态时,立即触发初始操作:
    // index.js

    const store = configureStore();

    store.dispatch({ type: 'INIT' });

    ReactDOM.render(<App />, document.getElementById('root'));

localStorageLoad会处理的INIT行动,并派遣某种SET_STATE行动,其中将包含与先前保存在状态的有效载荷localStorage

    // middleware/localStorageLoad.js

    export default store => next => action => {
        const { type } = action;
        if (type === 'INIT') {
            try {
                const storedState = JSON.parse(
                    localStorage.getItem('YOUR_APP_NAME')
                );
                if (storedState) {
                    store.dispatch({
                        type: 'RESET_STATE',
                        payload: storedState
                    });
                }
                return;
            } catch (e) {
                // Unable to load or parse stored state, proceed as usual
            }
        }

        next(action);
    }

然后,添加一个reducer,用该负载替换状态,从而像以前一样有效地重新启动应用程序。

  1. 要完成循环,您需要localStorageDump在链的末尾提供一个中间件,该中间件将每个简化状态的对象保存到中localStorage。像这样:
    // middleware/localStorageDump.js

    export default store => next => action => {
        const state = store.getState();
        localStorage.setItem('YOUR_APP_NAME', JSON.stringify(state));
        next(action);
    }

只是一个想法,实际上还没有尝试过。希望能帮助您开始寻求解决方案。



 类似资料:
  • Redux提倡使用具有单一状态的单一存储。但是,使用react router,您可以获得多个页面,每个页面都有自己的顶级根组件。 一个人应该如何用一个有多个页面的反应路由器应用程序连接redux?React-router 1.0不再允许您向路由传递道具,因此使路由器成为包含所有页面状态的顶级组件不再可能也不可行。

  • 问题内容: Redux文档的第一个原理是: 整个应用程序的状态存储在单个存储中的对象树中。 我实际上以为我很好地理解了所有原则。但是我现在对应用程序的含义感到困惑。 我知道,如果应用程序只是网站中复杂的小部分之一,并且仅用一页即可工作。但是,如果申请意味着整个网站怎么办?我应该使用LocalStorage还是cookie或其他保留状态树的东西?但是如果浏览器不支持LocalStorage怎么办?

  • 使用redux和反应路由器,我想访问路由指定的组件以外的组件上的路由参数。 我已经对react-router、redux和react-router-redux进行了如下设置,我想从我的redux存储访问reportId参数。 我已经尝试连接react-redux路由器来存储路由状态,但是我发现除了活动路由的完整路径之外,redux内部没有任何有用的存储。这让我可以选择从redux中的路径解析出re

  • 有没有可能--在中也这样做? 我为什么需要这个?让我用一个例子来解释: 创建新类别的路由是,在保存时显示,并且要将路由(23-是新项的id存储在数据库中)

  • 问题内容: 当前,我们的项目正在使用default ,而我正在使用此“ hack”来进行更改,而无需重新加载页面: 和在 我想到的替换用筑巢路线,但无法找到这。 有可能吗? 我为什么需要这个?让我用一个例子来解释: 创建新类别的路线是在SAVE 之后显示的,我想将路线更改为(23-是存储在db中的新项目的id) 问题答案: 只需使用即可代替 。内部调用,但会自动将选项设置为。您可以呼叫和设置。例如

  • 问题内容: 我们的React Native Redux应用程序使用JWT令牌进行身份验证。有许多操作需要此类令牌,​​并且例如在应用加载时会同时分派许多令牌。 例如 双方并要求JWT。我们将令牌保存在和中。我的问题是如何处理令牌到期。 最初,我将使用中间件来处理令牌到期 } 我遇到的问题是,对于令牌和操作,都会刷新令牌,因为在分发令牌和令牌时,令牌将过期。理想情况下,我想“暂停”需要身份验证的操作

  • 我遇到的问题是,和操作都将刷新令牌,因为在分派时,令牌将过期。理想情况下,我希望“暂停”需要身份验证的操作,直到令牌刷新。有没有一种方法可以用中间件做到这一点?

  • 我有一个问题,看起来很简单,但现在不那么简单了(对我来说): 我已使用Vue cli(路由器、VueX、PWA)设置了一个Vue项目。我一如既往地设置了一些路由(按照文档中的建议)和VueX中的一些状态字段: 在我的视图/组件中,我在实例上使用方法,以编程方式死记硬背,如下所示: ,其中是等待的