完成提交事件后,React.js组件不会重新渲染
问题描述:
我开始学习React.js。所以说,我写的登录表单,当用户进入页面和主页,当用户成功登录,会告诉我们将向完成提交事件后,React.js组件不会重新渲染
基本上,我的项目结构是这样的:
- node_modules
- 公共
- SRC
- 组件
- 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中,但组件未重新呈现,主页未显示。 只有在成功登录尝试后手动刷新页面时,才会显示主页。
您的善意建议深表谢意。谢谢。
答
那么,如果你想要点击提交按钮后重新渲染组件,你需要改变表单提交时的状态。我建议你在当地州保留isAlreadyAuthenticated
。所以,你的国家应该是这个样子,
this.state={
username:'',
password:'',
isAlreadyAuthenticated: false
}
然后,当点击提交按钮将其设置为true,这样组件被重新描绘和家庭成分是hsown按照你的逻辑。所以,你的手柄提交的回调应该是这样的,
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));
// Update the state here, so it triggers a rerender of the component.
this.setState({isAlreadyAuthenticated, true})
this.setState();
}else{
}
})
}
确保得到像this.state.isAlreadyAuthenticated
状态,当你把它抓回来。
+0
感谢您的建议。我已经修改和测试过。现在没事了。我只在我的提取函数中修改了一下,以便能够通过使用'=>'来访问当前状态值。 –
在构造函数this.isAlreadyAuthenticated中执行此操作= this.isAlreadyAuthenticated.bind(this)。你也需要改变状态,以便组件重新渲染 – dynamo
用'this.setState({})替换'this.setState();'' – Ved
我已经修改和测试,但没有运气,仍然没有加工。感谢堆积极的建议。 –