React native 减速机代码第一次运行,但连续运行时只执行操作代码,而减速机代码不执行?|反应本机和还原
我通常试图自己解决问题,所以我通过检查StackOverflow和Google从中学到了更多,但这一次让我陷入了太久的困境 上下文 所以,我正在创建一个React原生应用程序(无Expo),并使用redux、redux thunk和React redux 有一个功能,登录用户应该能够输入或编辑他/她的未来日期的可用性。 所以,我有虚拟数据来设置初始值 我可以成功编辑任何日期(使用availability day.component.tsx)并在用户配置文件屏幕(Profile.component.tsx)上显示更新的可用性 问题 但是,当我尝试在第一次编辑之后编辑任何其他日期时,它将运行我的代码直到相应的redux操作代码结束,但不会执行相应的redux reducer代码(虽然它在第一次编辑时确实运行了该代码) #TLDR 我可以编辑和更新一次现有的可用性,但reducer代码不会在连续编辑的情况下执行 你知道是什么原因造成的吗?如何解决 #档案 由于字符限制,我无法添加下面问题或评论中的所有文件,因此将它们存储在Google Drive上React native 减速机代码第一次运行,但连续运行时只执行操作代码,而减速机代码不执行?|反应本机和还原,react-native,redux,react-redux,React Native,Redux,React Redux,我通常试图自己解决问题,所以我通过检查StackOverflow和Google从中学到了更多,但这一次让我陷入了太久的困境 上下文 所以,我正在创建一个React原生应用程序(无Expo),并使用redux、redux thunk和React redux 有一个功能,登录用户应该能够输入或编辑他/她的未来日期的可用性。 所以,我有虚拟数据来设置初始值 我可以成功编辑任何日期(使用availability day.component.tsx)并在用户配置文件屏幕(Profile.component
// reducer action snippet
export const updateAvailability = (
userId,
userAccountType,
userFirstName,
userLastName,
userEmail,
userPhoneNumber,
userAvatar,
userAddress,
userLocation,
userBio,
userFollowers,
userFollowing,
userPosts,
updatedUserAvailability,
userGender,
userAge,
) => {
return async (dispatch) => {
const date = new Date();
console.log('ARRIVED AT START OF USERS ACTIONS');
console.log(updatedUserAvailability);
try {
dispatch({
type: UPDATE_AVAILABILITY,
profileData: {
userId: userId,
userAccountType: userAccountType,
userFirstName: userFirstName,
userLastName: userLastName,
userEmail: userEmail,
userPhoneNumber: userPhoneNumber,
userAvatar: userAvatar,
userAddress: userAddress,
userLocation: userLocation,
userBio: userBio,
userFollowers: userFollowers,
userFollowing: userFollowing,
userPosts: userPosts,
userAvailability: updatedUserAvailability,
userGender: userGender,
userAge: userAge,
},
});
} catch (err) {
// send to custom analytics server
throw err;
}
};
};
//编辑向redux发送更新值的组件
从“React”导入React;
从“react native”导入{View};
进口{
阿凡达
按钮
样式服务,
文本,
TopNavigation,
TopNavigationAction,
使用样式表,
使用主题,
情态动词
卡片
日期选择器,
纺纱机,
}来自“@ui kitten/components”;
从“../../store/actions/users”导入*作为usersActions;
从“../../data/Profile.model”导入{Availability,Profile};
从“../../assets/images/branding”导入{brandingAppIcon};
从“../../components/UI/time picker.component”导入{Timepicker};
从“../../navigation/profile.navigator”导入{AvailabilityDayEditScreenProps};
从'react redux'导入{useSelector,connect,useDispatch};
从“../../navigation/app routes”导入{AppRoute};
导出类型可用性DayEditRouteParams={
可编辑可用性:编号;
};
导出常量可用性DayEditScreen=(
道具:可用性DayEditScreenProps,
):SafeAreaLayoutElement=>{
const{editableAvailability}=props.route.params;
console.log(可编辑可用性);
const currentUser:Profile=useSelector(
(state)=>state.users.activeProfile,
);
console.log(当前用户);
const[isLoading,setIsLoading]=React.useState(false);
const[error,setError]=React.useState();
const[activeUser,setActiveUser]=React.useState(当前用户);
const[userAvailability,setUserAvailability]=React.useState<
可用性[]
>(activeUser.userAvailability);
const[userAvailabilityEditing,setUserAvailabilityEditing]=React.useState<
对象
>(activeUser.userAvailability[editableAvailability]);
常量[editDate,setEditDate]=React.useState(
userAvailabilityEditing.date,
);
const[editDateFrom,setEditDateFrom]=React.useState(
userAvailabilityEditing.from,
);
常量[editDateTo,setEditDateTo]=React.useState(
userAvailabilityEditing.to,
);
React.useffect(()=>{
setActiveUser(当前用户);
setUserAvailability(currentUser.userAvailability);
},[currentUser]);
const dispatch=usedpatch();
const submitHandler=React.useCallback(异步()=>{
//如果(!formState.formIsValid){
//Alert.Alert('输入错误!','请检查表单中的错误'[
//{文本:'确定'},
// ]);
//返回;
// }
设置错误(空);
设置加载(真);
试一试{
console.log(用户可用性编辑);
//log('EDITDATE='+EDITDATE);
//log('EDITFROM='+editDateFrom);
//log('EDITTO='+editDateTo);
const newUserAvailabilityEditing={
…用户可用性编辑,
发件人:editDateFrom,
致:editDateTo,
};
console.log(newUserAvailabilityEditing);//正确
//setEditDate(未定义);//重置editDate
const updatedUserAvailability=userAvailability.map((availItem)=>{
if(userAvailability.indexOf(availItem)==editableAvailability){
返回newUserAvailabilityEditing;
}
返回有效性;
});
console.log(“下面更新的用户可用性”);
console.log(updateUserAvailability);//正确
//log(activeUser);
if(activeUser){
待命(
usersActions.updateAvailability(
activeUser.userId,
activeUser.userAccountType,
activeUser.userFirstName,
activeUser.userLastName,
activeUser.userEmail,
activeUser.userPhoneNumber,
activeUser.userAvatar,
activeUser.userAddress,
activeUser.userLocation,
activeUser.userBio,
activeUser.userFollowers,
activeUser.userFollowing,
activeUser.userPosts,
更新的可用性,
activeUser.userGender,
activeUser.userAge,
),
);
}
}捕捉(错误){
设置错误(错误消息);
}
设置加载(假);
log(“将用户发送回配置文件屏幕”);
道具.导航.导航(AppRoute.PROFILE);
}, [
道具,导航,
用户可用性编辑,
编辑日期:,
编辑日期:,
用户可用性,
activeUser,
可编辑可用性,
派遣,
]);
如果(孤岛加载){
返回(
);
}
返回(
(
)}>
请编辑此日期的可用性。
{
setEditDateFrom(下一个时间);
}}
/>
{
setEditDateTo(下一个时间);
}}
/>
{错误}
更新可用性
);
};
constyles=StyleService.c
// redux reducer snippet
import {
GET_PROFILES,
CREATE_PROFILE,
UPDATE_PROFILE,
UPDATE_AVAILABILITY,
} from '../actions/users';
const initialState = {
availableProfiles: PROFILES,
activeProfile: PROFILES.find((profile) => profile.userId === 'u2'),
error: null,
};
const usersReducer = (state = initialState, action) => {
switch (action.type) {
case UPDATE_AVAILABILITY:
console.log('ARRIVED AT START REDUCER');
// Find and update the activeUser Profile.
const updatingProfileIndex = state.availableProfiles.findIndex(
(profile) => profile.userId === action.profileData.userId,
);
console.log(updatingProfileIndex);
console.log(action.profileData.userAvailability);
const updatedAvailabilityProfile = new Profile(
action.profileData.userId,
action.profileData.userAccountType,
action.profileData.userFirstName,
action.profileData.userLastName,
action.profileData.userEmail,
action.profileData.userPhoneNumber,
action.profileData.userAvatar,
action.profileData.userAddress,
action.profileData.userLocation,
action.profileData.userBio,
action.profileData.userFollowers,
action.profileData.userFollowing,
action.profileData.userPosts,
action.profileData.userAvailability,
action.profileData.userGender,
action.profileData.userAge,
);
console.log(updatedAvailabilityProfile);
console.log(
'UPDATED AVAILABILITIY PROFILE=' +
JSON.stringify(updatedAvailabilityProfile),
);
// const updatedActiveProfile = [...state.activeProfile];
// console.log(updatedActiveProfile);
// updatedActiveProfile[profileIndex] = updatedProfile;
// console.log(updatedActiveProfile);
// Update the activeUser Profile in the availableProfiles array.
const updatingAvailableProfiles = {...state.availableProfiles};
updatingAvailableProfiles[
updatingProfileIndex
] = updatedAvailabilityProfile;
// Return the updated profile states
return {
...state,
availableProfiles: updatingAvailableProfiles,
activeProfile: updatedAvailabilityProfile,
};
default:
return state;
}
};
export default usersReducer;
// editing component that sends updated values to redux
import React from 'react';
import {View} from 'react-native';
import {
Avatar,
Button,
StyleService,
Text,
TopNavigation,
TopNavigationAction,
useStyleSheet,
useTheme,
Modal,
Card,
Datepicker,
Spinner,
} from '@ui-kitten/components';
import * as usersActions from '../../store/actions/users';
import {Availability, Profile} from '../../data/profile.model';
import {brandingAppIcon} from '../../assets/images/branding';
import {Timepicker} from '../../components/UI/time-picker.component';
import {AvailabilityDayEditScreenProps} from '../../navigation/profile.navigator';
import {useSelector, connect, useDispatch} from 'react-redux';
import {AppRoute} from '../../navigation/app-routes';
export type AvailabilityDayEditRouteParams = {
editableAvailability: number;
};
export const AvailabilityDayEditScreen = (
props: AvailabilityDayEditScreenProps,
): SafeAreaLayoutElement => {
const {editableAvailability} = props.route.params;
console.log(editableAvailability);
const currentUser: Profile = useSelector(
(state) => state.users.activeProfile,
);
console.log(currentUser);
const [isLoading, setIsLoading] = React.useState(false);
const [error, setError] = React.useState();
const [activeUser, setActiveUser] = React.useState<Profile>(currentUser);
const [userAvailability, setUserAvailability] = React.useState<
Availability[]
>(activeUser.userAvailability);
const [userAvailabilityEditing, setUserAvailabilityEditing] = React.useState<
Object
>(activeUser.userAvailability[editableAvailability]);
const [editDate, setEditDate] = React.useState<Date>(
userAvailabilityEditing.date,
);
const [editDateFrom, setEditDateFrom] = React.useState<Date>(
userAvailabilityEditing.from,
);
const [editDateTo, setEditDateTo] = React.useState<Date>(
userAvailabilityEditing.to,
);
React.useEffect(() => {
setActiveUser(currentUser);
setUserAvailability(currentUser.userAvailability);
}, [currentUser]);
const dispatch = useDispatch();
const submitHandler = React.useCallback(async () => {
// if (!formState.formIsValid) {
// Alert.alert('Wrong input!', 'Please check the errors in the form.', [
// {text: 'OK'},
// ]);
// return;
// }
setError(null);
setIsLoading(true);
try {
console.log(userAvailabilityEditing);
// console.log('EDITDATE=' + editDate);
// console.log('EDITFROM=' + editDateFrom);
// console.log('EDITTO=' + editDateTo);
const newUserAvailabilityEditing = {
...userAvailabilityEditing,
from: editDateFrom,
to: editDateTo,
};
console.log(newUserAvailabilityEditing); // CORRECT
// setEditDate(undefined); // reset editDate
const updatedUserAvailability = userAvailability.map((availItem) => {
if (userAvailability.indexOf(availItem) === editableAvailability) {
return newUserAvailabilityEditing;
}
return availItem;
});
console.log('UPDATED USER AVAILABILITY BELOW');
console.log(updatedUserAvailability); // CORRECT
// console.log(activeUser);
if (activeUser) {
await dispatch(
usersActions.updateAvailability(
activeUser.userId,
activeUser.userAccountType,
activeUser.userFirstName,
activeUser.userLastName,
activeUser.userEmail,
activeUser.userPhoneNumber,
activeUser.userAvatar,
activeUser.userAddress,
activeUser.userLocation,
activeUser.userBio,
activeUser.userFollowers,
activeUser.userFollowing,
activeUser.userPosts,
updatedUserAvailability,
activeUser.userGender,
activeUser.userAge,
),
);
}
} catch (err) {
setError(err.message);
}
setIsLoading(false);
console.log('Sending User Back to Profile Screen');
props.navigation.navigate(AppRoute.PROFILE);
}, [
props.navigation,
userAvailabilityEditing,
editDateFrom,
editDateTo,
userAvailability,
activeUser,
editableAvailability,
dispatch,
]);
if (isLoading) {
return (
<View style={styles.centeredLoader}>
<Spinner size="large" />
</View>
);
}
return (
<Card
disabled={true}
style={styles.container}
header={() => (
<View>
<Avatar style={styles.profileAvatar} source={brandingAppIcon} />
</View>
)}>
<Text>Please edit your availability for this date.</Text>
<View style={styles.availabilityDayEdit}>
<Datepicker date={editDate} disabled />
<Timepicker
key={'editStartTime'}
placeholder="Available to start at"
date={editDateFrom}
onSelect={(nextTime) => {
setEditDateFrom(nextTime);
}}
/>
<Timepicker
key={'editEndTime'}
placeholder="Available until"
date={editDateTo}
onSelect={(nextTime) => {
setEditDateTo(nextTime);
}}
/>
</View>
<Text>{error}</Text>
<Button onPress={submitHandler}>UPDATE AVAILABILITY</Button>
</Card>
);
};
const styles = StyleService.create({
safeArea: {
flex: 1,
},
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
// backgroundColor: 'background-basic-color-2',
},
appName: {
color: 'text-control-color',
},
header: {
flex: 1,
paddingVertical: 24,
alignItems: 'center',
justifyContent: 'center',
},
profileAvatar: {
width: 124,
height: 124,
alignSelf: 'center',
borderRadius: 62,
marginVertical: 16,
},
profileName: {
zIndex: 1,
},
locationContainer: {
flexDirection: 'row',
alignItems: 'center',
},
location: {
marginVertical: 8,
},
profileButtonsContainer: {
flexDirection: 'row',
marginVertical: 32,
marginHorizontal: 20,
},
profileButton: {
flex: 1,
marginHorizontal: 4,
},
socialsContainer: {
flexDirection: 'row',
width: '75%',
marginVertical: 8,
},
profileSocial: {
flex: 1,
alignSelf: 'center',
},
sectionLabel: {
marginTop: 16,
marginBottom: 8,
marginHorizontal: 16,
},
profileDescription: {
marginHorizontal: 16,
},
friendsList: {
marginHorizontal: 8,
},
friendItem: {
alignItems: 'center',
marginHorizontal: 8,
},
friendName: {
marginTop: 8,
},
postItem: {
flex: 1,
aspectRatio: 1.0,
},
availabilityContainer: {
marginLeft: 16,
marginRight: -16,
},
availabilityItemLabel: {
flex: 1,
textDecorationLine: 'underline',
},
availabilityItemValue: {
flex: 1,
},
availabilityItem: {
flexDirection: 'row',
justifyContent: 'flex-start',
alignItems: 'center',
marginVertical: 8,
},
availabilityItemDate: {
flex: 3,
},
availabilityItemTime: {
flex: 1,
},
availabilityItemButton: {
// flex: 1,
marginRight: 30,
},
addVenueItem: {
marginHorizontal: 8,
alignItems: 'center',
marginLeft: 0,
},
addVenueButton: {
aspectRatio: 1.0,
height: 42,
borderRadius: 24,
color: 'text-control-color',
paddingRight: 7,
// resizeMode: 'contain',
// width: 50,
// height: 50,
// borderRadius: 50,
// backgroundColor:'black'
},
addVenueButtonText: {
paddingTop: 5,
fontSize: 13,
},
modalBackdrop: {
backgroundColor: 'rgba(0, 0, 0, 0.5)',
},
availabilityDayEdit: {
flexDirection: 'row',
paddingVertical: 16,
justifyContent: 'space-between',
},
});
connect()(AvailabilityDayEditScreen);
const updatingAvailableProfiles = {...state.availableProfiles};
const updatingAvailableProfiles = state.availableProfiles;