我有以下代码检查user_id(如果可用)然后登录,但只有在我刷新应用程序时它才会登录。知道如何在没有这个的情况下实现这一目标吗?
这是功能的顺序:
首先点击Login.js
中的登录按钮:
<TouchableOpacity onPress={handleSubmit(_signIn)} style={{margin: 10, alignItems: 'center'}}>
然后是_signIn
Login.js
函数
_signIn = (values, dispatch) => {
const email = values.email;
const password = values.password;
dispatch(loginUser(email, password));
}
现在我们从loginUser
authActions.js
发送了电子邮件和密码
export function loginUser(email, password) {
return function (dispatch) {
return axios.post(SIGNIN_URL, { email, password }).then((response) => {
var { user_id, token } = response.data;
onSignIn(user_id); // Here I pass 'user_id' to onSignIn function
}).catch((error) => {
dispatch(addAlert("Could not log in."));
});
};
}
现在我们从user_id
loginUser
获取Auth.js
import { AsyncStorage } from "react-native";
const USER_KEY = "auth_key";
export const onSignIn = (user_id) => AsyncStorage.setItem(USER_KEY, user_id);
export const onSignOut = () => AsyncStorage.removeItem(USER_KEY);
export const isSignedIn = () => {
return new Promise((resolve, reject) => {
AsyncStorage.getItem(USER_KEY)
.then(res => {
if (res !== null) {
resolve(true);
} else {
resolve(false);
}
})
.catch(err => reject(err));
});
};
现在在App.js
我正在调用函数isSignedIn
来检查user_id
是否可用,如果有,则选择要显示的屏幕
constructor(props) {
super(props);
this.state = {
signedIn: false,
checkedSignIn: false
};
}
componentDidMount() {
isSignedIn()
.then(res => this.setState({ signedIn: res, checkedSignIn: true }))
.catch(err => alert("An error occurred"));
}
render() {
const { checkedSignIn, signedIn } = this.state;
// If we haven't checked AsyncStorage yet, don't render anything (better ways to do this)
if (!checkedSignIn) {
return null;
}
const Layout = createRootNavigator(signedIn);
答案 0 :(得分:0)
它不是异步函数回调问题 - 我知道如何使用它,因为你已经在isSignedIn
函数中使用它了。
您确实致电onSignIn(userId)
,但您没有通知任何人。那些调用isSignedIn
的函数应该以某种方式知道登录的用户。
基于这个问题以及之前的问题,我想您应该选择应用程序的体系结构(redux或只是函数式编程或其他)并记住它。
如果您想使用redux,您应该发送一个关于登录用户的操作,并反映您需要它的状态更改。