React Router + Redux - 在路由更改时调度异步操作?

Sco*_*tty 9 javascript reactjs react-router redux

我有一个使用redux和react-router的通用反应应用程序.

我有几条路线如下:

/2016
/2015
/2014
/2013
Run Code Online (Sandbox Code Playgroud)

等等

每个路由都需要来自API的数据.目前,我有<Link>导航组件中的元素调度异步操作onClick,该操作使用来自该路由的API的数据填充存储.

对于MVP,我只是post: {}在路由更改时使用新的帖子内容覆盖商店中的内容,这样我们就可以获得API上的任何新内容.

我已经意识到<Link>按钮上的动作调度程序并不是最佳的,因为按下后退按钮不会重新触发动作调度以获取前一个路径的内容.

有没有办法让React Router在路由发生变化时随时触发调度操作?(限制它听一组特定的路线将是一个奖励).

我意识到我应该从商店获取历史记录,但是现在,通过触发操作调度以获取新内容,再次点击API会更容易.

干杯.

Mat*_*ara 12

在"生命周期"钩onEnteronChange已经去掉阵营路由器4,这使得大多数其他的答案对这个问题不合时宜.

虽然我建议您使用组件生命周期方法来实现您的目标,但这里是您在React-router 4上运行的问题的答案.

今天有用的是使用由React路由器自己的开发人员创建的历史库来监听历史更改,并从那里调度异步操作.

// history.js
import createHistory from "history/createBrowserHistory"

const history = createHistory()

// Get the current location.
const location = history.location

// Listen for changes to the current location.
const unlisten = history.listen((location, action) => {
    //Do your logic here and dispatch if needed
})

export default history
Run Code Online (Sandbox Code Playgroud)

然后在应用程序中导入历史记录

// App.js
import { Router, Route } from 'react-router-dom';
import Home from './components/Home';
import Login from './components/Login';
import history from './history';

class App extends Component {
  render() {
    return (
      <Router history={history}>
        <div>
          <Route exact path="/" component={Home} />
          <Route path="/login" component={Login} />
        </div>
      </Router>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

来源:历史库 React路由器文档

  • 您将如何在历史监听器中调度?我的意思是,“派遣”如何可用? (2认同)
  • “ action”是历史动作。只是一个字符串。就我而言,是““ REPLACE”` (2认同)

Ste*_*ven 8

是的React Router有onEnter和onLeave挂钩.您可以构建路由以获取store实例,因此您可以在这些帮助程序中访问它:

const createRoutes = (store) => {
  const fetchPosts = () => store.dispatch({
    types: ['FETCH_POSTS', 'FETCH_POSTS_SUCCESS', 'FETCH_POSTS_FAIL',
    url: '/posts'
  });

  return (
    <Route path="/" component={App}>
      <Route path="posts" component={PostList} onEnter={fetchPosts}/>
      <Route path="posts/:id" component={PostDetail} />
    </Route>
  )
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用类似redialredux-async-connect.这允许您将组件的数据依赖性与组件共同定位,同时保留在不触及网络的情况下测试组件的能力.

编辑:这适用于旧的,不再受支持的版本react-router.