【问题标题】:Nextjs - await store.dispatch Cannot read property 'dispatch' of undefinedNextjs - 等待 store.dispatch 无法读取未定义的属性“调度”
【发布时间】:2021-09-10 17:43:15
【问题描述】:

我是 React、Redux 的新手,并且一直在关注有关该主题的教程。我遇到了很多我能够解决的问题,但我遇到了一个我无法解决的问题。我设置了商店,甚至可以通过 Chrome 的 Redux 工具查看它并正确显示,但是当我尝试发送到商店时,我总是收到无法读取未定义错误的属性“发送”。我已经逐信遵循了许多教程,但仍然遇到相同的错误消息。

Index.Js

import Layout from '../components/layout/Layout';
import Home from '../components/Home';
import { getRooms } from '../redux/actions/roomActions';

import { wrapper } from '../redux/store';

export default function Index() {
  return (
    <Layout>
      <Home />
    </Layout>
  );
}

export const getServerSideProps = wrapper.getServerSideProps(
  async ({ req, store }) => {
    await store.dispatch(getRooms(req));
  }
);

roomConstants.js

export const ALL_ROOMS_SUCCESS = 'ALL_ROOMS_SUCCESS';
export const ALL_ROOMS_FAIL = 'ALL_ROOMS_FAIL';

export const CLEAR_ERRORS = 'CLEAR_ERRORS';

reducer.js

import { combineReducers } from 'redux';
import { allRoomsReducer } from './roomReducers';

const reducer = combineReducers({
  allRooms: allRoomsReducer,
});

export default reducer;

Store.js

import { createStore, applyMiddleware } from 'redux';
import { HYDRATE, createWrapper } from 'next-redux-wrapper';
import thunkMiddleware from 'redux-thunk';
import reducers from './reducers/reducers';

const bindMiddleware = (middleware) => {
  if (process.env.NODE_ENV !== 'production') {
    const { composeWithDevTools } = require('redux-devtools-extension');
    return composeWithDevTools(applyMiddleware(...middleware));
  }
  return applyMiddleware(...middleware);
};

const reducer = (state, action) => {
  if (action.type === HYDRATE) {
    const nextState = {
      ...state,
      ...action.payload,
    };
    return nextState;
  } else {
    return reducers(state, action);
  }
};

const initStore = () => {
  return createStore(reducer, bindMiddleware([thunkMiddleware]));
};

export const wrapper = createWrapper(initStore);

roomReducer.js

import {
  ALL_ROOMS_SUCCESS,
  ALL_ROOMS_FAIL,
  CLEAR_ERRORS,
} from '../constants/roomConstants';

// All rooms reducer
export const allRoomsReducer = (state = { rooms: [] }, action) => {
  switch (action.type) {
    case ALL_ROOMS_SUCCESS:
      return {
        roomsCount: action.payload.roomsCount,
        resPerPage: action.payload.resPerPage,
        filteredRoomsCount: action.payload.filteredRoomsCount,
        rooms: action.payload.rooms,
      };

    case ALL_ROOMS_FAIL:
      return {
        error: action.payload,
      };

    case CLEAR_ERRORS:
      return {
        ...state,
        error: null,
      };

    default:
      return state;
  }
};

roomAcion.js

import axios from 'axios';
import absoluteUrl from 'next-absolute-url';

import {
  ALL_ROOMS_SUCCESS,
  ALL_ROOMS_FAIL,
  CLEAR_ERRORS,
} from '../constants/roomConstants';

//Clear errors
export const clearErrors = () => async (dispatch) => {
  return dispatch({
    type: CLEAR_ERRORS,
  });
};

// Get all rooms
export const getRooms = (req) => async (dispatch) => {
  try {
    const { origin } = absoluteUrl(req);

    const { data } = await axios.get(`${origin}/api/rooms`);

    dispatch({
      type: ALL_ROOMS_SUCCESS,
      payload: data,
    });
  } catch (error) {
    dispatch({
      type: ALL_ROOMS_FAIL,
      payload: error.response.data.message,
    });
  }
};

【问题讨论】:

标签: reactjs redux next.js next-redux-wrapper


【解决方案1】:

在 index.js 中,你的 getServerSideProps 函数应该是这样的;

export const getServerSideProps = wrapper.getServerSideProps((store) => async ({ req }) => {
 await store.dispatch(getRooms(req));})

【讨论】:

    【解决方案2】:

    使用旧版本的 next-redux-wrapper 比如 6.0.2

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2021-03-15
    • 2022-01-12
    • 2018-07-13
    • 2021-07-18
    • 2021-09-13
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多