2017-08-17 2 views
0

Je rencontre une boucle infinie lorsque j'essaie de rendre mes routes de composant avec un wrapper HOC. La méthode render routage ressemble à quelque chose comme:Réagissez la boucle infinie HOC lorsqu'elle est appliquée au routage

const render = (route, additionalProps) => { 
const scrollActive = has(route, "scroll") ? route.scroll : true; 
const Component = scrollActive 
    ? withScrollToTop(route.component) 
    : route.component; 
return props => { 
    return <Component {...props} {...additionalProps} route={route} />; 
}; 

return (
    <Switch> 
    {routes.map((route, i) => { 
     return (
     <Route 
      key={i} 
      path={route.path} 
      exact={route.exact} 
      strict={route.strict} 
      render={render(route, injectProps)} 
     /> 
    ); 
    })} 
    </Switch> 
); 

Pour le moment-être (car il tourne en boucle sur), le COH ne fait quoi que ce soit en plus enveloppant le composant avec une autre classe.

export default function withScrollToTop(WrappedComponent) { 
    const displayName = `HigherOrder.WithScrollToTop('${getDisplayName(
    WrappedComponent 
)}')`; 

    class WithScrollToTop extends React.PureComponent { 
    static displayName = displayName; 

    static WrappedComponent = WrappedComponent; 

    render() { 
     const props = Object.assign({}, this.props); 
     return React.createElement(WrappedComponent, props); 
    } 
    } 

    return hoistStatics(WithScrollToTop, WrappedComponent); 
} 

Toute tentative d'accès à une route provoque une boucle infinie.

Répondre

0

Votre problème est cette ligne: render={render(route, injectProps)} (la vôtre n'a pas la version finale }).

Cela déclenchera render fonction, il ne passe pas la fonction aux enfants props.

+0

Désolé, c'est une faute de frappe d'enlever un ternaire dans le prop de rendu. Nous avons une autre fonction à rendre avec une usine. Extrait d'origine mis à jour pour corriger l'accolade manquante. – mindlis

+0

Oui, événement avec le type correct. Vous devriez plutôt appeler 'render = {this.render ...}' ou 'render = {() => this.render ...}'. Votre façon de relier exécute la fonction 'render' tout de suite, sans passer' render' à 'props' –