我正在学习React Native
和Redux
,并且我已经开始使用第三方库 - 特别是React Navigation
。
我有两个屏幕,Main Screen
和Alarm Setup Screen
。
Main Screen
有一个警报列表,Alarm Setup Screen
包含警报的详细信息,并提供编辑其详细信息的可能性(小时,重复,启用等)。
我在Main Screen
上有一个按钮来创建一个新警报。当用户按下按钮时,用户被重定向到Alarm Setup Screen
并且必须创建新警报。新警报已经默认填充了所有参数,并且已添加到redux状态。
我在Alarm Setup Screen
(Save
和Cancel
)上也有两个按钮。
如果用户按下Cancel
按钮,我会删除创建的新警报,并使用goBack()
中的React Navigation
功能。
问题是当用户按下Cancel
上的创建新警报按钮后按下Main Screen
按钮。
如果我从Redux
状态删除新创建的警报,则会出现错误,因为屏幕会尝试渲染并且警报不再存在。发生这种情况是因为在触发goBack()
函数之前状态已更改。
cancelAlarmEditButton() {
const alarmToDelete = this.props.alarmSetup.deleteNewAlarm;
const {goBack} = this.props.navigation;
goBack();
this.props.dispatchDeleteCurrentAlarmState(alarmToDelete.id);
}
由于我无法找到解决此问题的方法,因此我尝试更新Redux
上的Main Screen
州。这没有任何错误,但删除警报时不会更新警报列表。
checkAlarmToDelete() {
const alarmToDelete = this.props.alarmSetup.deleteNewAlarm;
if (alarmToDelete && alarmToDelete.delete) {
this.props.dispatchDeleteCurrentAlarmState(alarmToDelete.id);
}
}
componentDidUpdate() {
this.checkAlarmToDelete();
}
如果我更新Redux
中的Alarm Setup Screen
状态,则会收到错误消息。如果
我更新Main Screen
状态不正确。
//Reducer code:
case DELETE_ALARM: {
const {id} = action.payload;
const alarmsData = state.alarmsData.filter(val => val !== id)
const mergedState = state.merge({
deleteNewAlarm: undefined,
alarmsData: {
[id]: undefined,
},
}, { deep: true })
return saveState(mergedState)
return state;
基本上,我想了解使用Redux
功能管理React Navigation
州和goBack()
的最佳方式。
有没有人能解决我的问题?
答案 0 :(得分:0)
我只是设法解决我的问题。 在更新redux状态之前,我只需更改render函数以返回一个空的View。
cancelAlarmEditButton() {
const {goBack} = this.props.navigation;
const {alarmId, newAlarm} = this.props.navigation.state.params;
if (newAlarm) {
this.render = () => {
return (<View/>)
}
this.props.dispatchDeleteCurrentAlarmState(alarmId);
}
goBack();
}
这样,如果报警对象不再存在则没有问题。