2016-06-28 6 views
2

Die docs sagt:Warum componentDidMount in einer Komponente höherer Ordnung mehrmals aufgerufen?

einmal aufgerufen, nur auf dem Client (nicht auf dem Server), unmittelbar nach der ersten Wiedergabe erfolgt.

Jetzt, wenn ich versuche, eine höhere Ordnung Komponente zu erstellen:

import React from 'react'; 
import { connect } from 'react-redux'; 

function wrap(Wrapped) { 

    class Wrapper extends React.Component { 
    componentDidMount() { 
     // I will place some reusable functionality here which need to 
     // be called once on mounted. 
     console.log('wrapper component mounted'); 
    } 
    render() { 
     return <Wrapped {...this.props}/> 
    } 
    } 
    return Wrapper; 
} 

class Wrapped extends React.Component { 
    componentDidMount() { 
    console.log('wrapped component mounted'); 
    } 
    render() { 
    return <div></div>; 
    } 
} 

connect()(wrap(Wrapped)); 

nun jedes Mal, alle Änderungen in Requisiten auftreten, wird die Konsole diese drucken:

'wrapped component mounted' 
'wrapper component mounted' 

Wenn ich Entfernen Sie die Wrapper, es wird nur einmal gedruckt (wenn montiert in der ersten Zeit):

`wrapped component mounted` 

Also, warum componentDidMount in höherer Ordnung Komponente mehr als einmal aufgerufen?

+0

connect() (Wrap (Wrapper)); <- Ersetzen durch Wrapped –

+0

@ffxsam Es tut mir leid Wenn ich Ihren Kommentar nicht richtig verstehe, ist mein Englisch nicht so gut. Aber, wenn ich nicht falsch liege, wird 'componentDidMount', wenn diese Komponente (' Wrapper' und 'Wrapped') bereits eingebunden ist, nicht erneut aufgerufen, solange sie nicht abgehängt ist. Und was ich hier meine ist, dass diese beiden 'componentDidMount' immer aufgerufen werden, wenn sich Requisiten ändern. –

+0

Oh, Entschuldigung! Ich habe den Teil über die Änderungen der Requisiten verpasst, der dazu geführt hat, dass 'componentDidMount' erneut ausgelöst wurde. Sehr eigenartig. – ffxsam

Antwort

1

connect() (Umbruch (Wrapper)); < - ersetzen mit Wrapped

Ich habe es getestet. Und es funktioniert.

function wrap(Wrapped) { 
    class Wrapper extends React.Component { 
    componentDidMount() { 
     console.log('wrapper component mounted'); 
    } 
    render() { 
     return <Wrapped {...this.props}/> 
    } 
    componentDidUpdate(prevProps, prevState){ 
     console.log(this.props); 
    } 
    } 
    return Wrapper; 
} 
class Wrapped extends React.Component { 
    componentDidMount() { 
    console.log('wrapped component mounted'); 
    } 
    componentDidUpdate(prevProps, prevState){ 
     console.log(this.props); 
    } 
    render() { 
    return <div></div>; 
    } 
} 

connect(state=>({state}))(wrap(Wrapped)); 

Wrap func liefert Wrapper, Sie nicht den Wrapper in Wrap func passieren kann. es ist Schleife

+0

Entschuldigung, ich vermisse es zu tippen, wenn ich die Frage eintippe. Ich aktualisierte die Frage –

+0

, aber es ruft nur einmal componentDidMount –

+0

Sind Sie sicher? Wie hast du das getestet? Es wird jedes Mal in meinem Fall aufgerufen. –