【问题标题】:How to use SSR with Redux in Next.js(Typescript) using next-redux-wrapper? [duplicate]如何使用 Next-redux-wrapper 在 Next.js(Typescript) 中使用 SSR 和 Redux? [复制]
【发布时间】:2022-01-26 05:08:55
【问题描述】:

在 Next.js(Typescript) 中使用带有 SSR 的 redux 使用 next-redux-wrapper,但在这一行出现错误

异步 ​​({ req, store })

说,Type 'Promise' 与签名不匹配'(context: GetServerSidePropsContext): Promise>

类型 'Store & { 调度:未知; }'。

类型 'Store & { 调度:未知; }'

这是我的 SSR 代码:-

export const getServerSideProps: GetServerSideProps = wrapper.getServerSideProps(async ({ req, store }) => {


  let { query } = req

  let searchCategory = query.category?.toString().toLowerCase().replace(/ /g, "-");

  const apolloClient = initializeApollo();
  const response = await apolloClient.query({
    query: GET_PRODUCT_BY_CATEGORY,
    variables: {
      numProducts: 10,
      category: searchCategory
    }
  });
  await store.dispatch(getProducts(response));
  
}); 

【问题讨论】:

    标签: react-redux next.js server-side-rendering


    【解决方案1】:

    这个代码库可以帮助你。 (“下一个”:“10.1.3”) 尝试使用getInitialProps 而不是getServerSideProps。 这适用于我的情况。如下代码:

    试试 在 _app.js 中

    import { wrapper } from '/store';
    
    function MyApp(props) {
      const { Component, pageProps } = props;
    ...
    return (
                <Component {...pageProps} />
           )
    }
    App.getInitialProps = async props => {
      const { Component, ctx } = props;
      const pageProps = Component.getInitialProps
        ? await Component.getInitialProps(ctx)
        : {};
      //Anything returned here can be accessed by the client
      return { pageProps: pageProps, store: ctx.store };
    };
    export default wrapper.withRedux(App);
    

    store.js 文件:

    const makeStore = props => {
      if (!isEmpty(props)) {
        return createStore(reducer, bindMiddleware([thunkMiddleware]));
      } else {
        const { persistStore, persistReducer } = require('redux-persist');
        const persistConfig = {
          key: 'root',
        };
        const persistedReducer = persistReducer(persistConfig, reducer); // Create a new reducer with our existing reducer
        const store = createStore(
          persistedReducer,
          bindMiddleware([thunkMiddleware])
        ); // Creating the store again
    
        store.__persistor = persistStore(store); // This creates a persistor object & push that persisted object to .__persistor, so that we can avail the persistability feature
        return store;
      }
    };
    
    // Export the wrapper & wrap the pages/_app.js with this wrapper only
    export const wrapper = createWrapper(makeStore);
    

    在您的页面中:

    HomePage.getInitialProps = async ctx => {
       const { store, query, res } = ctx;
    };
    

    【讨论】:

      【解决方案2】:

      您以错误的方式拨打wrapper.getServerSideProps

      尝试如下:

      export const getServerSideProps = wrapper.getServerSideProps(
        store => async ({req, res, query}) => {
          // do your stuff with store and req
        }
      );
      

      如果您正在寻找工作演示,可以访问my old answer

      【讨论】:

      • 如果我想访问其中的查询参数,那我该怎么做呢?没有包装器,它很容易通过以下方式完成: - {query} = context.
      • 但是 "wrapper.getServerSideProps(async ({ req, store })" 正在使用 Javascript。
      • ({req, res, ...etc}) 实际上是您正在寻找的context。你可以解构它({req, res, query})。 @AspDev18
      猜你喜欢
      • 2022-01-22
      • 2018-06-04
      • 2021-01-16
      • 2020-10-01
      • 2022-10-24
      • 2022-10-14
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多