У меня есть ответное приложение с использованием сокращений и неизменяемых js. Когда я отправляю действие с моего главного экрана, он проходит через мои действия, мой редуктор, а затем обратно в мой контейнер, однако представление не обновляется, а компонентWillReceieveProps никогда не вызывается. Кроме того, основным экраном является список, элементы которого являются подкомпонентами Позиция. Вот соответствующий код для проблемы, если вы хотите, чтобы узнать больше, дайте мне знать.Как переопределить подкомпонент на смену с помощью редукса?
Отрендерьте строку с данными:
renderRow(rowData) {
return (
<Item item={ rowData } likePostEvent={this.props.likePostEvent} user={ this.props.user } removable={ this.props.connected } />
)
}
Часть Item.js, которая отправляет действие, и показывает результат:
<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>
Действие посланы идет к firebase, который имеет обработчик onChange, который отправляет другое действие.
Редуктор:
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)
Контейнер:
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
}
}
Где подключить OnChange:
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
}
}
Вызов получить начальное состояние:
this.props.getInitialState({
addItem: this.props.addItem,
removeItem: this.props.removeItem,
goOnline: this.props.goOnline,
goOffline: this.props.goOffline,
itemChanged: this.props.itemChanged
})
Любые предложения приветствуются, спасибо огромное!
Так что я не уверен, что проблема связана с тем, что эти два действия являются отдельными. Когда я нажимаю стрелку вверх, он отправляет действие, которое меняет базу данных, отдельно, у меня есть функция, связанная с элементом изменения, который должен изменить вид. –
См. Обновленный код выше –