React-universal-ssr icon indicating copy to clipboard operation
React-universal-ssr copied to clipboard

路由是:id这样的,然后actions获取动态参数的不能服务端渲染

Open dxhuii opened this issue 7 years ago • 5 comments

如题 路由配置代码:

const LoadableAnimeDetail = Loadable({
  loader: () => import(/* webpackChunkName: 'detail' */'../../containers/detail'),
  loading: Loading,
});

// ------------------

{
  path: '/anime/:id',
  exact: true,
  component: LoadableAnimeDetail,
  thunk: detailThumk,
}

localhost:8080/anime/13213 可以正常访问,但用dev:server的时候,没有服务端渲染成功。不是动态获取参数的可以正常渲染。

看了一圈子,不知道从哪里改,有空的时候可以看一下,还是我哪里配置对。

dxhuii avatar Feb 05 '18 08:02 dxhuii

解决了,应该是前端和服务端传入的参数不一致: src\store\actions\thunk.js 定义函数的时候多加个参数如:

export const detailThumk = (store, params) => store.dispatch(getAnimeDetail(params))

server\clientRouter.js 这里再修改一下,判断有没有传入参数:

const promises = branch.map(({ route, match }) => {
    const params = JSON.stringify(match.params) === '{}' ? route.thunk(store) : route.thunk(store, match.params)
    return route.thunk ? params : Promise.resolve(null)
  });

但不知道有没有更好的方法了。如果有麻烦告知下。

拿你的代码我做了修改,这个是我修改的地址:https://gitee.com/dxhuii/react-ssr

dxhuii avatar Feb 05 '18 10:02 dxhuii

谢谢你,看了你的改造学习了,其实还有一种实现,就是在组件的静态方法static里面写,那样就可以在路由嵌套很深时也是不会有影响的,你可以试试,我在现在的一个项目里就是改用了static方法。

wd2010 avatar Feb 06 '18 01:02 wd2010

@wd2010 这个我还真没有写过,有没有例子帖一下看看。

dxhuii avatar Feb 06 '18 01:02 dxhuii

@wd2010 有时间把static静态方法加进来吧,我学习下,研究了一下,没弄好。我也是刚刚学习服务端渲染,之前看了next.js也不错。不过还是想自己搞搞。学习下原理。

dxhuii avatar Feb 06 '18 10:02 dxhuii

谢谢你,看了你的改造学习了,其实还有一种实现,就是在组件的静态方法static里面写,那样就可以在路由嵌套很深时也是不会有影响的,你可以试试,我在现在的一个项目里就是改用了static方法。

楼主我想请教一下,使用了react-loadable后,返回的高阶组件如LoadableHome是丢失Home组件的静态方法的,请问这个有什么好的解决方案吗

worldzhao avatar Dec 04 '18 03:12 worldzhao