Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何在Nextjs布局中使用上下文挂钩_Reactjs_React Hooks_Next.js_Use Context - Fatal编程技术网

Reactjs 如何在Nextjs布局中使用上下文挂钩

Reactjs 如何在Nextjs布局中使用上下文挂钩,reactjs,react-hooks,next.js,use-context,Reactjs,React Hooks,Next.js,Use Context,我正在用NextJS构建一个应用程序。我的应用程序显示帖子列表,用户可以从a-Z或Z-a中对列表进行排序,并显示每页特定数量的帖子(10、20等)。当用户单击帖子访问特定的帖子页面,然后返回主列表时,排序和分页首选项被重置,我使用cookies设法保留保留的值,但我想使用useContext()。 对于这个应用程序,我有一个Layout.js文件,我认为这是插入我的提供者的正确位置,如下所示: import React, {useState} from 'react'; import Navba

我正在用NextJS构建一个应用程序。我的应用程序显示帖子列表,用户可以从a-Z或Z-a中对列表进行排序,并显示每页特定数量的帖子(10、20等)。当用户单击帖子访问特定的帖子页面,然后返回主列表时,排序和分页首选项被重置,我使用cookies设法保留保留的值,但我想使用
useContext()
。 对于这个应用程序,我有一个
Layout.js
文件,我认为这是插入我的
提供者的正确位置,如下所示:

import React, {useState} from 'react';
import Navbar from './Navbar';
import Head from 'next/head';
import {SortingContext} from './UseContext';

const Layout = (props)=> {
  const [value, setValue] = useState('hello');

  return (<SortingContext.Provider value={{value, setValue}}>
            <div>
                <Head>
                  <title>MyApp</title>
                </Head>
                <Navbar/>
                {props.children}
            </div>
            </SortingContext.Provider>
        )};
和my UseContext.js:

import {createContext} from 'react';

export const SortingContext = createContext(null);


问题是您正试图从提供上下文的树的更高层使用上下文。现在,您的提供者位于
布局中
,但是,您试图在布局的父级
主页中使用它。因此,您可以做几件事,将您的提供商从
主页
之外移到更高的位置,或者如果您想保持当前的结构,您可以执行以下操作:

const Home = () => {

  const {value, setValue} = useContext(SortingContext);

  return (
    <Layout>
      <SortingContext.Consumer>
         {value =>
            <div className='main_screen'>
              <h1>{value}</h1>
            </div>
            {siteOptions && <Footer />}
         }
      </SortingContext.Consumer>
    </Layout>
  )
};
const Home=()=>{
const{value,setValue}=useContext(SortingContext);
返回(
{value=>
{value}
{siteOptions&&}
}
)
};

但是,我的建议可能是将其提升到更高的级别,您可以在应用程序级别使用它。

我们可以查看上下文本身以及您在哪里使用上下文吗?如果你有一个代码沙盒,我会更新这个问题。希望你能帮上忙!我提供了一个更详细的答案,让我知道如果你需要更多的清晰度!我完全理解你的意思,但我没有包含nextjs的app.js文件。显然,我必须创建一个新的app.js页面才能完成我想要的。谢谢你告诉我正确的方向。这是正确的,但我认为这是有意义的,如果你有多个上下文,你可以把它们放在那里。
const Home = () => {

  const {value, setValue} = useContext(SortingContext);

  return (
    <Layout>
      <SortingContext.Consumer>
         {value =>
            <div className='main_screen'>
              <h1>{value}</h1>
            </div>
            {siteOptions && <Footer />}
         }
      </SortingContext.Consumer>
    </Layout>
  )
};