Next.js - 如何使用 Provider 来包装路由并使用带有钩子的上下文

Wil*_*iam 2 javascript reactjs next.js

我在 create-react-app 中编写了类似于以下内容的代码,我想知道 next.js 的等效代码。下面的代码是我尝试拥有一个可用于所有页面的全局上下文。提供者包装链接。我没有错误。问题出在about页面中,当我期望 Context 状态时,console.log(state) 返回 undefined。我该如何解决?

谢谢你。

页面/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;

Run Code Online (Sandbox Code Playgroud)

页面/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;

Run Code Online (Sandbox Code Playgroud)

页面/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}

Run Code Online (Sandbox Code Playgroud)

小智 12

您可以<Provider>进入<App>初始化每个页面的自定义组件。

页面/_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
Run Code Online (Sandbox Code Playgroud)

更多信息在这里