路由更改时使用新的路由参数更新 redux 状态

Posted

技术标签:

【中文标题】路由更改时使用新的路由参数更新 redux 状态【英文标题】:Update redux state with new route params when route changes 【发布时间】:2020-09-05 10:25:36 【问题描述】:

我目前正在尝试实现一个通用应用程序,并在整个应用程序中使用路由参数。因此,我想将路由参数置于状态。

我可以使用以下方法为 s-s-r 执行此操作...

router.get('/posts/:id', (req, res) => 
  res.locals.id = req.params.id

  const store = createStore(reducers, getDefaultStateFromProps(res.locals), applyMiddleware(thunk));
  const router = <Provider store=store><StaticRouter location=req.url context=><App ...locals /></StaticRouter></Provider>;      
  const html = renderToString(router);
  const helmet = Helmet.renderStatic();

  res.render('index', 
    content: html,
    context: JSON.stringify(store.getState()),
    meta: helmet.meta,
    title: helmet.title,
    link: helmet.link
  );
);

从这里id 使用getDefaultStateFromProps 函数进入状态...export function getDefaultStateFromProps( id = '' = ) =&gt; ( id )

这一切都完美无缺,并将正确的 id 放入 redux 状态,然后我可以在点击这条路线时使用它。

我遇到的问题是,当我在客户端更改路由时,我不确定如何从 url 更新 id 的 redux 状态。

就我对路线的处理而言,我使用以下方法:

import React, Component from 'react';
import  Switch  from 'react-router-dom';
import Header from './header/';
import Footer from './footer';
import  renderRoutes  from 'react-router-config';

export default class App extends Component 
  render() 
    return (
      <div>
        <Header />
        <Switch>
          renderRoutes(routes)
        </Switch>
        <Footer />
      </div>
    );
  


export const routes = [
  
    path: '/',
    exact: true,
    component: Home
  ,
  
    path: '/posts/:id',
    component: Post,
   
  
    path: '*',
    component: PageNotFound
  
];

然后用下面的补水……

const store = createStore(reducers, preloadedState, applyMiddleware(thunk));

const renderRouter = Component => 
  ReactDOM.hydrate((
    <Provider store=store>
      <Router>
        <Component />
      </Router>
    </Provider>
  ), document.querySelectorAll('[data-ui-role="content"]')[0]);
;

所以我想知道的是,当我进行路由更改时...如何从路由参数更新新的 :id 的 redux 状态?

我对如何处理这个问题有点迷茫......感谢任何帮助。

【问题讨论】:

【参考方案1】:

您需要从路由定义文件中导入routes

import  matchPath  from 'react-router';
import  LOCATION_CHANGE  from 'react-router-redux';

// LOCATION_CHANGE === '@@router/LOCATION_CHANGE';
someReducerFunction(state, action)
  switch(action.type)
    case LOCATION_CHANGE:
      const match = matchPath(action.payload.location.pathname, routes[1]);
      const id = match.params;
      // ...
    default:
      return state;
  

完整的工作示例: https://codesandbox.io/s/elegant-chaum-7cm3m?file=/src/index.js

【讨论】:

LOCATION_CHANGE 操作是如何被触发的? 路由库自动触发。 我正在使用 redux 开发工具,但似乎永远看不到动作调度?我使用 react-router v4 进行设置...这仍然可以使用吗? 是的,它确实适用于 v4。您可能缺少一些额外的设置。我用一个完整工作示例的链接更新了答案。 刚刚开始工作...非常感谢您的帮助和演示

以上是关于路由更改时使用新的路由参数更新 redux 状态的主要内容,如果未能解决你的问题,请参考以下文章

在路由更改时更新 Redux 状态

触发 Redux 操作以响应 React Router 中的路由转换

React Redux 状态将在使用 Nginx 更改路由时初始化

Redux 商店使用 nextJS 自行重置路由更改

为一些 Redux 状态更改添加 url 路由

React中路由操作、页面跳转