angularjs - React Router 等待解析

标签 angularjs reactjs

我来自 Angular,习惯了 ui-router 的解析功能,这使得等待并将结果注入(inject) Controller 变得很容易。

目前,我想用 React 来模仿这一点,而无需在使用 React Router 时在 componentWillMount 方法中编写请求(或触发操作)。我认为有更好的方法来做到这一点,我只是还没弄清楚。

很想获得一些建议或指出我可以在哪里学习这样做

最佳答案

最好的选择是在 Router.run ( http://rackt.github.io/react-router/#Router.run ) 中使用回调。每当 url 更改时,您传递给它的回调就会被调用,并且它负责重新渲染,就像从页面中获取的这个示例一样:

Router.run(routes, function (Root) {
  // whenever the url changes, this callback is called again
  React.render(<Root/>, document.body);
});

在该函数中,您可以在调用 React.render() 之前执行所需的任何异步操作,如下所示:

Router.run(routes, function (Root) {
  // whenever the url changes, this callback is called again
  asyncStuff().then(function (data) {
    React.render(<Root data={data} />, document.body);
  });
});

这种方法的问题是,在数据可用之前,您的 UI 根本不会使用react。相反,我建议以空状态渲染组件,并在 componentDidMount 中获取数据,然后在数据进入时重新渲染。或者更好的是,将数据获取和渲染分离到两个组件中。一个组件获取数据,并将其作为属性传递给呈现组件。数据获取组件甚至可以避免渲染其他组件,除非数据存在,例如:

render: function () {
  if (this.state.data) {
    return <TheComponent data={this.state.data} />;
  } else {
    return <Spinner />;
  }
}

这是 React 中的常见模式,用于分离处理数据获取和状态的组件以及呈现该状态的组件。您希望将有状态组件尽可能推向层次结构的上层,因为它创建了逻辑边界。有状态组件是 90% 的错误发生的地方,当您寻找错误时能够专注于这些组件是件好事。

等待的另一个问题是用户可能会快速导航,这意味着在第一个数据传入之前会再次调用 Router.run 回调。因此,您需要确保中止最后一个数据操作并且根本不渲染它。

关于angularjs - React Router 等待解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207394/

相关文章:

angularjs - 如何使用 AngularJS 过滤 Firebase JSON?

reactjs - 在react-final-form中清除输入时清除字段的值

angularjs - Me、AngularJS 及其指定 Controller 的 3 种不同方法

reactjs - componentDidMount 中未定义的 Prop

javascript - 防止历史导航导致 React 中的重新加载

javascript - useState 不适用于 Material ui 功能组件(firebase)

javascript - 为什么 'if' 条件没有在 ajax 调用的 'then' promise 中得到评估?

html - href 覆盖 Angular.js 中的 ng-click

javascript - 触发按钮点击其他元素

angularjs - 如何使用 AngularJS/Web API/Angular-ui-router 在指令中调用 $http.put 服务后更新页面