reactjs - Next.js 和 redux。服务器端填充store不生效

标签 reactjs redux react-redux next.js

我刚刚将 redux 连接到 Next.js 应用程序 like in the docs (但不确定 mapDispatchToProps 在示例中的作用):

初始化存储方法:

import { createStore, applyMiddleware } from 'redux';
import { createLogger } from 'redux-logger';
import axios from 'axios';
import axiosMiddleware from 'redux-axios-middleware';
import tokenMiddleware from './tokenMiddleware';
import getReducer from './combineReducers';

const logger = createLogger({ collapsed: true, diff: true });
const axiosMw = axiosMiddleware(axios.create(), { successSuffix: '_SUCCESS', errorSuffix: '_FAILURE' });

export default function initStore(logActions) {
  return function init() {
    const middleware = [tokenMiddleware, axiosMw];
    if (logActions) middleware.push(logger);
    return createStore(getReducer(), applyMiddleware(...middleware));
  };
}

我用来连接页面的 HOC:

import 'isomorphic-fetch';
import React from 'react';
import withRedux from 'next-redux-wrapper';
import { setUser } from 'lib/publisher/redux/actions/userActions';
import PublisherApp from './PublisherApp';
import initStore from '../redux/initStore';

export default Component => withRedux(initStore(), state => ({ state }))(
  class extends React.Component {
    static async getInitialProps({ store, isServer, req }) {
      const cookies = req ? req.cookies : null;
      if (cookies && cookies.user) {
        store.dispatch(setUser(cookies.user));
      }

      return { isServer };
    }

    render() {
      console.log(this.props.state);
      return (
        <PublisherApp {...this.props}>
          <Component {...this.props} />
        </PublisherApp>
      );
    }
  }
);

我遇到的问题是调度的操作

store.dispatch(setUser(cookies.user));

似乎在服务器上工作正常(我已经调试了reducer,并且我知道cookie中的这个用户对象确实是由reducer处理的),但是当我这样做时 console.log(this.props.state)我得到具有初始状态的 reducer - 没有用户数据。

最佳答案

您在 createStore 调用中缺少第二个参数。试试这个:

export default function initStore(logActions) {
  return function init(initData) {
    const middleware = [tokenMiddleware, axiosMw];
    if (logActions) middleware.push(logger);
    return createStore(getReducer(), initData, applyMiddleware(...middleware));
  };
}

注意添加了 initData 参数及其用法。

关于reactjs - Next.js 和 redux。服务器端填充store不生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45191080/

相关文章:

reactjs - 对 redux 工具包的 createSlice 中的多个操作使用react

reactjs - 如何在样式组件中使用通用的 less 变量?

javascript - 当我尝试将某个值添加到总和中时,函数会继续渲染。创建 react 应用程序

babeljs - 如何在命令行中转换 JSX 文件

javascript - 如何通过 react-redux 的 useSelector 钩子(Hook)正确使用柯里化(Currying)的选择器函数?

一对多关系的 Redux 状态形状

reactjs - 使用 Redux 响应热重载

javascript - TextInput 的 React-Native Expo 问题

reactjs - React Redux extraReducers 操作负载未知类型

javascript - 具有链式箭头功能的 redux mapDispatchToProps