【发布时间】:2021-03-15 07:25:03
【问题描述】:
我现在正在制作一个 React Native 应用程序。
在我的应用中,我看到了我的个人资料屏幕
在profile screen 中,我得到了一个edit button,这将导致编辑屏幕
在我的个人资料屏幕中,我正在使用 useDispatch 请求 api。fetchAuthMember正在请求用户数据
useEffect(() => {
async function fetchData() {
await dispatch(fetchAuthMember(token.access_token));
await dispatch(fetchCountryList());
}
fetchData();
}, []);
我在配置文件组件中是这样渲染的
const renderItem = () => {
return (
<View>
<View style={styles.profileTitle}>
<Icon2 name="user-o" size={30} color="black" />
<Text style={styles.titleFont}> My Profile</Text>
<View style={styles.contentContainer}>
<Text style={styles.firstName}>{userInfo.FirstName}</Text>
<Text style={styles.lastName}>{userInfo.LastName}</Text>
</View>
</View>
<TouchableOpacity
style={styles.buttonHalfWidth}
onPress={() =>
navigation.navigate('EditProfile', {
screen: 'EditProfile',
params: {
firstName: userInfo.FirstName,
lastName: userInfo.LastName,
},
})
}>
<Icon2 name="edit" size={30} color="#0382C4" />
<Text style={styles.buttonText}>Edit</Text>
</TouchableOpacity>
</View>
所以当我按下编辑按钮时。它将导航到edit screen。
在编辑屏幕中
当用户按下按钮时,我正在更新这样的数据
let dataToSend = {
FirstName: FirstName,
LastName: LastName,
};
console.log(dataToSend)
await dispatch(updateMemberInfo(token.access_token, dataToSend));
await dispatch(fetchAuthMember(token.access_token));
navigation.navigate('MyProfile');
如您所见,我正在使用async and await,并且我也在此处重用fetchAuthMember。
这将再次获取用户。之后导航到profile 页面。事情是
我的profile page 上的名字和姓氏没有更新。但是,如果我尝试在邮递员中调用它。我可以看到更新的数据。我有什么遗漏吗?
行动
export const fetchAuthMember = (token) => (dispatch) => {
alert('fetching member')
axios
.get(`${baseUri}/api/members`, {
headers: {
Authorization: `bearer ${token}`,
},
})
.then((res) => {
dispatch({
type: FETCH_USERINFO,
payload: res.data,
});
});
};
export const updateMemberInfo = (token, data) => (dispatch) => {
axios
.put(`${baseUri}/api/members/edit`, data, {
headers: {
'Authorization': `bearer ${token}`,
'Content-Type': 'application/json'
},
})
.then((res) => {
dispatch({
type: UPDATE_USERINFO,
payload: res.data,
});
}).catch((err) => {
console.log(err)
})
};
减速器
export const authReducer = (state = initialState, action) => {
switch (action.type) {
case LOGGED_IN:
return {...state, token: action.payload, loggedIn: true};
case LOGGED_OUT:
return {...state, token: '', loggedIn: false};
case FETCH_USERINFO:
return {...state, userInfo: action.payload};
case UPDATE_USERINFO:
return {...state};
default:
return state;
}
};
【问题讨论】:
-
dispatch不是async所以不清楚你为什么要等他们。这些异步操作的作用是什么,它们如何更新您的 reducer 中的状态,以及您的 UI 如何订阅您的 redux 存储以进行更改? -
@DrewReese 您可以使用
await dispatch(thunkAction(arg))或await thunkAction(arg)(dispatch)等待调度一个 thunk 操作重击动作。不过,要使其正常工作,thunkAction 必须返回一个承诺。 -
您的问题似乎缺少您的操作。如果它们是 thunk 操作,请确保您返回来自它们的承诺:
const thunkAction = arg => dispatch => { return asyncStuff.then((result)=>dispatch(something(result)))} -
@HMR 你是正确的 if 调度的 action 返回一个 Promise,但 OP 似乎正在处理所有效果挂钩中的异步调用,而不是 thunk 中的异步调用。目前尚不清楚这些操作在做什么,因此需要更多上下文。
-
啊,您使用
res.data的有效负载发送该操作,因此如果它是空的或者您不使用它,您可能需要删除它。
标签: reactjs react-native redux react-redux