我有一个自定义的 _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: { ..... } }
}
我想在 pageProps.baseUrl= 'some url';
中设置 _app.js
并在包括 getServerSideProps
在内的页面组件中使用它,我该怎么做?
答案 0 :(得分:2)
现在,我已经创建了一个文件,其中包含所有这样的全局值:
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'));
...
答案 1 :(得分:1)
我认为,在这种特殊情况下,在这里使用常量而不是 props 是可以的。
在constants.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 中的顺序是这样的:
pages/
中的文件以获取相应的路由在这种情况下,您创建了一个悖论。想想道具是如何流动的:
如果 getServerSideProps 负责创建 pageProps 对象,则它也不能将该对象作为参数传递。