使用 React Router 和 Redux Simple Router 进行 onEnter 转换不会渲染新路由的组件

2024-02-12

我有一个使用react @0.14、redux @3.05、react-router @1.0.3 和 redux-simple-router @2.0.2 的应用程序。我正在尝试根据商店状态为我的一些路线配置 onEnter 转换。转换挂钩成功触发并将新状态推送到我的商店,这会更改 url。但是,页面上呈现的实际组件是来自路由匹配的原始组件处理程序,而不是新 url 的新组件处理程序。

这是我的routes.js文件看起来像

export default function configRoutes(store) {
  const authTransition = function authTransition(location, replaceWith) {
    const state = store.getState()
    const user = state.user

    if (!user.isAuthenticated) {
      store.dispatch(routeActions.push('/login'))
    }
  }

  return (
    <Route component={App}>
      <Route path="/" component={Home}/>
      <Route path="/login" component={Login}/>
      <Route path="/dashboard" component={Dashboard} onEnter={authTransition}/>
      <Route path="/workouts" component={Workout} onEnter={authTransition}>
        <IndexRoute component={WorkoutsView}/>
        <Route path="/workouts/create" component={WorkoutCreate}/>
      </Route>
    </Route>
  )
}

这是我的Root.js插入到 DOM 中的组件

export default class Root extends React.Component {
  render() {
    const { store, history } = this.props
    const routes = configRoutes(store)

    return (
      <Provider store={store}>
        <div>
          {isDev ? <DevTools /> : null}
          <Router history={history} children={routes} />
        </div>
      </Provider>
    )
  }
}

澄清一下,如果我转到“/workouts”,它将触发 onEnter authTransition 挂钩,调度 redux-simple-router 推送操作,将 url 更改为“/login”,但会在页面上显示 Workout 组件。查看 Redux DevTools 表明state -> router -> location -> pathname是“/登录”。

状态流为

  1. @@INIT
  2. @@ROUTER/UPDATE_LOCATION(/锻炼)
  3. @@ROUTER/UPDATE_LOCATION(/登录)

我是否错误地通过商店到达路线?我不明白为什么下一个 Router/Update_Location 不起作用


结果你想使用react-router api(替换),而不是redux-simple-router来控制你的转换。

const authTransition = function authTransition(nextState, replace, callback) {
  const state = store.getState()
  const user = state.user

  // todo: in react-router 2.0, you can pass a single object to replace :)
  if (!user.isAuthenticated) {
    replace({ nextPathname: nextState.location.pathname }, '/login', nextState.location.query)
  }

  callback()
}

另外,要小心。我看到了很多有关反应路由器替换传递单个对象的文档。这是针对 React-router 2.0-rc* 的。如果您使用的是react-router 1.0,您将需要传递replace 3个单独的参数。

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

使用 React Router 和 Redux Simple Router 进行 onEnter 转换不会渲染新路由的组件 的相关文章

随机推荐

  • Docker Tomcat容器无法访问Postgres容器

    我有一个带有 postgres 的 alpine docker 带有监听地址 并监听 5432 我正在使用它进行部署 docker run d name postgres me postgres v1 以及带有 oracle jre8 的
  • Sequelize 在查询中返回连接表

    我的 MSQL 表中这两个模型之间存在多对多关系 场所 代表可以有多个所有者 员工 的场所 员工 代表员工 可以是首席执行官或销售员工或任何其他人员 我在用续集 questions tagged sequelize像这样建立关系 关系员工
  • sed 命令中的破折号 e(-e) 是什么意思?

    我是 sed 的新手 总是在输入文件上执行一个命令 最近我尝试使用 e 要处理多个命令 但我无法弄清楚它是如何工作的 默认打印非常烦人 所以我无法弄清楚命令的执行顺序 sed e command 1 e command 2 input tx
  • 原子整数incrementAndGet()线程安全吗?

    原子整数incrementAndGet 方法线程安全吗 我没有看到其中使用同步关键字 我使用以下代码来生成唯一 ID public enum UniqueIdGenerator INSTANCE private AtomicLong ins
  • python:读取json并循环字典

    我正在学习 python 我像这样循环将 json 转换为字典 它可以工作 但这是正确的方法吗 谢谢 import json output file open output json read output json json loads
  • 启动集群时在 EMR 上配置 Zeppelin 的 Spark 解释器

    我正在 EMR 上创建集群并配置 Zeppelin 以从 S3 读取笔记本 为此 我使用一个 json 对象 如下所示 Classification zeppelin env Properties Configurations Classi
  • 无法使用 PowerMockRunner 运行 JUnit 测试

    我有一个基于 Gradle 的 Java 项目 我现在想使用 PowerMock 模拟私有方法 问题是我无法使用 PowerMockRunner 因为当我添加 RunWith org powermock modules junit4 Pow
  • 逻辑表达式解析器

    我正在尝试为以下表达式创建一个逻辑表达式解析器 变量A gt 变量B 而不是变量C 对于给定的变量值 解析器应该能够返回结果是 true 还是 false 基本上 表达式仅包含变量 逻辑运算符 或 与 蕴涵 等价 否定和括号 我想问实现这种
  • 将属性文件中的所有键和值作为 Spring 中的 Map 注入

    有人可以提供一些想法来注入属性文件中的所有动态键和值并将其传递为Map to DBConstants使用 Setter 注入和 Collection 的类 密钥事先未知并且可能会有所不同 Example Property File that
  • Maven 不执行任何单元测试

    我正在使用带有多模块的 Maven 有3个项目 foo the parent project foo core foo bar 我配置了所有依赖项和插件foo s pom
  • 我们什么时候以及为什么需要ApplicationRunner和Runner接口?

    我正在学习Spring引导 有哪些典型用例ApplicationRunner或任何跑步者界面 import org junit jupiter api Test import org springframework boot Applica
  • 在 python 中将文件路径作为命令行参数传递

    我需要在文件中写入一些内容 我通过 python 命令行传递这些内容 我正在使用下面的代码mycode py import csv import sys path sys argv 1 row 4 Danny New York with o
  • Spring MVC:进行 AJAX 调用后在对话框中显示数据

    我是 Spring 和 Web 技术的新手 我有一个表 其中包含带有超链接的列 当我单击一行的超链接时 我需要在对话框中显示该行数据以及其他详细信息 我的控制器方法返回一个ModelAndView其中包含我需要显示的数据和显示页面 问题 如
  • 三星中的InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS

    在我的应用程序中 我有一个EditText 带有一个按钮来更改键盘输入类型 代码 ToggleCambiarTeclado setOnClickListener new OnClickListener Override public voi
  • 曾经有效的相同代码现在返回异常

    我正在尝试在几个股票代码之间进行简单的关联 我之前运行过相同的代码并且有效 现在 它返回一个异常 该异常引用了一堆文件并包含我不理解的其他消息 此外 必须在控制台中手动停止该命令 我对 python 和一般编程都很陌生 我正在使用 Spyd
  • 子活动完成时有时不会调用 onActivityResult

    在测试过程中 我注意到有时子活动的 finish 不会执行 onActivityResult 大多数时候它工作正常 但我无法弄清楚这个问题何时以及为何发生 子活动开始 public void launchSubActivity Class
  • 使用Java通过FTP将所有目录复制到服务器

    我需要将一个目录从本地磁盘复制到服务器 该目录包含很多目录 子目录和文件 想想目录的层次结构树 以下是复制一个文件的示例 public void saveFilesToServer throws IOException FTPClient
  • “保留执行”的含义

    阅读答案来自在c标识符中使用下划线的规则是什么 https stackoverflow com questions 228783 what are the rules about using an underscore in a c ide
  • 为什么并行化会如此显着地降低性能?

    我有一个 OpenMP 程序 数千行 无法在这里重现 其工作原理如下 它由工作线程和任务队列组成 一个任务由一个卷积组成 每次工作线程从工作队列中弹出任务时 它都会执行所需的卷积 并可选择将更多卷积推送到队列中 没有特定的 主 线程 所有工
  • 使用 React Router 和 Redux Simple Router 进行 onEnter 转换不会渲染新路由的组件

    我有一个使用react 0 14 redux 3 05 react router 1 0 3 和 redux simple router 2 0 2 的应用程序 我正在尝试根据商店状态为我的一些路线配置 onEnter 转换 转换挂钩成功触