2017-01-07 3 views
2

Was ist der richtige Weg, um Default-Requisiten zu reagieren, so dass beim Aufruf von map auf einer Requisite, die asynchron mit redux zugewiesen wurde, kein undefinierter Fehler auftritt? Mit der folgenden Syntax erhalte ich einen Fehler, wenn ich versuche, trans_filter zuzuordnen, da Daten beim ersten Aufruf zum Rendern nicht definiert sind.Wie deklariert ReactJS Standardrequisiten bei Verwendung von Redux?

class ContainerComponent extends React.Component { 
    static defaultProps = { 
    searchProps: { 
     data: [] 
    } 
    }; 

    constructor(props) { 
    super(props); 
    } 

    render(){ 
    let trans_filter = JSON.parse(JSON.stringify(this.props.searchProps.data)); 
    } 
} 

const mapStateToProps = (state) => ({ 
    searchProps: state.searchProps 
}); 

export default connect(mapStateToProps, {getTransactionsAll})(ContainerComponent); 
+0

kann http://stackoverflow.com/questions/38004703/set-default-props-for-a-react-component –

+0

Können Sie den Code für 'connect' und den Reducer? – lpan

+0

kein Glück mit diesen Vorschlägen. –

Antwort

3

Hier ist, wie Sie den Standard Requisiten erklären können, wenn für die Erstellung von ReactJS Komponenten der ES6 Klasse Syntax:

class ContainerComponent extends React.Component { 
    constructor(props) { 
    super(props); 
    } 

    render(){ 
    let trans_filter = JSON.parse(JSON.stringify(this.props.searchProps.data)); 
    } 
} 

ContainerComponent.defaultProps = { 
    searchProps: { 
    data: [] 
    } 
}; 

export default ContainerComponent; 

Zusätzlich gibt es eine andere Syntax ist defaultProps für die Erklärung. Dies ist eine Verknüpfung, die jedoch nur funktioniert, wenn in Ihrem Build die ES7-Eigenschaftsinitialisierungen aktiviert sind. Ich gehe davon aus, dass ist, warum es nicht für Sie funktioniert, weil ich keine Probleme mit der Syntax finden Sie unter:

class ContainerComponent extends React.Component { 
    static defaultProps = { 
    searchProps: { 
     data: [] 
    } 
    }; 

    constructor(props) { 
    super(props); 
    } 

    render() { 
    let trans_filter = JSON.parse(JSON.stringify(this.props.searchProps.data)); 
    } 
} 

export default ContainerComponent; 

Edit: Nachdem Sie Ihre mapStateToProps geteilt, ja, es hat etwas mit Redux zu tun!

Das Problem wird durch Ihre reducer verursacht. Sie müssen initial state shape deklarieren, und außerdem müssen Sie den Anfangszustand in jedem Reduzierer angeben. Redux ruft unseren Reducer zum ersten Mal mit einem undefined-Status auf. Dies ist unsere Chance, den Ausgangszustand unserer App zurückzugeben.

Set Anfangszustand:

const searchPropsInitialState = { 
    data: [] 
}; 

in Ihrem Minderer Dann, wenn Sie searchProps manipulieren tun:

function yourReducer(state = searchPropsInitialState, action) { 
    // ... switch or whatever 

    return state; 
} 

Weitere Informationen handling actions in the Redux docs sehen.

+0

Danke. Ich verstehe alles, was du sagst, und ich habe alles versucht, aber ich muss etwas verpassen. Ich verwende ES6, weil ich die Syntax verwenden kann, die ich in meinem Beispielcode habe. Wenn ich meine App starte und console.log (this.props.searchProps.data) ausführe, werde ich beim ersten Mal, wenn der Renderer eingegeben wird, undefiniert und daher der Fehler, den ich bekomme. Warum sollte es undefiniert sein, wenn ich es in meinen Standardrequisiten auf [] gesetzt habe ??? Das ist genau der Zweck für die Verwendung von Standardrequisiten, damit ich den Fehler nicht erhalte. –

+0

Hat es etwas mit Redox zu tun? Ich habe meinen anfänglichen Beispielcode bearbeitet, um die mapStatetoProps einzubeziehen und Code für Redux zu verbinden. –

+0

@ user1991118 ah, ja, es hat etwas mit Redux zu tun! :) Ich habe gerade meine Antwort bearbeitet, siehe oben. Bitte fügen Sie Ihrer Frage auch "Redux" -Tag hinzu. –

Verwandte Themen