如何为传奇提供历史实例?

2023-12-28

我想在成功登录后重定向到新页面。 路线(V4)的使用方式如下:

import { browserHistory } from '....browser_history_signleton';
...

class App extends Component {
  render() {
    const { authentication: { isSignedIn } } = this.props;
    return (
      <ConnectedRouter history={browserHistory}>
        <div>
          <Header/>
          <Route exact path="/" component={Home}/>
          <PrivateRoute isAuthorized={isSignedIn} path="/page1" component={PageOne}/>
          <PrivateRoute isAuthorized={isSignedIn} path="/page2" component={PageTwo}/>
        </div>
      </ConnectedRouter>
    );
  }
}

这个传奇看起来像:

import { browserHistory } from '....browser_history_signleton';

export function* loginSaga() {
  while (true) { // eslint-disable-line no-constant-condition
    try {
      const payload = yield take(LOGIN_SUBMIT);
      const raceResult = yield race({
        signin: call(loginRequest, payload),
        logout: take('LOGOUT')
      });
      if (raceResult.signin) {
        const { data }  = raceResult.signin;
        yield put(loginRequestSucceeded(data));
        const redirectUrl = `.....based on location.state.from.pathname`
        browserHistory.push(rediretUrl);
        ...

我的主要问题是如何分享browserHistory. createHistory from history模块不是单例,所以我必须添加:

// browser_history_signleton.js
import createHistory from 'history/createBrowserHistory';

export const browserHistory = createHistory();

提供最有效的方法是什么history传奇的实例?


我发现了两个感觉不错的选项,并且我都使用了。我很好奇是否有人有任何问题。

选项 1:通过history反对传奇。

它并不明显,但sagaMiddleware.run函数采用第二个参数,该参数被转发到 sagas。 IE:

/wherever/you/start/saga.js

import { createBrowserHistory } from "history";
import saga1 from "./saga1.js";

const  function* rootSaga({ history }) {
  yield all([saga1({ history })])
}

const sagaTask = sagaMiddleware.run(rootSaga, { history: createBrowserHistory() });

我在这里学到了这一点:https://github.com/ReactTraining/react-router/issues/3972#issuecomment-251189856 https://github.com/ReactTraining/react-router/issues/3972#issuecomment-251189856

这是访问历史功能的一种干净的方式。在实际的传奇中,您将像平常一样使用历史对象。

./saga1.js

export default ({ history }) => [
  takeEvery(actions.DO_SOMETHING_THEN_NAVIGATE, function*({ payload }) {
    ...do something
    history.push("/somewhere");
  }),
];

选项 2:使用单个 saga 来管理history使用操作进行对象和导航

这是选项 1 的扩展。专用一个传奇来“管理”历史对象 - 使用操作推送/替换。 IE:

/my/history/saga.js


export default ({ history }) => [ // history is passed in ala option 1.
  takeEvery(actions.HISTORY_PUSH, function*({ payload }) {
    const pathname = payload.fooParam;
    yield history.push(pathname);
  }),
  takeEvery(actions.HISTORY_REPLACE, function*({ payload }) {
    yield history.replace({ pathname: payload.barParam });
  }),
];

这可以让你的 redux 存储和操作保持干净,免受奇怪的黑客攻击some社区的提议 - 就像在行动中传递历史对象一样。

让我知道你的想法。

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

如何为传奇提供历史实例? 的相关文章

随机推荐

  • 复合 JS 关系访问

    我定义了 2 个模式对象 如下所示 用于 mongodb var User describe User function property name String property email String property passwor
  • OpenMP 分发中的 SECTIONS 指令如何工作?

    在OpenMP中使用时omp sections 线程是否会被分配到内部的块中sections 或者将每个线程分配给每个部分 When nthreads 3 pragma omp sections pragma omp section pri
  • 失踪的铁轨宝石

    我知道这个问题已经在这个网站上被问过多次 但在深入研究其他答案后 我仍然对如何解决这个问题一无所知 我刚刚从生产服务器中提取了 Rails 应用程序的副本 但出现以下错误 缺少 Rails 2 3 4 gem 请gem install v
  • 如何在 Flutter 中禁用 FlatButton 的启动突出显示?

    我有一个扁平按钮 我不希望单击按钮时突出显示 我尝试将飞溅颜色更改为透明 但这不起作用 这是我的 FlatButton 的代码 Widget button new Container child new Container padding
  • PHP 如何将数据追加到序列化数组中

    如果我有一个序列化数组 如何向其附加更多值 我应该先反序列化它 gt 添加数据然后再次序列化它吗 Yes function addItem serializedArray item a unserialize serializedArray
  • 为什么 golangticker.Stop() 在tickerTest1中不起作用?

    我知道Stop函数无法关闭通道 我只是对两个不同的结果感到困惑tickerTest1 and tickerTest2 package main import time log func tickerTest1 ticker time New
  • 如果我只有任务 ID,我可以获得 celery 任务的参数吗?

    如果我有原来的任务 我可以从中得到论据task request args 但是如果我只有任务 ID 有没有办法获取参数 看起来没有办法从AsyncResult对象 据我所知 没有办法重新创建任务 我想这样做是因为我有一个前端可以轮询后端以获
  • Clang 无法在 std::function 实例化中扩展参数包

    编译的代码片段std c 17作为唯一的编译器标志 使用 GCC 9 1 成功编译 Godbolt https godbolt org z QKJomx 使用 Clang 8 0 0 发出编译器错误 代码片段下方的错误 Godbolt ht
  • SQL Server 性能提示[重复]

    这个问题在这里已经有答案了 可能的重复 SQL WHERE 子句是否短路计算 https stackoverflow com questions 789231 is the sql where clause short circuit ev
  • 使用 python/PIL 自动裁剪图像

    谁能帮我弄清楚我的图像自动裁剪脚本中发生了什么 我有一个带有大透明区域 空间的 png 图像 我希望能够自动裁剪该空间并保留必需品 原始图像有一个方形画布 最好是矩形 仅封装分子 here s the original image 通过谷歌
  • Prolog - 简化导数

    所以我这个学期才开始使用 Prolog 并完成了实现一个非常基本的作业d function variable derivative 我这样做是这样的 d X X 1 d C X 0 atomic C C X d X E X E X E 1
  • 错误:没有为控制器定义“_sonata_admin”

    我按照文档添加自定义路线 当我单击列表视图中的按钮时 出现错误 没有 sonata admin为控制器定义 UserController以及当前的路线resetPassword 文档 http sonata project org bund
  • C#:调用 Bitmap.save() 后 Dispose() 一个 Bitmap 对象?

    我有这个 Bitmap bmp new Bitmap image image processing bmp Save path fileName 我想知道是否需要打电话bmp Dispose 在此代码之后 提前致谢 我会用using块和Pa
  • 处理过期航空里程的流程

    我正在开发一个需要处理过期航空里程的应用程序 里程可以使用 但如果在特定日期之前未使用 里程就会过期 我想确保我的里程数已过期 但如果已使用 则不要过期 因此 我必须在过期之前检查在给定日期范围内是否使用了足够的里程 以下是我的初步想法 有
  • UIWebView YouTube 嵌入视频未加载

    我在获取通过 UIWebView 嵌入到我正在制作的 iOS 应用程序中的视频时遇到一些问题 iframe 播放器加载完全正常 但是当我点击播放按钮时 白色旋转器出现一秒钟然后消失 只留下一个黑框如果我触摸黑框 我会得到标题和 i 按钮 但
  • 从数据库输出到文本区域

    我试图通过这样做将数据库字段值放入文本区域 但它不起作用
  • 尝试将创建的文本文件作为电子邮件附件发送 - 从默认文件夹

    我正在尝试一些简单的事情 例如创建一个文本文件 然后将其作为附件发送 虽然如果我使用 SD 卡它工作正常 但我不知道将它放在 标准数据文件夹 中的哪里 所以我的应用程序实际上适用于没有 SD 卡的每个人 并且该文件有点不可见 当这段代码有效
  • Dapper 抛出“DynamicMethod 的类型所有者无效”。

    所以我尝试使用 Dapper net 并且我很喜欢它 我不喜欢的是 当我尝试批量插入实体时 出现以下错误 DynamicMethod 的类型所有者无效 在 System Reflection Emit DynamicMethod Init
  • 在 JavaScript 中如何将语言代码转换为语言名称?

    我使用以下方式获取浏览器的语言代码 var lang window navigator language 这将返回代码 即 en US 如何将其转换为语言名称 即英语 Javascript 有一个 API 使用Intl使用选择的语言将语言转
  • 如何为传奇提供历史实例?

    我想在成功登录后重定向到新页面 路线 V4 的使用方式如下 import browserHistory from browser history signleton class App extends Component render co