[英]How to share React context between _document.js and pages on Next.js?
假設我有這樣的背景:
export const ThemeContext = createContext();
export function ThemeWrapper({ children }) {
const sharedState = {
darkMode: false,
};
return (
<ThemeContext.Provider value={sharedState}>
{children}
</ThemeContext.Provider>
);
}
export function useThemeContext() {
return useContext(ThemeContext);
}
我可以像這樣在_document.js
上訪問它:
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ThemeWrapper, ThemeContext } from "../context/theme";
class MyDocument extends Document {
static contextType = ThemeContext;
render() {
console.log("theme", this.context);
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
}
class Wrapped extends Document {
render() {
return (
<ThemeWrapper>
<MyDocument />
</ThemeWrapper>
);
}
}
export default Wrapped;
現在我還想從一個頁面訪問這個上下文:
import { useThemeContext } from "../context/theme";
const SomePage = () => {
const theme = useThemeContext();
console.log("theme", theme);
return (
<div>Hi, I'm a page</div>
);
};
_document.js
在第一次加載頁面時在 Next.js 控制台上注銷theme { darkMode: false }
但每次導航到它時SomePage
在 Chrome 控制台上注銷theme undefined
。
有什么建議么?
我需要根據上下文切換html
標簽上的一些 class 。 嘗試使用 Tailwind CSS 手動切換暗模式。
用ThemeWrapper
包裝_document
不會讓您訪問頁面內的上下文(可能是因為它僅在服務器中呈現),您需要為此包裝_app
。 請注意, _document
不會在上下文 state 更改時重新渲染。
對於這個特定的用例,另一種方法是使用next-themes
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.