React Native - 导航器更改路线

Posted

技术标签:

【中文标题】React Native - 导航器更改路线【英文标题】:React Native - Navigator change routes 【发布时间】:2015-06-30 08:35:05 【问题描述】:

我正在使用呈现新闻帖子的 Navigator 对象。

这个想法是您正在查看单个新闻帖子,您可以左右滑动查看下一个和上一个帖子。例如,当您向右滑动时,它会滑动到下一个帖子。我想要的是当我滑动到下一个帖子时,我想再次加载该帖子的下一个帖子,这样你就可以继续滑动。

我给这些道具:

getInitialState: function() 
  return 
    post: ,
    routes: [this.props.prevPost, this.props.post, this.props.nextPost],
    startRoute: this.props.post,
  ;

我的导航器功能如下所示:

render: function() 
  var self = this;
  return (
    <Navigator
      debugOverlay=false
      ref=(navigator) => 
        this._navigator = navigator;
      
      onDidFocus=this.itemChangedFocus
      initialRoute=this.state.startRoute
      initialRouteStack=this.state.routes
      routeStack=this.state.routes
      renderScene=this.renderNewsItem
      configureScene=() => (
        ...Navigator.SceneConfigs.HorizontalSwipeJump,
      ) />
  );

所以我的想法是onDidFocus,我查看我当前的帖子,然后抓取上一个和下一个帖子并以某种方式(这就是我卡住的地方)触发导航器组件的重新渲染?

这就是我的 itemChangedFocus 函数的样子:

// Route gives the current news item which has the focus
itemChangedFocus: function(route) 
  // PostStore returns a posts array
  // posts[0] = previousPost, posts[1] = currentPost, posts[2] = nextPost
  let posts = PostStore.getPrevAndNextPost(route);
  // This is probably wrong, but it did replace the nextPost in the route object
  this.props.navigator.route.nextPost = posts[2];
  // Now I need to trigger a rerender? I tried it with setState but that didn't work

所以问题是,我该如何正确处理这个问题?我做错了什么?如何确保我可以继续在列表中滑动?

【问题讨论】:

【参考方案1】:

设置完所有道具后在导航器上运行“forceUpdate”怎么样?这应该可以解决问题(理论上它应该在所有场景上调用渲染方法)。

顺便说一句。我认为这不是将 navigator 用于您想要做的事情的最佳方式 - 因为它没有正确使用 Navigator 的内置状态。

如果你总是想保持 3 个帖子呈现(当前、上一个、下一个)我认为更好的解决方案可能是使用 replaceAtIndex(route, index) 方法甚至 immediatelyResetRouteStack(routeStack),它应该正确修改导航器的状态并让它呈现因此。在这种情况下,一个困难可能是避免动画(我不确定是否立即ResetRouteStack 会导致动画)。也许您还需要在重置后jumpTo(route),以免触发动画。

另一方面,如果您一次限制了帖子的最大数量,并且您将能够保持它们全部呈现,那么您不需要做任何魔术,您只需为任何新的帖子做push(route)发布,然后立即jumpBack() - 它应该可以工作。

【讨论】:

【参考方案2】:

向前滑动完成后,didFocus 回调将触发。然后就可以使用navigator.replaceAtIndex(nextRoute, this.state.routes.length)为下一个场景注入路由了。

【讨论】:

以上是关于React Native - 导航器更改路线的主要内容,如果未能解决你的问题,请参考以下文章

React Native - 动态更改选项卡导航器中的背景颜色

react-native NavigatorIOS 未按预期工作

React Native刷新屏幕/组件/更改状态

在 React Native Stack Navigator 中更改 Header 的高度不起作用

React Native 和 Redux 我应该每个场景/路线都有一个商店吗?

React Native:如何在 Navigator 的 navigationBar= 中引用当前路线?