2016-09-16 1 views
5

Je suis resté perplexe pendant un moment avec RN Navigator essayant de comprendre pourquoi Navigator rend toutes les routes poussées dans sa pile.Réagir Native Navigator renderScene appelé plusieurs fois

Dans un premier temps

<Navigator initialRoute={{name:"Route 1", index: 1}} /> 

ensuite sur l'émission d'un navigator.push({ name : "Route 2", index: 2 }) le rendu() de mon composant qui est appelé re-Navigator rend, ce qui appelle à son tour renderScene.

Après avoir poussé le 2ème itinéraire et enregistrer l'itinéraire lorsque renderScene est appelé à des rendements:

rendu() -> renderScene(), {name: "Route 1", index: 1}

render() -> renderScene(), {name: "Route 2", index: 2}

est-ce que quelqu'un sait pourquoi le renderScene() est appelée autant de fois que il y a des routes à l'intérieur la pile du navigateur? Est-ce un comportement attendu et si c'est comment pouvons-nous accélérer le rendu? Il y a un impact significatif sur les performances lorsque vous tentez de rendre des scènes de 5 routes avant de rendre la scène pour la dernière route poussée, alors qu'en réalité, il devrait appeler render() une seule fois pour rendre la scène de la dernière route poussée .

Toute aide est grandement appréciée. Merci!

Ce sont les extraits pertinents:

nav.js 

export function ListPage(){ 
    return { 
     name: LIST_PAGE, 
     index: 1 
    } 
} 


Main App 

<Navigator 
     ref={(ref) => this.navigator = navigator = ref} 
     initialRoute={nav.ListPage()} 
     renderScene={(route,navigator)=>this.renderListingsScene(route,navigator)} 
/> 

renderListingsScene(route, navigator){ 
     console.log("renderScene()", route); 

} 
+0

Pouvez-vous partager à quoi ressemble 'renderScene'? Aussi votre '' Navigator initialRoute = {nom: "Route 1", index: 1} /> 'manque une paire d'accolades, il devrait être' ' – rclai

+0

J'ai mis à jour la question pour refléter le code que vous recherchez, et j'ai les crochets dans mon code - corrigé la faute de frappe – DritanX

+0

Oui, c'est étrange. J'ai le même problème mais juste avec 2 routes dans 'initialRoute' (render 2x) et en utilisant' navigationState' pour passer la pile (mais pas en poussant) –

Répondre

0

renderListingsScene doit retourner un code JSX. Vous devez renvoyer un <View> ou un autre composant dans votre renderScene. Je pense qu'il rendra chaque scène parce que vous ne fournissez aucun composant comme valeur de retour.

+0

J'ai la méthode retourner JSX dans tous les cas. Dans le cas où il n'y a pas de données, je retourne un composant JSX "page vide" – DritanX

0

J'ai eu un problème similaire (il appelait toutes les routes que j'avais définies au démarrage). Une fois que j'ai retiré le initialRouteStack des propriétés Navigator, il a cessé de se produire.

<Navigator 
      initialRoute={routes[0]} 
      //initialRouteStack={routes} 
      renderScene={ (route, navigator) => this._renderScene(route, navigator) } 
/>