【问题标题】:Pass data (prop) from _app.js to getServerSideProps in a page - NextJS, latest version将数据(prop)从 _app.js 传递到页面中的 getServerSideProps - NextJS,最新版本
【发布时间】:2021-04-20 14:56:19
【问题描述】:

我有一个自定义_app.js:

  const Layout = ({ children }) => (children);

  const app = ({ Component, pageProps }) => {

    pageProps.baseUrl = 'some url';

    return (
      <Layout>
        <Component {...pageProps} />
      </Layout>
    )
};

还有一个页面:

export async function getServerSideProps({ req, query, res, baseUrl }) { 
// baseUrl is undefined and an error, if I am using it with destructiring

  console.log(req) // There is no baseUrl

  return { props: { ..... } }
}

我想在_app.js 中设置pageProps.baseUrl= 'some url'; 并在包括getServerSideProps 在内的页面组件中使用它,我该怎么做?

【问题讨论】:

    标签: javascript node.js reactjs next.js


    【解决方案1】:

    现在,我创建了一个文件,其中包含所有全局值,如下所示:

    let store = {};
    
    const globalStore = {};
    
    globalStore.set = (key, value) => {
        store = { ...store, [key]: value };
    }
    
    globalStore.get = (key) => {
        return store[key];
    }
    
    
    export default globalStore;
    

    然后在_app.js 中导入并设置一个值:

    const app = ({ Component, pageProps }) => {
        globalStore.set('baseUrl', 'some url 1');
        globalStore.set('baseUrl2', 'some url 2');
    
        return (
            <Layout>
                <Component {...pageProps} />
            </Layout>
        )
    }
    

    将文件导入pages/index.js 和组件内部或getServerSideProps:

    export async function getServerSideProps({ req, query, res }) {
    
        console.log('in getServerSideProps');
        console.log(globalStore.get('baseUrl'));
        console.log(globalStore.get('baseUrl2'));
    ...
    

    【讨论】:

      【解决方案2】:

      我认为,在这种特殊情况下,可以在这里使用常量而不是 props。

      建议的解决方案

      在常量.js 中:

      export const BASE_URL = 'some url';
      

      在你的页面中:

      import * as Constants from '../path/to/constants';
      
      export async function getServerSideProps({ req, query, res }) { 
        // use Constants.BASE_URL here
      
        return { props: { ..... } }
      }
      

      为什么道具不能按照你想要的方式工作?

      您的页面组件和您从文件中导出的 getServerSideProps 方法是分开的,并且在不同的时间执行。渲染组件不会调用 getServerSideProps。我相信 Next.js 中的顺序是这样的:

      1. 在路由上发出请求。
      2. Next.js 查看pages/ 中的文件寻找对应的路由
      3. Next.js 将根据执行上下文运行适当的方法(在服务器渲染上,getServerSideProps)
      4. Next.js 渲染 App 组件,将 getServerSideProps 提供的 pageProps 传递给它
      5. App 组件渲染页面组件

      在这种情况下,您创建了一个悖论。想想道具是如何流动的:

      1. getServerSideProps 运行,返回一个 pageProps 对象
      2. App 组件呈现,包含从 getServerSideProps 传递的 pageProps 对象
      3. 页面组件渲染,传递pageProps

      如果 getServerSideProps 负责创建 pageProps 对象,则也不能将该对象作为参数传递。

      【讨论】:

      • 感谢很好的解释,但它是一个动态值。有不同的域,它们指向同一个 NextJS 应用程序。我可以在每个 getServerSideProps (set the value, but not get) 中执行此操作,但最好设置一次并在任何地方使用它。你可以查看我的解决方案,我不确定它是不是最好的。
      • 老实说,考虑到您正在尝试做的事情,您的解决方案看起来不错——另外,如果我有这个权利,并且您在多个域中提供一个应用程序,我认为它也可以帮助您使用服务器中间件修改 Request 对象,执行 req.domain = 'whatever my domain is' 之类的操作,然后您可以在 getServerSideProps 函数中访问该值,以区分应用程序运行的上下文
      猜你喜欢
      • 2022-07-19
      • 2020-08-09
      • 2022-11-25
      • 2021-03-18
      • 2021-05-13
      • 2021-12-04
      • 2021-10-06
      • 2022-01-09
      • 2021-03-18
      相关资源
      最近更新 更多