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

如何通过react_router传递状态?

单于飞鸣
2023-03-14

下面是给我带来麻烦的文件:

var Routers = React.createClass({

  getInitialState: function(){
    return{
      userName: "",
      relatives: []
    }
  },

  userLoggedIn: function(userName, relatives){
    this.setState({
      userName: userName,
      relatives: relatives,
    })
  },

  render: function() {
    return (
      <Router history={browserHistory}>
        <Route path="/" userLoggedIn={this.userLoggedIn} component={LogIn}/>
        <Route path="feed" relatives={this.state.relatives} userName={this.state.userName} component={Feed}/>
      </Router>
    );
  }
});

我试图通过路由将新的this.state.arriationsthis.state.username传递到我的“feed”组件中。但我收到一条错误消息:

我知道为什么会发生这种情况,但不知道如何将状态传递给我的“feed”组件。在过去的5个小时里,我一直在试图解决这个问题,我变得非常绝望!

请救命!谢谢

下面的答案很有帮助,我感谢athors,但他们不是做到这一点的最简单的方法。在我的例子中,最好的方法是这样的:当您更改路线时,只需向其附加一条消息,如下所示:

browserHistory.push({pathname: '/pathname', state: {message: "hello, im a passed message!"}});
<Link 
    to={{ 
    pathname: '/pathname', 
    state: { message: 'hello, im a passed message!' } 
  }}/>
  componentDidMount: function() {
    var recievedMessage = this.props.location.state.message
  },

共有1个答案

万铭
2023-03-14

在管理需要在整个应用程序中都可访问的状态时,最好的方法是使用类似reduxmobx的存储。这些库允许组件连接/观察状态,并随时了解状态变化的最新情况。

不能通过 组件传递道具的原因是它们不是真正的组件,因为它们不呈现任何内容。相反,它们用于构建路由配置对象。

这意味着:

<Router history={browserHistory}>
  <Route path='/' component={App}>
    <Route path='foo' component={Foo} />
  </Route>
</Router>
<Router history={browserHistory} routes={{
  path: '/',
  component: App,
  childRoutes: [
    {
      path: 'foo',
      component: Foo
    }
  ]
}} />
function withProps(Component, props) {
  return function(matchProps) {
    return <Component {...props} {...matchProps} />
  }
}

class MyApp extends React.Component {
  render() {
    return (
      <Router history={browserHistory}>
        <Route path='/' component={App}>
          <Route path='foo' component={withProps(Foo, { test: 'ing' })} />
        </Route>
      </Router>
    )
  }
}

location.state是导航时在组件之间传递状态的方便方法。但是,它有一个主要的缺点,即只有在应用程序中导航时才存在状态。如果一个用户跟随一个链接到您的网站,将没有状态附加到该位置。

那么如何将数据传递给路由的组件?一种常见的方法是使用类似reduxmobx的存储。使用Redux,可以使用更高阶的组件将组件连接到存储区。然后,当路由的组件(实际上是HOC,将路由组件作为其子组件)呈现时,它可以从存储中获取最新信息。

const Foo = (props) => (
  <div>{props.username}</div>
)

function mapStateToProps(state) {
  return {
    value: state.username
  };
}

export default connect(mapStateToProps)(Foo)

我对mobx不是特别熟悉,但根据我的理解,它甚至更容易安装。使用reduxmobx或其他状态管理是在整个应用程序中传递状态的好方法。

如果你不想用商店怎么办?你运气不好吗?没有,但是您必须使用React的一个实验性特性:上下文。为了使用上下文,您的一个父组件必须显式定义GetChildContext方法以及ChildContextTypes对象。任何希望通过context访问这些值的子组件都需要定义contextTypes对象(类似于propTypes)。

class MyApp extends React.Component {

  getChildContext() {
    return {
      username: this.state.username
    }
  }

}

MyApp.childContextTypes = {
  username: React.PropTypes.object
}

const Foo = (props, context) => (
  <div>{context.username}</div>
)

Foo.contextTypes = {
  username: React.PropTypes.object
}

您甚至可以编写自己的高阶组件,自动将上下文值作为 组件的道具注入。这有点像“穷人的商店”。您可以让它工作,但很可能比使用前面提到的存储库之一效率更低,而且bug更多。

还有另一种方法可以为 组件提供道具,但它一次只能工作一个级别。本质上,当React Router基于当前路由呈现组件时,它首先为嵌套最深的匹配 创建一个元素。然后,在为下一个嵌套最深的 创建元素时,它将该元素作为子元素道具传递。这意味着在第二个组件的render方法中,可以使用react.cloneElement克隆现有的childer元素,并向其添加额外的道具。

const Bar = (props) => (
  <div>These are my props: {JSON.stringify(props)}</div>
)

const Foo = (props) => (
  <div>
    This is my child: {
      props.children && React.cloneElement(props.children, { username: props.username })
    }
  </div>
)

这当然是乏味的,特别是如果您需要通过多个级别的 组件传递这些信息。您还需要在基础 组件(即 )中管理状态,因为您无法从 的父组件中注入状态。

 类似资料:
  • 问题内容: 您可以使用关键字“ ref”在.NET中进行操作。用Java有什么办法吗? 问题答案: 您正在用自己的方法做什么?如果仅填充现有数组,则不需要.NET或Java中的按引用传递语义。在这两种情况下,引用都将按值传递-因此对 对象的 更改将由调用者看到。这就像告诉某人您的住所地址,并要求他们向其提供物品-没问题。 如果您 确实 需要传递引用语义,即调用方将看到对参数本身所做的任何更改,例如

  • 我正在尝试通过java运行jmeter。这些例子来自https://www.blazemeter.com/blog/5-ways-launch-jmeter-test-without-using-jmeter-gui 我上传了jmx文件,如示例中所述。 在jmx文件中,我有属性。指定的属性,如${uuuu属性(0个用户,0)} 我设法通过命令行使用-J参数上传了这个属性。 如何通过java指定参数

  • 因此,在这里我将basePackages硬编码为“com.example”。这不是我想要的。我想通过命令行参数从终端运行应用程序时接收包名。有没有一种方法可以将命令行参数传递给应用程序,并使用我在BasePackages中接收到的参数?提前致谢

  • 问题内容: 我一直在为它构建一个Rest API,并且一直在使用命令行中的curl对它进行测试,这对于CRUD非常容易 我可以从命令行成功进行这些调用 上面的调用很容易从命令行进行,并且可以在我的api上正常使用,但是现在我想使用PHP创建curl。如您所见,我将数据作为json字符串传递。我已经阅读了很多,我想我可能可以进行POST并包含POST字段,但是我无法找出如何通过GET传递http正文

  • 问题内容: 请移至第二次更新。 我不想更改此问题的先前上下文。 我正在使用Java应用程序中的wkhtmltoimage。 使用它的标准方法是- 。 根据他们的文档,如果我们编写一个URL而不是输入URL,则输入将转换为STDIN。 我正在使用- 现在,我无法弄清楚如何将输入流传输到此过程。 我有一个读入的模板文件,并在末尾附加了一个字符串: 如何通过管道传递到流程的? 更新- 遵循Andrzej

  • 问题内容: 我希望有人可以为我澄清这里发生的事情。我在整数类中挖了一下,但是由于整数 覆盖 了运算符,所以我无法弄清楚出了什么问题。我的问题是这条线: 这是我的推理:我知道java通过值传递(或通过reference的值传递),因此我认为在下面的示例中,整数对象应每次递增。 这是我的预期输出: 这是实际输出。 为什么会这样? 问题答案: 有两个问题: 整数是通过值而不是通过引用传递的。在方法内部更