Ich habe eine reaktive native App mit redux und unveränderlichen js. Wenn ich eine Aktion von meinem Hauptbildschirm aus aussende, geht sie durch meine Aktionen, zu meinem Reduzierer und dann zurück zu meinem Container. Die Ansicht wird jedoch nicht aktualisiert, und componentWillReceieveProps wird nie aufgerufen. Darüber hinaus ist der Hauptbildschirm eine Liste, deren Einträge Unterkomponenten Artikel sind. Hier ist der relevante Code für das Problem, wenn Sie mehr sehen möchten, lassen Sie es mich wissen.Wie Rendern Sub-Komponente auf Prop-Änderung mit Redux?
Render die Zeile mit den Daten:
renderRow(rowData) {
return (
<Item item={ rowData } likePostEvent={this.props.likePostEvent} user={ this.props.user } removable={ this.props.connected } />
)
}
Der Teil Item.js derdiedas eine Aktion auslöst, und zeigt das Ergebnis:
<View style={{flex: 1, justifyContent:'center', alignItems: 'center'}}>
<TouchableOpacity onPress={ this.changeStatus.bind(this, "up") }>
<Image source={require('../img/up-arrow.png')} style={s.upDownArrow} />
</TouchableOpacity>
<Text style={[s.cardText,{fontSize:16,padding:2}]}>
{ this.props.item.starCount }
</Text>
<TouchableOpacity onPress={ this.changeStatus.bind(this, "down") }>
<Image source={require('../img/up-arrow.png')} style={[s.upDownArrow,{transform: [{rotate: '180deg'}]}]} />
</TouchableOpacity>
</View>
Die Aktion geht Feuerbasis versandt, welches Ein onChange-Handler, der eine andere Aktion auslöst.
Der Druckminderer:
const initialState = Map({
onlineList: [],
offlineList: [],
filteredItems: [],
connectionChecked: false,
user: ''
})
...
...
case ITEM_CHANGED:
list = state.get('onlineList')
if(state.get('onlineList').filter((e) => e.id == action.item.id).length > 0){
let index = state.get('onlineList').findIndex(item => item.id === action.item.id);
list[index] = action.item
list = list.sort((a, b) => b.time_posted - a.time_posted)
}
return state.set('onlineList', list)
.set('offlineList', list)
Der Behälter:
function mapStateToProps(state) {
return {
onlineItems: state.items.get('onlineList'),
offlineItems: state.items.get('offlineList'),
filteredItems: state.items.get('filteredItems'),
connectionChecked: state.items.get('connectionChecked'),
connected: state.items.get('connected'),
user: state.login.user
}
}
Wo ich die onChange verbinden:
export function getInitialState(closure_list) {
itemsRef.on('child_removed', (snapshot) => {
closure_list.removeItem(snapshot.val().id)
})
itemsRef.on('child_added', (snapshot) => {
closure_list.addItem(snapshot.val())
})
itemsRef.on('child_changed', (snapshot) => {
closure_list.itemChanged(snapshot.val())
})
connectedRef.on('value', snap => {
if (snap.val() === true) {
closure_list.goOnline()
} else {
closure_list.goOffline()
}
})
return {
type: GET_INITIAL_STATE,
connected: true
}
}
Anfangszustand Aufruf erhalten:
this.props.getInitialState({
addItem: this.props.addItem,
removeItem: this.props.removeItem,
goOnline: this.props.goOnline,
goOffline: this.props.goOffline,
itemChanged: this.props.itemChanged
})
Alle Vorschläge sind willkommen, vielen Dank!
Also ich bin mir nicht sicher, dass das das Problem ist, weil die zwei Aktionen getrennt sind. Wenn ich den Aufwärtspfeil drücke, wird eine Aktion gesendet, die die Datenbank ändert, separat, ich habe eine Funktion, die mit einem Änderungselement verbunden ist, das die Ansicht ändern soll. –
Siehe aktualisierten Code oben –