如何从 getInitialProps 内部调度一个动作?
Posted
技术标签:
【中文标题】如何从 getInitialProps 内部调度一个动作?【英文标题】:How to dispatch an action from inside getInitialProps? 【发布时间】:2021-12-11 03:31:47 【问题描述】:我正在尝试在 Next.js 应用程序中实现 Redux,但在使调度功能在 getInitialProps
中工作时遇到问题。由于某种我无法弄清楚的原因,商店被返回为未定义。我正在使用 next-redux-wrapper。我遵循了 next-redux-wrapper GitHub 页面上的文档,但在某个地方出错了。我知道代码可以正常工作——我使用 axios 直接获取 artPieces
,然后它工作得很好,但我想改用 Redux。我正在将 react/express.js 应用程序更改为 Next.js 应用程序,我将在其中使用 API 进行所需的基本服务器操作。这只是一个小型博客应用程序。
这是我的store.js
:
import createStore from 'redux';
import createWrapper, HYDRATE from 'next-redux-wrapper';
// create your reducer
const reducer = (state = tick: 'init' , action) =>
switch (action.type)
case HYDRATE:
return ...state, ...action.payload ;
case 'TICK':
return ...state, tick: action.payload ;
default:
return state;
;
// create a makeStore function
const makeStore = (context) => createStore(reducer);
// export an assembled wrapper
export const wrapper = createWrapper(makeStore, debug: true );
这里是_app.js
:
import './styles/globals.css';
import wrapper from '../store';
function MyApp( Component, pageProps )
return <Component ...pageProps />;
export default wrapper.withRedux(MyApp);
最后,这是它不起作用的地方。尝试在上下文中调用 dispatch 到子组件到 _app.js
:
import React from 'react';
import ArtPiecesContainer from './../components/ArtPiecesContainer';
import useDispatch from 'react-redux';
import axios from 'axios';
import getArtPieces from '../reducers';
const Art = ( data, error ) =>
return (
<>
<ArtPiecesContainer artPieces=data />
</>
);
;
export default Art;
Art.getInitialProps = async ( ctx ) =>
await ctx.dispatch(getArtPieces());
console.log('DATA FROM GETARTPIECES', data);
return data: ctx.getState() ;
;
【问题讨论】:
请修改您的帖子标题,提出一个清晰、具体的问题,而不仅仅是列出标签。 你试过用wrapper.getInitialPageProps
包装getinitialProps
函数吗?
这是正确答案。我读了这么多帖子,但把实际文档彻底热了……
cmets/answers 旁边没有绿色勾号。为什么??
【参考方案1】:
这可能适用于"next-redux-wrapper": "^7.0.5"
_app.js
import wrapper from '../store'
import React from 'react';
import App from 'next/app';
class MyApp extends App
static getInitialProps = wrapper.getInitialAppProps(store => async (Component, ctx) =>
return
pageProps:
// Call page-level getInitialProps
// DON'T FORGET TO PROVIDE STORE TO PAGE
...(Component.getInitialProps ? await Component.getInitialProps(...ctx, store) : ),
// Some custom thing for all pages
pathname: ctx.pathname,
,
;
);
render()
const Component, pageProps = this.props;
return (
<Component ...pageProps />
);
export default wrapper.withRedux(MyApp);
和Index.js
import useEffect from 'react'
import useDispatch from 'react-redux'
import END from 'redux-saga'
import wrapper from '../store'
import loadData, startClock, tickClock from '../actions'
import Page from '../components/page'
const Index = () =>
const dispatch = useDispatch()
useEffect(() =>
dispatch(startClock())
, [dispatch])
return <Page title="Index Page" linkTo="/other" NavigateTo="Other Page" />
Index.getInitialProps = wrapper.getInitialPageProps(store => async (props) =>
store.dispatch(tickClock(false))
if (!store.getState().placeholderData)
store.dispatch(loadData())
store.dispatch(END)
await store.sagaTask.toPromise()
);
export default Index
对于其余代码,您可以参考 nextjs/examples/with-redux-saga,但现在我发布了这个答案,他们在 next-redux-wrapper 上使用旧版本(第 6 版)。
【讨论】:
以上是关于如何从 getInitialProps 内部调度一个动作?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 getInitialProps 中的 url 获取查询参数?
Next.js - 如何将 id 从查询传递到 getInitialProps 函数
如何将 Post Item ID 传递给 getInitialProps?
Next.js 中的 getInitialProps 不会从服务器获取数据
如何使用 redux-saga 在 getInitialProps 中获取数据。然后在 getInitialProps 方法中从 redux store 获取响应?