当前位置: 首页 > 知识库问答 >
问题:

如何在react router v4中使用上下文api?

马煌
2023-03-14

我试图在我的应用程序上用React 16.3的新上下文API做一些测试,但是我不明白为什么我的重定向从来没有工作过。

<ContextA>
  <Switch>
    <Route exact path='/route1' component={ Component1 } />
    <ContextB>
      <Route exact path='/route2' component={ Component2 } />
      <Route exact path='/route3' component={ Component3 } />
    </ContextB>
    <Redirect from='/' to='/route1' />
  </Switch>
</ContextA>

我不想让我的ContextB适用于所有路线,只适用于2号和3号路线。我该怎么做?

共有3个答案

顾鸣
2023-03-14

这将解决你的问题,因为我这样做在我的应用程序

<Route
  path="/"
  render={(props) => (
    <ContextB>
      <Component2 {...props} />
    </ContextB>
  )}
/>
庄萧迟
2023-03-14

作为对其他人的警告,接受的答案并不像你从最初的(不起作用的)概念中期望的那样起作用:

// This comes from the original question (doesn't work as-is!)
<ContextA>
  <Switch>
    <Route exact path='/route1' component={ Component1 } />
      <ContextB>
        <Route exact path='/route2' component={ Component2 } />
        <Route exact path='/route3' component={ Component3 } />
      </ContextB>
      <Redirect from='/' to='/route1' />
   </Switch>
</ContextA>

在那里,/route2/route3共享一个上下文,期望是:

  1. 在路由转换之间保持状态。
  2. 如果Component2Component3更新上下文,则更改应反映回另一个。

对于已接受的解决方案,上述情况均不成立。

卫俊誉
2023-03-14

看起来像是

我想这就是为什么您的重定向在使用ContextB作为Switch子节点时不起作用的原因。

最简单但重复的解决方案是将您的ContextB作为每个

注意:这些解决方案假设您指定了上下文组件的默认值,如下所示:const MyContext=React。createContext(defaultValue)

<Route exact path='/route2'>
  <ContextB.Provider>
    <Component1 />
  </ContextB.Provider>
</Route>

您甚至可以为此创建一个ContextRoad组件:

import React from 'react';
import { Route } from 'react-router-dom';

const ContextRoute = ({ contextComponent, component, ...rest }) => {
  const { Provider } = contextComponent;
  const Component = component;

  return (
    <Route {...rest}>
      <Provider>
        <Component />
      </Provider>
    </Route>
  );
};

export default ContextRoute;

然后将其用作路线:

<ContextA>
  <Switch>
    <Route exact path='/route1' component={ Component1 } />
    <ContextRoute exact path='/route2' contextComponent={ContextB} component={ Component2 } />
    <ContextRoute exact path='/route3' contextComponent={ContextB} component={ Component3 } />
    <Redirect from='/' to='/route1' />
  </Switch>
</ContextA>

使用此解决方案,您可以在嵌套组件中使用上下文和渲染道具:

return (
  <ContextB.Consumer>
    {value => <div>{value}</div>}
  </ContextB.Consumer>
);

但我们可以想象更多的解决方案,比如HOC,将上下文值直接传递给路由组件道具,等等。。。

 类似资料:
  • 首先,我想说我从来没有使用过Next.js或context api,所以请耐心听我说。 我目前正在Next.js中开发一个web应用程序,其中有多个页面,每个页面都包含一个表单。我希望有某种全局状态,以便能够设置和更新每个表单的数据。所有表单数据一起 例如:第1页=名称,第2页=说明,... 从我在网上读到的内容来看,我认为使用上下文api就足够了,但我遇到了困难。当我在第一个表单上填写名字时,它

  • 问题内容: 我正在尝试在我的应用程序上使用React 16.3中的新上下文API进行一些测试,但我不明白为什么我的重定向永远无法工作。 我不想让我的ContextB可用于所有路由,仅2和3。我该怎么做? 问题答案: 看起来应该只具有和`<Redirect `组件作为直接子代。(来源) 我想这就是为什么你的,你使用不工作的孩子。 最简单但重复的解决方案可能是让您成为每个想要的孩子的孩子: 注意:这些

  • 问题内容: 我有一个验证并保存表单的视图。保存表单后,我想重定向回list_object视图,并显示一条成功消息“客户xyz的表单已成功更新…” HttpResponseRedirect似乎无法正常工作,因为它只为url提供一个参数,无法与之一起传递字典。 我已经尝试修改object_list的包装,以将dict作为具有必要上下文的参数。我从保存表单的视图内部返回对此包装的调用。但是,呈现页面时,

  • 问题内容: 我一直在使用mgo作为我的API,但我在MongoDB中看到了许多当前连接(同时使用少于5个设备进行测试)。通过在Mongo服务器上执行,我得到:。在下面,我将我的问题记录在mgo的Github中(问题#429): 我在Web服务器中使用mgo的方式是否正确?如果没有,您能举一个完整的例子吗? 此代码不起作用,将其视为几乎伪代码(由于缺少诸如导入的部分或配置来自何处和模型),但这正是我

  • 我想在我的应用程序中使用上下文操作条(CAB),但它与旧版本的Android不兼容,所以我使用这个教程:http://www.miximum.fr/tutos/849-porting-the-contextual-anction-mode-for-pre-honeycomb-android-apps我的代码是: 我在以下方面有错误: null 知道吗?驾驶室使用神探夏洛克还有其他解决方案吗?

  • 我可以在Microsoft graph上使用Unity3d登录oauth 2,我请求了我的应用程序的此权限:https://graph.microsoft.com/files.readwrite.appfolder 在完成了通常的代码流(重定向到url、用户的权限、用身份验证码交换令牌代码和用令牌交换承载身份验证码)之后,我就可以登录了。 问题是上传小文件不起作用:https://docs.mic