【发布时间】:2017-09-13 14:42:02
【问题描述】:
我开始学习 React.js。因此,我编写了登录表单,当用户访问该页面时我们将显示该表单,而当用户成功登录时将显示主页。
基本上,我的项目结构是这样的:
- node_modules
- 公开
- 源
- 组件
- Login.jsx
- App.js
- index.js
- 组件
代码如下:
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
import registerServiceWorker from './registerServiceWorker';
import 'antd/dist/antd.css';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>, document.getElementById('root'));
registerServiceWorker();
App.js
import React from 'react';
import Home from './containers/Home';
import Login from './components/Login';
const App = () => (
<Login />
);
export default App
Login.jsx
import React, { Component } from 'react';
import Home from '../containers/Home';
class Login extends Component {
constructor(){
super();
this.state={
username:'',
password:''
}
}
handleUsernameChanged(event){
this.setState({username: event.target.value});
}
handlePasswordChanged(event){
this.setState({password: event.target.value});
}
isAuthenticated(){
var userInfo = localStorage.getItem('userInfo');
if(userInfo != null)
{
return true;
}else{
return false;
}
}
render() {
const isAlreadyAuthenticated = this.isAuthenticated();
return (
<div>
{isAlreadyAuthenticated ? <Home /> :
(
<div>
<div className="login">
<div className="login-brand bg-inverse text-white">
<img src="assets/img/logo-white.png" height="36" className="pull-right" alt="" /> Login Panel
</div>
<div className="login-content form-input-flat">
<h4 className="text-center m-t-0 m-b-20">Great to have you back!</h4>
<form>
<div className="form-group">
<input type="text" text={this.state.username} onChange={this.handleUsernameChanged.bind(this)} className="form-control input-lg" placeholder="User Name" />
</div>
<div className="form-group">
<input type="Password" text={this.state.password} onChange={this.handlePasswordChanged.bind(this)} className="form-control input-lg" placeholder="Password" />
</div>
<div className="row m-b-20">
<div className="col-md-12">
<button onClick={(event) => this.handleClick(event)} className="btn btn-lime btn-lg btn-block">Sign in to your account</button>
</div>
</div>
</form>
</div>
</div>
</div>
)
}
</div>
);
}
handleClick(event){
event.preventDefault();
var apiBaseUrl = "http://localhost:51171/api/user/validate?user_name=" + this.state.username + '&user_password=' + this.state.password;
console.log(apiBaseUrl);
fetch(apiBaseUrl)
.then((resp) => resp.json()) // Transform the data into json
.then(function(data) {
console.log(data);
if(data[0].status === "1")
{
localStorage.setItem('userInfo', JSON.stringify(data));
this.setState();
}else{
}
})
}
}
export default Login;
登录时遇到问题。登录成功,用户信息存储在 LocalStorage 中,但组件未重新渲染,主页未显示。 登录成功后手动刷新页面才会显示主页。
非常感谢您的善意建议。谢谢。
【问题讨论】:
-
在构造函数 this.isAlreadyAuthenticated = this.isAlreadyAuthenticated.bind(this) 中执行此操作。并且您还需要更改状态以使组件重新渲染
-
用
this.setState({});替换this.setState(); -
我已经修改并测试过,但没有运气,仍然无法正常工作。感谢堆的好意建议。
-
当我更改为在我的 fetch 函数中使用 '=>' 作为访问状态值的相同上下文时,它现在可以工作了。感谢堆的帮助。干杯!
标签: reactjs components