Reactjs TypeError:在使用React上下文和React路由器时,render不是函数

Reactjs TypeError:在使用React上下文和React路由器时,render不是函数,reactjs,react-router,react-context,Reactjs,React Router,React Context,我需要设置一个可以从不同组件调用的用户状态。此设置使用React路由器和React上下文。 React上下文只包含一个跟踪用户名的状态 在顶级即应用程序中,我已将所有子项传递给提供商。但我犯了个错误 TypeError:渲染不是函数 我的用户上下文代码: const UserContext = createContext(); export const UserProvider = (props) => { const [user, setUser] = useState("

我需要设置一个可以从不同组件调用的用户状态。此设置使用React路由器和React上下文。 React上下文只包含一个跟踪用户名的状态

在顶级即应用程序中,我已将所有子项传递给提供商。但我犯了个错误

TypeError:渲染不是函数

我的用户上下文代码:

const UserContext = createContext();

export const UserProvider = (props) => {
  const [user, setUser] = useState("");
  return (
    <UserContext.Provider value={[user, setUser]}>
      {props.children}
    </UserContext.Provider>
  );
};

export default UserContext;
function App() {
  return (
    <UserProvider>
      <Router>
        <div>
          <Nav />
          <Switch>
            <Route exact path="/" component={Signup} />
            <Route exact path="/signin" component={SignIn} />
            <Route path="/register" component={UserRegister} />
            <Route path="/homepage/:user" component={Homepage} />
          </Switch>
        </div>
      </Router>
    </UserProvider>
  );
}

export default App;
const UserContext=createContext();
导出常量UserProvider=(道具)=>{
const[user,setUser]=useState(“”);
返回(
{props.children}
);
};
导出默认用户上下文;
我的应用程序代码:

const UserContext = createContext();

export const UserProvider = (props) => {
  const [user, setUser] = useState("");
  return (
    <UserContext.Provider value={[user, setUser]}>
      {props.children}
    </UserContext.Provider>
  );
};

export default UserContext;
function App() {
  return (
    <UserProvider>
      <Router>
        <div>
          <Nav />
          <Switch>
            <Route exact path="/" component={Signup} />
            <Route exact path="/signin" component={SignIn} />
            <Route path="/register" component={UserRegister} />
            <Route path="/homepage/:user" component={Homepage} />
          </Switch>
        </div>
      </Router>
    </UserProvider>
  );
}

export default App;
函数应用程序(){
返回(
);
}
导出默认应用程序;
entrie错误日志:

TypeError: render is not a function
updateContextConsumer
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:18747
  18744 | {
  18745 |   ReactCurrentOwner$1.current = workInProgress;
  18746 |   setIsRendering(true);
> 18747 |   newChildren = render(newValue);
        | ^  18748 |   setIsRendering(false);
  18749 | } // React DevTools reads this flag.
  18750 | 
View compiled
beginWork
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:19114
  19111 |   return updateContextProvider(current, workInProgress, renderLanes);
  19112 | 
  19113 | case ContextConsumer:
> 19114 |   return updateContextConsumer(current, workInProgress, renderLanes);
        | ^  19115 | 
  19116 | case MemoComponent:
  19117 |   {
View compiled
HTMLUnknownElement.callCallback
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:3945
  3942 | function callCallback() {
  3943 |   didCall = true;
  3944 |   restoreAfterDispatch();
> 3945 |   func.apply(context, funcArgs);
       | ^  3946 |   didError = false;
  3947 | } // Create a global error event handler. We use this to capture the value
  3948 | // that was thrown. It's possible that this error handler will fire more
View compiled
invokeGuardedCallbackDev
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:3994
  3991 | // errors, it will trigger our global error handler.
  3992 | 
  3993 | evt.initEvent(evtType, false, false);
> 3994 | fakeNode.dispatchEvent(evt);
       | ^  3995 | 
  3996 | if (windowEventDescriptor) {
  3997 |   Object.defineProperty(window, 'event', windowEventDescriptor);
View compiled
invokeGuardedCallback
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:4056
  4053 | function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
  4054 |   hasError = false;
  4055 |   caughtError = null;
> 4056 |   invokeGuardedCallbackImpl$1.apply(reporter, arguments);
  4057 | }
  4058 | /**
  4059 |  * Same as invokeGuardedCallback, but instead of returning an error, it stores
View compiled
beginWork$1
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:23964
  23961 | } // Run beginWork again.
  23962 | 
  23963 | 
> 23964 | invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes);
        | ^  23965 | 
  23966 | if (hasCaughtError()) {
  23967 |   var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`.
View compiled
performUnitOfWork
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:22776
  22773 | 
  22774 | if ( (unitOfWork.mode & ProfileMode) !== NoMode) {
  22775 |   startProfilerTimer(unitOfWork);
> 22776 |   next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
        | ^  22777 |   stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
  22778 | } else {
  22779 |   next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
View compiled
workLoopSync
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:22707
  22704 | function workLoopSync() {
  22705 |   // Already timed out, so perform work without checking if we need to yield.
  22706 |   while (workInProgress !== null) {
> 22707 |     performUnitOfWork(workInProgress);
  22708 |   }
  22709 | }
  22710 | 
View compiled
renderRootSync
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:22670
  22667 | 
  22668 | do {
  22669 |   try {
> 22670 |     workLoopSync();
        | ^  22671 |     break;
  22672 |   } catch (thrownValue) {
  22673 |     handleError(root, thrownValue);
View compiled
performSyncWorkOnRoot
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:22293
  22290 |   }
  22291 | } else {
  22292 |   lanes = getNextLanes(root, NoLanes);
> 22293 |   exitStatus = renderRootSync(root, lanes);
        | ^  22294 | }
  22295 | 
  22296 | if (root.tag !== LegacyRoot && exitStatus === RootErrored) {
View compiled
scheduleUpdateOnFiber
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:21881
  21878 |   // root inside of batchedUpdates should be synchronous, but layout updates
  21879 |   // should be deferred until the end of the batch.
  21880 | 
> 21881 |   performSyncWorkOnRoot(root);
        | ^  21882 | } else {
  21883 |   ensureRootIsScheduled(root, eventTime);
  21884 |   schedulePendingInteractions(root, lane);
View compiled
updateContainer
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:25482
  25479 |   }
  25480 | 
  25481 |   enqueueUpdate(current$1, update);
> 25482 |   scheduleUpdateOnFiber(current$1, lane, eventTime);
  25483 |   return lane;
  25484 | }
  25485 | function getPublicRootInstance(container) {
View compiled
(anonymous function)
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:26021
  26018 | 
  26019 | 
  26020 |   unbatchedUpdates(function () {
> 26021 |     updateContainer(children, fiberRoot, parentComponent, callback);
        | ^  26022 |   });
  26023 | } else {
  26024 |   fiberRoot = root._internalRoot;
View compiled
unbatchedUpdates
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:22431
  22428 | executionContext |= LegacyUnbatchedContext;
  22429 | 
  22430 | try {
> 22431 |   return fn(a);
        | ^  22432 | } finally {
  22433 |   executionContext = prevExecutionContext;
  22434 | 
View compiled
legacyRenderSubtreeIntoContainer
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:26020
  26017 |   } // Initial mount should not be batched.
  26018 | 
  26019 | 
> 26020 |   unbatchedUpdates(function () {
        | ^  26021 |     updateContainer(children, fiberRoot, parentComponent, callback);
  26022 |   });
  26023 | } else {
View compiled
render
G:/WebDevelopmentFolder/trinkerrchallenge/node_modules/react-dom/cjs/react-dom.development.js:26103
  26100 |     }
  26101 |   }
  26102 | 
> 26103 |   return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
  26104 | }
  26105 | function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
  26106 |   if (!isValidContainer(containerNode)) {
View compiled
Module.<anonymous>
G:/WebDevelopmentFolder/trinkerrchallenge/src/index.js:6
  3 | import "./index.css";
  4 | import App from "./App";
  5 | 
> 6 | ReactDOM.render(
  7 |   <React.StrictMode>
  8 |     <App />
  9 |   </React.StrictMode>,
View compiled
Module../src/index.js
http://localhost:3000/static/js/main.chunk.js:1581:30
__webpack_require__
G:/WebDevelopmentFolder/trinkerrchallenge/webpack/bootstrap:851
  848 | 
  849 | __webpack_require__.$Refresh$.init();
  850 | try {
> 851 |     modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
      | ^  852 | } finally {
  853 |     __webpack_require__.$Refresh$.cleanup(moduleId);
  854 | }
View compiled
fn
G:/WebDevelopmentFolder/trinkerrchallenge/webpack/bootstrap:150
  147 |         );
  148 |         hotCurrentParents = [];
  149 |     }
> 150 |     return __webpack_require__(request);
      | ^  151 | };
  152 | var ObjectFactory = function ObjectFactory(name) {
  153 |     return {
View compiled
1
http://localhost:3000/static/js/main.chunk.js:1595:18
__webpack_require__
G:/WebDevelopmentFolder/trinkerrchallenge/webpack/bootstrap:851
  848 | 
  849 | __webpack_require__.$Refresh$.init();
  850 | try {
> 851 |     modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
      | ^  852 | } finally {
  853 |     __webpack_require__.$Refresh$.cleanup(moduleId);
  854 | }
View compiled
checkDeferredModules
G:/WebDevelopmentFolder/trinkerrchallenge/webpack/bootstrap:45
  42 |  }
  43 |  if(fulfilled) {
  44 |      deferredModules.splice(i--, 1);
> 45 |      result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
     | ^  46 |  }
  47 | }
  48 | 
View compiled
Array.webpackJsonpCallback [as push]
G:/WebDevelopmentFolder/trinkerrchallenge/webpack/bootstrap:32
  29 |  deferredModules.push.apply(deferredModules, executeModules || []);
  30 | 
  31 |  // run deferred modules when all chunks ready
> 32 |  return checkDeferredModules();
     | ^  33 | };
  34 | function checkDeferredModules() {
  35 |  var result;
TypeError:渲染不是函数
updateContextConsumer
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:18747
18744 | {
18745 | ReactCurrentOwner$1.current=工作进度;
18746 | SETISRENDING(真);
>18747 | newChildren=render(newValue);
|^18748 | SETISRENDING(假);
18749 |}//React DevTools读取此标志。
18750 | 
视图编译
开始工作
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:19114
19111 |返回updateContextProvider(当前、工作进度、渲染平面);
19112 | 
19113 |案例背景消费者:
>19114 |返回updateContextConsumer(当前、工作进程、渲染平面);
| ^  19115 | 
19116 |案例组件:
19117 |   {
视图编译
HtmlUnknowneElement.callCallback
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:3945
3942 |函数callCallback(){
3943 | didCall=true;
3944 |调度后恢复();
>3945 |函数应用(上下文,函数);
|^3946 | diderro=false;
3947 |}//创建一个全局错误事件处理程序。我们使用它来捕获值
3948 |//已抛出。此错误处理程序可能会触发更多错误
视图编译
invokeGuardedCallbackDev
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:3994
3991 |//错误,它将触发全局错误处理程序。
3992 | 
3993 | evt.initEvent(evtType,false,false);
>3994 | fakeNode.调度事件(evt);
| ^  3995 | 
3996 |如果(windowEventDescriptor){
3997 | Object.defineProperty(窗口“事件”,窗口事件描述符);
视图编译
invokeGuardedCallback
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:4056
4053 |函数invokeGuardedCallback(名称、函数、上下文、a、b、c、d、e、f){
4054 | hasError=假;
4055 | caughtError=null;
>4056 | invokeGuardedCallbackImpl$1.apply(报告者、参数);
4057 | }
4058 | /**
4059 |*与invokeGuardedCallback相同,但它不返回错误,而是存储
视图编译
开始工作1美元
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:23964
23961 |}//再次开始工作。
23962 | 
23963 | 
>23964 | invokeGuardedCallback(null、beginWork、null、current、unitOfWork、lanes);
| ^  23965 | 
23966 |如果(hasCaughtError()){
23967 | var replayError=clearCaughtError();//`invokeGuardedCallback`有时设置expando`_suppressLogging`。
视图编译
执行工作
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:22776
22773 | 
22774 |如果((unitOfWork.mode和ProfileMode)!==NoMode){
22775 | startProfilerTimer(工作单元);
>22776 |下一步=开始工作$1(当前、工作单元、子渲染平面);
|^22777 | StopperOffilerTimerFrunningandRecordDelta(工作单位,真实);
22778 |}其他{
22779 |下一步=开始工作$1(当前、工作单元、子渲染平面);
视图编译
workLoopSync
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:22707
22704 |函数workLoopSync(){
22705 |//已超时,因此在不检查是否需要让步的情况下执行工作。
22706 | while(工作进度!==null){
>22707 |执行工作(工作进度);
22708 |   }
22709 | }
22710 | 
视图编译
渲染同步
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:22670
22667 | 
22668 |多{
22669 |试试看{
>22670 | workLoopSync();
|^22671 |中断;
22672 |}捕获量(thrownValue){
22673 | handleError(根,thrownValue);
视图编译
performSyncWorkOnRoot
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:22293
22290 |   }
22291 |}其他{
22292 |车道=getNextLanes(根,诺兰);
>22293 | exitStatus=renderRootSync(根,车道);
| ^  22294 | }
22295 | 
22296 | if(root.tag!==LegacyRoot&&exitStatus===RootErrored){
视图编译
调度更新光纤
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:21881
21878 |//BatchedUpdate中的根目录应该是同步的,但是布局更新
21879 |//应推迟到批处理结束。
21880 | 
>21881 | PerformSyncWorkRoot(根);
|^21882 |}其他{
21883 | ensureRootIsScheduled(根,事件时间);
21884 |计划未决交互(根、车道);
视图编译
更新容器
G:/WebDevelopmentFolder/trinkerchallenge/node_modules/react-dom/cjs/react-dom.development.js:25482
25479 |   }
25480 | 
25481 |排队更新(当前$1,更新);
>25482 | scheduleUpdateOnFiber(当前$1,车道,事件时间);
25483 |返回车道;
25484 | }
25485 |函数getPublicRootInstance(包含