React Native 返回按钮点击
React Native go back on button click
我对 React 原生开发还很陌生。我正在尝试处理一些基本的身份验证。主页 (App.js) 首先检查它是否可以在我的例子中找到任何 Asyncstorage 参数 access_token。如果它找不到任何内容,它将重定向到登录页面,否则它将带您到仪表板。
我的问题是,用户在 LOGIN.JS 中单击登录后(发送到服务器的数据和接收到的令牌)令牌随后保存在异步存储密钥中,之后这应该带你回到 (App.js) 但它没有。
注意:我没有包含完整的渲染代码,例如:TextInput
APP.JS
import Login from './src/compoments/login/Login'
import Dashboard from './src/compoments/dashboard/Dashboard'
export default class App extends React.Component {
constructor(props){
super(props);
this.state = {
isTokenValid: false,
access_token: '',
}
}
render() {
console.disableYellowBox = true;
this.loadToken();
const isLoggedIn = this.state.isTokenValid;
console.log("Logged IN : ", isLoggedIn);
if (isLoggedIn)
return <Dashboard />;
else
return <Login
onLoginPress={() => this.setState({isLoggedIn: true})}
/>;
}
loadToken(){
retrieveData = async () => {
try {
const value = await AsyncStorage.getItem('access_token');
console.log("TOKEN", value);
if (value !== null) {
this.setState({access_token : value});
this.setState({isTokenValid : true});
console.log(value);
}else{
this.setState({isTokenValid : false});
}
} catch (error) {
console.log("ERROR : ", error)
}
}
}
}
LOGIN.JS
export default class Login extends React.Component {
constructor(props){
super(props);
this.state = {
username: '',
password: '',
param3: '',
serverResponse:'',
isLoggingIn: false,
isLoggedIn: false
}
}
render() {
return (
<View style={styles.container}>
<TouchableOpacity style={styles.buttonContainer}
onPress={this.getLoginApi.bind(this)}>
<Text style={styles.buttonText}>LOGIN</Text>
</TouchableOpacity>
{this.state.isLoggingIn && <ActivityIndicator size="large" color="#0000ff" />}
</View>
);
getLoginApi(){
this.setState({ isLoggingIn: true, message: '' });
var formData = new FormData();
formData.append('param1', this.state.username);
formData.append('param2', this.state.password);
formData.append('param3', this.state.param3);
var request = new XMLHttpRequest();
request.onreadystatechange = (e) => {
if (request.readyState !== 4) {
return;
}
if (request.status === 200) {
this.setState({ isLoggingIn: false })
const status = this.getJSONValue(request.responseText,"status");
console.log('SERVER RESPONSE : ', status);
if(status=="success"){
const token = this.getJSONValue(request.responseText,"token");
console.log("ACCESS TOKEN : ", token);
AsyncStorage.setItem('access_token', token);
this.setState({isLoggedIn: true});
this.props.onLoginPress();
}
} else {
this.setState({ isLoggingIn: false })
console.warn('error');
}
};
request.open('POST', 'https://bla.com/test.php');
request.send(formData);
}
getJSONValue(jsonObj, findKey){
let response = '';
JSON.parse(jsonObj, (key, value) => {
if(key==findKey){
response = value;
}
});
return response;
}
}
您的代码之所以不起作用,是因为在 render App.js 内部,您使用 state isTokenValid 来检查要渲染的组件。
const isLoggedIn = this.state.isTokenValid;
但是当你将道具发送到Login.js
<Login
onLoginPress={() => this.setState({isLoggedIn: true})}
/>
您发送了 onLoginPress 道具,但您将状态 isLoggedIn 设置为 true.. 因此,它创建了一个名为 isLoggedIn 的新状态。它没有将您的 const 的值更改为 true,因为 state 和 const 是不同的。
改成这个应该就可以了
<Login
onLoginPress={() => this.setState({isTokenValid: true})}
/>
我对 React 原生开发还很陌生。我正在尝试处理一些基本的身份验证。主页 (App.js) 首先检查它是否可以在我的例子中找到任何 Asyncstorage 参数 access_token。如果它找不到任何内容,它将重定向到登录页面,否则它将带您到仪表板。
我的问题是,用户在 LOGIN.JS 中单击登录后(发送到服务器的数据和接收到的令牌)令牌随后保存在异步存储密钥中,之后这应该带你回到 (App.js) 但它没有。
注意:我没有包含完整的渲染代码,例如:TextInput
APP.JS
import Login from './src/compoments/login/Login'
import Dashboard from './src/compoments/dashboard/Dashboard'
export default class App extends React.Component {
constructor(props){
super(props);
this.state = {
isTokenValid: false,
access_token: '',
}
}
render() {
console.disableYellowBox = true;
this.loadToken();
const isLoggedIn = this.state.isTokenValid;
console.log("Logged IN : ", isLoggedIn);
if (isLoggedIn)
return <Dashboard />;
else
return <Login
onLoginPress={() => this.setState({isLoggedIn: true})}
/>;
}
loadToken(){
retrieveData = async () => {
try {
const value = await AsyncStorage.getItem('access_token');
console.log("TOKEN", value);
if (value !== null) {
this.setState({access_token : value});
this.setState({isTokenValid : true});
console.log(value);
}else{
this.setState({isTokenValid : false});
}
} catch (error) {
console.log("ERROR : ", error)
}
}
}
}
LOGIN.JS
export default class Login extends React.Component {
constructor(props){
super(props);
this.state = {
username: '',
password: '',
param3: '',
serverResponse:'',
isLoggingIn: false,
isLoggedIn: false
}
}
render() {
return (
<View style={styles.container}>
<TouchableOpacity style={styles.buttonContainer}
onPress={this.getLoginApi.bind(this)}>
<Text style={styles.buttonText}>LOGIN</Text>
</TouchableOpacity>
{this.state.isLoggingIn && <ActivityIndicator size="large" color="#0000ff" />}
</View>
);
getLoginApi(){
this.setState({ isLoggingIn: true, message: '' });
var formData = new FormData();
formData.append('param1', this.state.username);
formData.append('param2', this.state.password);
formData.append('param3', this.state.param3);
var request = new XMLHttpRequest();
request.onreadystatechange = (e) => {
if (request.readyState !== 4) {
return;
}
if (request.status === 200) {
this.setState({ isLoggingIn: false })
const status = this.getJSONValue(request.responseText,"status");
console.log('SERVER RESPONSE : ', status);
if(status=="success"){
const token = this.getJSONValue(request.responseText,"token");
console.log("ACCESS TOKEN : ", token);
AsyncStorage.setItem('access_token', token);
this.setState({isLoggedIn: true});
this.props.onLoginPress();
}
} else {
this.setState({ isLoggingIn: false })
console.warn('error');
}
};
request.open('POST', 'https://bla.com/test.php');
request.send(formData);
}
getJSONValue(jsonObj, findKey){
let response = '';
JSON.parse(jsonObj, (key, value) => {
if(key==findKey){
response = value;
}
});
return response;
}
}
您的代码之所以不起作用,是因为在 render App.js 内部,您使用 state isTokenValid 来检查要渲染的组件。
const isLoggedIn = this.state.isTokenValid;
但是当你将道具发送到Login.js
<Login
onLoginPress={() => this.setState({isLoggedIn: true})}
/>
您发送了 onLoginPress 道具,但您将状态 isLoggedIn 设置为 true.. 因此,它创建了一个名为 isLoggedIn 的新状态。它没有将您的 const 的值更改为 true,因为 state 和 const 是不同的。
改成这个应该就可以了
<Login
onLoginPress={() => this.setState({isTokenValid: true})}
/>