当前位置: 首页 > 知识库问答 >
问题:

如何使用react router v4调度redux操作?

嵇星海
2023-03-14

我试图结合反应路由器v4,反应,和redux。因为react-router跟踪URL,所以我选择将该状态块排除在redux模型之外。

但我仍然需要一种方法来在react路由器发生路由更改时调度redux操作。哪里是最好的地方?

我的第一次尝试是将它放在react路由器链接的onClick属性中:

render() {

  // link config
  const links = this.props.photo.album( album => {
    <Link key={album.name} 
             to=`/album/${album.name}`
             onClick={() => this.props.dispatchAction(album.name)} />
  })

  // route config
  return (
     <div>
         {links}
         <Route path={`/album/:albumName`} component={Album}/>
     </div>
  )
}

其思想是,当用户单击链接时,dispatchAction()将更新redux状态,然后加载相册组件。

问题是,如果用户直接导航到URL(例如/album/a1),则不会发送该操作,因为从技术上讲,该链接从未被单击过。

因此,我删除了链接的onClick部分,并将dispatchAction移动到Album组件的生命周期方法:

class Album extends Component {
    // invoked when user navigates to /album/:albumName directly
    componentDidMount() {
        this.props.dispatchAction(this.props.match.params.albumName)
    }

    // invoked whenever the route changes after component mounted
    componentWillReceiveProps(nextProps) {
        if (this.props.match.params.albumName != nextProps.match.params.albumName) {
            this.props.dispatchAction(nextProps.match.params.albumName)
        }
    ....
}

现在,每当安装相册组件或更改其属性时,它都会发送还原动作。这是组合这些库的正确方法吗?

共有2个答案

赫连淳
2023-03-14

您可以创建一个自定义的路由组件,该组件在componentDidMount中调度您的操作:

class ActionRoute extends React.Component {
  componentDidMount() {
    const { pathname } = new URL(window.location.href);
    const [albumName] = pathname.split('/').slice(-1);
    this.props.dispatchAction(albumName);
  }

  render() {
    return <Route {...this.props} />
  }
}

现在,每当加载路由时,这将调度您的操作。可组合性FTW!

旁注:如果对参数化路由使用ActionRoute(例如/album/1/album/2),则还需要在componentdiddupdate中调度操作,因为如果从/album/1导航到/album/2,组件不会卸载/重新装载。

松和泰
2023-03-14

react-router-redux通过在存储上应用一个中间件来实现这一点,该中间件可以在路由更改以及初始路由更改时调度操作。这绝对是最干净的方法。

唯一的缺点是它仍然是alpha,但我们已经使用它一段时间没有任何问题。它也是react路由器的一部分附加包回购协议的一部分。

 类似资料:
  • 问题内容: 我有一个操作可以更新应用程序的通知状态。通常,此通知将是错误或某种信息。然后,我需要在5秒钟后调度另一项操作,该操作会将通知状态恢复为初始状态,因此没有通知。其背后的主要原因是提供了5秒钟后通知自动消失的功能。 我没有使用并返回其他动作的运气,也找不到在线完成的方法。因此,欢迎提出任何建议。 问题答案: 不要陷入[认为图书馆应该规定如何做每件事的陷阱。如果您想在JavaScript中执

  • 我有一个redux saga设置,工作正常。我的一个分派任务是创建一个新订单,然后一旦创建了订单,我就想用更新后的状态做一些事情。 由于 createOrder 操作触发调用 API 的重订传奇,因此存在延迟,因此在我的函数 do 之前不会更新此 .props.user 命令某些内容被调用。我可以设置一个超时,但这似乎不是一个可持续的想法。 我已经阅读了有关Stack Overflow的类似问题,

  • 我有一个更新应用程序通知状态的操作。通常,此通知将是一个错误或某种类型的信息。然后我需要在5秒后发送另一个动作,它将通知状态返回到初始状态,所以没有通知。这背后的主要原因是提供通知在5秒后自动消失的功能。 我没有使用并返回另一个操作,也找不到这是如何在网上完成的。所以欢迎任何建议。

  • 解决方案(更新): 我认为任何操作都会导致react-redux-link调用mapState函数,但是当一个操作没有改变任何事情时,情况就不是这样了。 我有一个localStorage模块,它分派操作,但不更改状态,而是写入localStorage。该模块具有容器中使用的选择器,但在状态实际更改之前不会调用这些选择器,因此只有在调度另一个更改状态的操作后,UI才会正确显示。 问题 当我把商店放在

  • 问题内容: 我在redux存储中有一个Cart数组,其中包含我添加到购物车中的所有项目 像这样 并且我有一个输入来添加优惠券代码,当我添加优惠券代码会降低总价,所以如果我没有在商店中存储总计,该如何实现?并在添加此优惠券后渲染总价! 这是我的代码片段 reducer / index.js 购物车屏幕 问题答案: 我的建议是不要在状态中存储冗余(派生的)信息。这意味着您不需要(也不应该!)将总数存储

  • 我一辈子都不能让我的一个动作叫减速机。我已经在这个应用程序中编写了多个其他动作和减法器,效果非常好。 它是筛选函数的开始。我有一个文本输入字段,在这里我不断跟踪输入字段的状态,并将字段值分配给redux操作。我有一个控制台。记录操作内部,该操作会正确记录每次按键。 我似乎不能理解的是,为什么减速器不是在每个按键调用。我已经尝试了减速器内的多个console.log,但是没有一个被键盘记录下来。 第