使用React Router 6和useContext hook,我找不到将数据传递给所有子元素的方法.当我用上下文包装<Routes></Routes>时.并使用上下文调用它.消费者在我的组件中出现错误:

The error: Cannot find name 'ShopContext'.

1、应用程序.带有路由和上下文的tsx.供应商

import React, { useState, createContext } from 'react';
import './App.scss';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from '../../pages/Home';
import SharedLayout from '../../layouts/SharedLayout';
import Artists from '../../pages/Artists';
import Contact from '../../pages/Contact';
import NotFound from '../../pages/NotFound';
import { Shop } from '../../interfaces/Shop';
import Data from '../../data.json';


function App() {

    const [Infos] = useState<Shop>(Data)
    const ShopContext = createContext({})

    return (
        <BrowserRouter>
            <ShopContext.Provider value={Infos}>
                <Routes>
                    <Route path='/' element={<SharedLayout />}>
                        <Route index element={<Home />} />
                        <Route path='artists' element={<Artists />}/>
                        <Route path='contact' element={<Contact />}/>
                        <Route path='*' element={<NotFound />} />
                    </Route>
                </Routes>
            </ShopContext.Provider>
        </BrowserRouter>
    )}

export default App;

以及子组件:

import React, { useContext } from 'react';

function Artists(){

    const shop = useContext(ShopContext)

    return <>
        Artists
    </>
}

export default Artists;

我试过:

  1. 包装包含SharedLayout的第一条路由==&gt;不行,路由必须是<Routes>个子元素的直达路由

  2. 按如下方式包装每条管线内的每个组件:

     <BrowserRouter>
             <Routes>
                 <Route path='/' element={
                     <ShopContext.Provider value={Infos}>
                     <SharedLayout />
                     </ShopContext.Provider>
                 }>
                     <Route index element={
                         <ShopContext.Provider value={Infos}>
                             <Home />
                         </ShopContext.Provider>
                     } />
                     <Route path='artists' element={
                         <ShopContext.Provider value={Infos}>
                             <Artists />
                         </ShopContext.Provider>
                     }/>
                     <Route path='contact' element={
    
                         <ShopContext.Provider value={Infos}>
                             <Contact />
                         </ShopContext.Provider>
                     }/>
                     <Route path='*' element={<NotFound />} />
                 </Route>
             </Routes>
     </BrowserRouter>
    

    )

推荐答案

Issue

ShopContext React上下文应声明为106 any React组件.通过在应用程序中声明它,每次应用程序渲染时都会创建一个新上下文.因为ShopContext是在应用程序中声明的,所以在试图使用上下文值的路由组件中,它没有定义为与useContext挂钩一起使用.

Solution

ShopContext移动到它自己的文件中,以便创建和导出/导入以供使用.

示例:

ShopContext

import React, { useContext, useState, createContext } from 'react';

const ShopContext = createContext({});

const ShopProvider = ({ children }) => {
  const [infos, setInfos] = useState<Shop>(Data);

  ... business logic to set/update infos state, etc ...

  return (
    <ShopContext.Provider value={infos}>
      {children}
    </ShopContext.Provider>
  );
};

export useShopContext = () => useContext(ShopContext);

export default ShopProvider;

应用程序

import ShopProvider from '../path/to/ShopProvider';

function 应用程序() {
  return (
    <BrowserRouter>
      <ShopProvider>
        <Routes>
          <Route path='/' element={<SharedLayout />}>
            <Route index element={<Home />} />
            <Route path='artists' element={<艺术家 />}/>
            <Route path='contact' element={<Contact />}/>
            <Route path='*' element={<NotFound />} />
          </Route>
        </Routes>
      </ShopProvider>
    </BrowserRouter>
  );
}

艺术家

import { useShopContext } from '../path/to/ShopProvider';

function 艺术家(){
  const shop = useShopContext();

  return (
    <>
      艺术家
    </>
  );
}

Reactjs相关问答推荐

react-hook-form问题:为什么getValues不返回大多数当前值?

使用useEffect挂钩获取数据

迁移到React Router Dom v6后,我是否错误地使用了Link组件?

Reaction Native:在初始获取后,Reducer变为未定义

在Reaction中测试条件组件

如何在关闭和打开此 Select 输入时应用旋转效果?

在Reaction常量函数中未更新状态变量

在Reaction中单击并显示子组件延迟/动画

TanStack/Reaction-Query在我的Vercel应用程序中不起作用

我应该如何管理设置组件初始状态的复杂逻辑?

试图从Amazon-Cogito-Identity-js模拟CogitoUser.authateUser,并将其获取为未定义的S

.populate() 方法在 mongodb 中不起作用

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

如何在 TimePicker 中更改时钟 colored颜色 和确定按钮字体 colored颜色 - MUI React

如何在悬停时更改 MUI 卡内容

改变输入的默认值时出现问题:number react-hook-form

我可以更改 styled() 中的响应吗? (MUI v5)

React - 仅在变量为真时显示项目

如何使用 babel 将 SVG 转换为 React 组件?

服务器端分页未按预期工作