2017-08-25 3 views
0

Wie übermittle ich eine action an die reducer von meiner Komponente?Verbindung zu mapDispatchToProps nicht möglich

Mein Code:

import React, { Component } from 'react'; 
import { Text, View, Button} from 'react-native'; 
import { connect } from 'react-redux'; 

class MyApp extends Component { 
    render(){ 
     return(
     <View> 
      <Text> {this.props.dataReducer.name} </Text> 
      <Button 
      onPress={this.props.setName('newName')} 
      title="Click to change Name" 
      color="blue" 
      /> 
     </View> 
     ); 
    } 
} 

function mapStateToProps (state) { 
    return { 
    dataReducer: state.dataReducer 
    }; 
}; 

function mapDispatchToProps (dispatch) { 
    return { 
    setName: (name) => { 
     dispatch({ 
     type: "SET_NAME", 
     payload: name 
     }) 
    } 
    }; 
}; 


export default connect(mapStateToProps, mapDispatchToProps)(MyApp) 

Die dataReducer:

const initialState = { 
    name:'fromDataReducer', 
    number: 545 
} 

export default function dataReducer (state = initialState, action) { 
    switch (action.type) { 
    case "SET_NAME": 
     return { 
     ...state, 
     name: action.payload 
     } 
    case "resetName": 
     return { 
     ...state, 
     name: 'ResetFromDataReducer' 
     } 
    default: 
     return state 
    } 
} 

Wenn ich mapDispatchToProps nicht verbinden, funktioniert die App gut. Aber wenn ich connect es mit mapStateToProps, wird die App als leer gerendert. Absolut gar nichts. Und ich bekomme die folgende Warnung nach ein paar Sekunden:

enter image description here enter image description here

Mein Speicher in index.android.js ist:

const store = createStore(rootReducer); 

rootReducer importiert wird, wo ich combinedReducers habe. Ich glaube nicht, store ist ein Problem, weil es ohne mapDispatchToProps funktioniert.

Was mache ich falsch? Bitte helfen Sie.

Antwort

1

Indem Sie ein Argument an Ihre setName Funktion übergeben, feuern Sie es sofort.

Versuchen einen Pfeil Funktion, um mit Argumenten zu übergeben:

<Button 
    onPress={() => this.props.setName('newName') } 
    title="Click to change Name" 
    color="blue" 
/> 
+0

Das hat geklappt! Was für ein blöder Fehler ich gemacht habe. Also ohne den dicken Pfeil versucht die Funktion auch ohne Klick zu laden? Aber warum war der Bildschirm leer? – Somename

+1

Ja, das Anwenden von Klammern bewirkt, dass eine Funktion ausgeführt wird, sodass das Umbrechen innerhalb einer Funktion bedeutet, dass sie nur ausgeführt wird, wenn die Umbruchfunktion aufgerufen wird. Glücklich, das hat geholfen. –

+1

Durch das Ausführen der Aktion wird der Speicher aktualisiert, wodurch die Komponente erneut gerendert wird. Wenn die Aktion sofort ausgelöst wird, kann dies dazu führen, dass dieser Prozess unbegrenzt wiederholt wird. –

Verwandte Themen