Next.js - 如何使用 Provider 包装路由并使用 Context with Hooks
Next.js - How do I use Provider to Wrap Routes and use Context with Hooks
我在 create-react-app 中编写了类似于以下的代码,我想知道 next.js 的等效代码。下面的代码是我尝试拥有一个可用于所有页面的全局上下文。提供商包装链接。我没有错误。问题出在 about 页面内 console.log(state) returns undefined 当我期望上下文状态时。我该如何解决这个问题?
谢谢。
pages/index.js
import Link from "next/link";
import {Provider} from './Context';
function Index(){
return(
<div>
<Provider>
<ul>
<li><Link href="/"><a>Home</a></Link></li>
<li><Link href="/about"><a>About</a></Link></li>
</ul>
</Provider>
</div>
)
}
export default Index;
pages/about.js
import { useRouter } from 'next/router';
import {Context} from './Context';
import {useContext} from 'react';
const About= () => {
const data = useContext(Context);
console.log(data)
return (
<div>
<p>This is the blog post content.</p>
</div>
);
};
export default About;
pages/Context.js
import React, {createContext, useState, useEffect}from 'react';
let Context = createContext();
function Provider(props){
const initialState = {
userID: false,
user:undefined,
loading: true,
authenticated:false
}
const [state,updateState] = useState(initialState)
return(
<Context.Provider value={{
state:state
}}>
{props.children}
</Context.Provider>
)
}
const Consumer = Context.Consumer;
export {Provider, Consumer, Context}
您可以将 <Provider>
移动到初始化每个页面的自定义 <App>
组件中。
pages/_app.js
import React from 'react'
import App from 'next/app'
import {Provider} from './Context';
class MyApp extends App {
render() {
const { Component, pageProps } = this.props
return <Provider><Component {...pageProps} /></Provider>
}
}
export default MyApp
更多信息here
想法是您需要在树中的任何位置有一个父 Provider
来使用上下文。在您的情况下,您 Provider
不是 About
组件的父级。您需要将 Provider
移动到 _app.js
,例如 this
我在 create-react-app 中编写了类似于以下的代码,我想知道 next.js 的等效代码。下面的代码是我尝试拥有一个可用于所有页面的全局上下文。提供商包装链接。我没有错误。问题出在 about 页面内 console.log(state) returns undefined 当我期望上下文状态时。我该如何解决这个问题?
谢谢。
pages/index.js
import Link from "next/link";
import {Provider} from './Context';
function Index(){
return(
<div>
<Provider>
<ul>
<li><Link href="/"><a>Home</a></Link></li>
<li><Link href="/about"><a>About</a></Link></li>
</ul>
</Provider>
</div>
)
}
export default Index;
pages/about.js
import { useRouter } from 'next/router';
import {Context} from './Context';
import {useContext} from 'react';
const About= () => {
const data = useContext(Context);
console.log(data)
return (
<div>
<p>This is the blog post content.</p>
</div>
);
};
export default About;
pages/Context.js
import React, {createContext, useState, useEffect}from 'react';
let Context = createContext();
function Provider(props){
const initialState = {
userID: false,
user:undefined,
loading: true,
authenticated:false
}
const [state,updateState] = useState(initialState)
return(
<Context.Provider value={{
state:state
}}>
{props.children}
</Context.Provider>
)
}
const Consumer = Context.Consumer;
export {Provider, Consumer, Context}
您可以将 <Provider>
移动到初始化每个页面的自定义 <App>
组件中。
pages/_app.js
import React from 'react'
import App from 'next/app'
import {Provider} from './Context';
class MyApp extends App {
render() {
const { Component, pageProps } = this.props
return <Provider><Component {...pageProps} /></Provider>
}
}
export default MyApp
更多信息here
想法是您需要在树中的任何位置有一个父 Provider
来使用上下文。在您的情况下,您 Provider
不是 About
组件的父级。您需要将 Provider
移动到 _app.js
,例如 this