根据之前从本地存储选择的过滤器推送历史记录

2024-04-14

由于我是 React 新手,我尝试根据本地存储中存储的先前选择的过滤器正确实现路由,然后在应用程序启动时将它们推送到历史记录(有超时)。

如果没有超时,应用程序会在获取用户上下文/令牌身份验证之间跳转

http://localhost:3000/#tokenid=123456789012345678901234567890

以及我想要路由到的实际 URL:

http://localhost:3000/monthly?date=1629361313861&dispatcher=Srv+DE+01

由于我不知道这是否是正确的方法,并且由于 UserContext 尚未建立,它会“跳跃”,因此我非常感谢有关我遇到的这个问题的任何建议。

App.tsx

import React from 'react';
import { Provider } from 'react-redux';
import { ConnectedRouter } from 'connected-react-router';
import { Switch, Route } from 'react-router-dom';
import { CssBaseline } from '@material-ui/core';
import { ToastContainer } from 'react-toastify';
import { MuiPickersUtilsProvider } from '@material-ui/pickers';
import DateFnsUtils from '@date-io/date-fns';
import 'react-toastify/dist/ReactToastify.css';

import store from './services';
import history from './utils/history';
import './i18n';

import UserContext from './modules/UserContext';
import FactBox from './modules/FactBox';
import ModalRoot from './components/ModalRoot';
import pathsConst from './const/paths';
import DailyView from './pages/DailyView';
import WeeklyView from './pages/WeeklyView';
import MonthlyView from './pages/MonthlyView';
import NotFound from './pages/404';

const App = () => (
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <MuiPickersUtilsProvider utils={DateFnsUtils}>
        <CssBaseline />
        <UserContext>
          <Switch>
            <Route exact path={pathsConst.INDEX} component={DailyView} />
            <Route exact path={pathsConst.WEEKLY_VIEW} component={WeeklyView} />
            <Route exact path={pathsConst.MONTHLY_VIEW} component={MonthlyView} />
            <Route component={NotFound} />
          </Switch>

          <FactBox />
          <ModalRoot />
        </UserContext>

      </MuiPickersUtilsProvider>
    </ConnectedRouter>

    <ToastContainer
      position="bottom-center"
      autoClose={6000}
      hideProgressBar
      pauseOnHover
    />
  </Provider>
);

export default App;

减速器.ts

import { combineReducers } from 'redux';
import { connectRouter as router } from 'connected-react-router';

import history from '../utils/history';
import loading from './loading/reducer';
import modal from './modal/reducer';
import resources from './resources/reducer';
import departments from './departments/reducer';
import dispatchers from './dispatchers/reducer';
import projects from './projects/reducer';
import events from './events/reducer';
import uiSettings from './uiSettings/reducer';
import userContext from './userContext/reducer';
import holidays from './holidays/reducer';

const rootReducer = combineReducers({
  router: router(history),
  loading,
  modal,
  resources,
  departments,
  dispatchers,
  projects,
  events,
  uiSettings,
  userContext,
  holidays,
});

export default rootReducer;

/utils/history.ts

import { createBrowserHistory } from 'history';
import pathsConst from '../const/paths';

function getHistory () {
  let history = createBrowserHistory({
    basename: process.env.PUBLIC_URL,
  });
  let lastPath = '/';
  let lastQueryString = localStorage.getItem("lastQueryString");
  let lastPathTemp = localStorage.getItem("lastPath");
  let lastURL = localStorage.getItem("lastURL");
  let adalID = localStorage.getItem("adal.idtoken");
  if ( lastPathTemp !== null ) {
    if (lastPathTemp.includes('weekly')=== true) {
      lastPath = pathsConst.WEEKLY_VIEW;
    }
    else if (lastPathTemp.includes('monthly')=== true) {
      lastPath = pathsConst.MONTHLY_VIEW;
    }
    else {
      lastPath = pathsConst.INDEX;
    }
  } 

  // DBG: 
  console.log('DBG - LAST QUERY STRING:', lastQueryString);
  console.log('DBG - LAST URL:', lastURL);

  if ( lastQueryString !== null && lastPath !== null && adalID !== null  ) { 

    let lastQueryStringEdit = "?date=" + Date.now();
    // INFO: Check for additional query params
    if (lastQueryString.indexOf("&") !== -1) {
      let pos1 = lastQueryString.indexOf("&");
      let substr = lastQueryString.substring(pos1, lastQueryString.length);
      lastQueryStringEdit = "?date=" + Date.now() + substr;
    } 

      setTimeout(function() {
      console.log('DBG - PUSHING.............................');
      history.push({
      pathname: lastPath,
      search: lastQueryStringEdit
      });
      }, 2000);

    return history;

  }
  else { // INFO: Return as is

    return history;

  }
}

const history  = getHistory();

export default history;

这是我访问 url 属性的方法

//for accessing path of url
const {pathname} = useLocation();

...

//for going back to the last used url
const navigate = useNavigate(); //react router v6
navigate(-1) // to go back to last used url
navigate(-2) // go back to second last used url
navigate(-3) // so on ...

... 为了在 url 中搜索特定参数,我按如下方式创建自定义挂钩,并传入我想要获取其值的所需变量名称

import { useLocation } from "react-router-dom";

export default function useGetParameter(name: string) {
  const { search } = useLocation();
  const query = new URLSearchParams(search);
  return query.get(name);
}
//this custom hook return the required param in url or null if it does not exist

推荐

我建议不要以这种方式将值存储在 localstorage 中,因为 localstorage 值没有过期时间,您必须显式地将它们从浏览器中删除。利用会话存储,例如(useState、this.state、useContext、Redux 等)来存储和访问变量属性。但是,如果您在任何情况下仍希望将数据保留在本地存储上较长时间,那么我建议您使用其他库来为您完成这项工作。好处是,这些库被配置为更具约束力并为您提供逻辑分离。请查看还原持续 https://github.com/rt2zz/redux-persist

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据之前从本地存储选择的过滤器推送历史记录 的相关文章

随机推荐

  • 机器人框架中“If语句”的使用

    我们如何在机器人框架中使用if语句 我想仅当关键字满足某些条件时才执行它 否则它会执行其他代码 这在机器人框架用户指南 http robotframework org robotframework latest RobotFramework
  • WT中如何清理内存?

    更新 2013 年 3 月 27 日 您还必须意识到 从 Wt 3 3 0 开始 只有收到请求后才会清除会话 请参阅这个回复 http redmine webtoolkit eu boards 2 topics 5614 r 5615 me
  • NetBeans 模块项目中是否可以依赖 JAR 文件?

    我创建了一个 NetBeans 模块项目 需要添加对我创建的 JAR 文件的依赖项 这可能吗 我只看到添加对其他模块的依赖项的选项 我正在使用 NetBeans 6 5 1 THANKS 模块只能依赖于其他模块 创建引用您的类的库 然后创建
  • 循环遍历动态添加元素的数组

    jQuery 新手 请求帮助解决我无法解决的问题 克隆的表行包含
  • 使用 run-as 命令在 Samsung 4.4.2“程序包未知”上调试本机应用程序

    在尝试通过 Galaxy S4 上的 Eclipse 调试 Android 本机应用程序时 我在 run as 命令中收到 包未知 错误 有一个开放的这说明了与许可相关的问题 data system packages list文件必须是rw
  • NSMutableArray 与 NSArray 哪个更好

    这是一个有点愚蠢的问题 但是如果我想将一个对象添加到数组中 我可以使用两者来完成NSMutableArray and NSArray 我应该使用哪个 NSMutableArray array1 array1 addObject obj NS
  • 当另一个应用程序开始/停止播放音频时,我的应用程序可以收到通知吗?

    我的 iOS 游戏有音乐和音效 我想让用户听自己的音乐来代替游戏的背景音乐 一个简单的解决方案是添加一个新的菜单项来禁用游戏的背景音乐 但是 我想避免创建新的菜单项 除非我确信这种方法对用户来说更糟糕 我目前的做法 将音频会话类别设置为AV
  • 为什么 RNN 需要两个偏置向量?

    In Pytorch RNN 实现 http pytorch org docs master nn html highlight rnn torch nn RNN 有两个偏差 b ih and b hh 为什么是这样 它与使用一种偏差有什么
  • 如何强制 PM2 使用我的应用程序的最新版本?

    我首先调用 PM2pm2 start index js watch ignore watch node modules 然而 尽管告诉它查看我的文件是否有更改然后重新加载 但当我从 git 拉取时 它并没有使用我的应用程序的最新版本 要测试
  • 尽管手机设置了静音模式,但在 Android 通知中播放声音

    我的应用程序正在显示通知 并且当显示通知时 会播放声音 但是当我的手机处于 静音模式 时 不会播放通知 我想 覆盖 音量设置 并在设置了静音模式的情况下播放声音 有办法做到吗 您好 您可以使用 MediaPlayer 作为通知声音 方法是启
  • 如何返回元素的个数?

    我必须编写一个函数 它接受一个整数列表作为参数并返回列表中小于 1 的整数的数量 到目前为止 我所拥有的是一个仅返回列表中的整数个数的函数 我不确定应该在哪里 是否放置 if 语句和计数器以仅返回有多少个整数小于 1 export num
  • HTML 复选框的选中属性的正确值是多少?

    我们都知道如何在 HTML 中形成复选框输入
  • Google Play,发布应用程序更新,“本机平台”问题

    我有一个混合应用程序 我过去曾发布过更新 在当前的更新中 我添加了原生 facebook 登录 这需要在 libs 文件夹下添加 facebook jar 包 现在 当我在 PlayStore 中添加我的 APK 时 一切都很好 除了本机平
  • Dart:在 Windows 上构建时出现“无效参数:路径中存在非法字符”

    我的 index html 文件中的违规行如下 错误报告是 Build error Transform polymer PolymerBootstrapTransformer on myproj frontend web index htm
  • Ping 到存储过程以了解 .net 中的执行是否已完成?

    我必须执行一个存储过程 当我执行该操作时 我必须继续检查 ping 该执行是否完成 我将更新标签 我们在 C 中有什么办法可以做到这一点吗 异步调用存储过程 并让回调更新您的标签 这是一篇关于它的文章 http www devx com d
  • 计算机编程艺术练习题:第 1 章,问题 8

    我正在做 TAOCP 第 1 卷第 3 版的练习 但无法理解以下练习的答案中使用的语法 第 1 章练习 8 Computing the greatest common divisor of positive integers m n by
  • 干预/图像需要文件信息

    我在干预 图像方面遇到问题 Laravel composer install intervention image 2 1 1 requires ext fileinfo gt the requested PHP extension fil
  • 如何改进构建器模式?

    动机 最近我寻找一种方法来初始化复杂的对象 而不需要向构造函数传递大量参数 我尝试使用构建器模式 但我不喜欢这样的事实 即我无法在编译时检查是否确实设置了所有需要的值 传统建造者模式 当我使用构建器模式来创建我的Complex对象 创建更加
  • 在 C 中无需 va_list 即可访问可变参数函数的参数

    是否可以使用指向最后一个命名参数的指针 void 指针 来迭代可变参数函数的参数 我知道这不是使用可变参数的正确方法 但我仍然感兴趣这是否可行 将指针设置到字符串的末尾不起作用 因为在我开始移动指针后 它指向程序中使用的其他字符串 incl
  • 根据之前从本地存储选择的过滤器推送历史记录

    由于我是 React 新手 我尝试根据本地存储中存储的先前选择的过滤器正确实现路由 然后在应用程序启动时将它们推送到历史记录 有超时 如果没有超时 应用程序会在获取用户上下文 令牌身份验证之间跳转 http localhost 3000 t