提交登录表单后,我正在针对每种情况从Api获取我的错误,并在正确的输入下显示它们。 问题是提交后登录是否成功,输入状态正在初始化,错误正在显示,但是对于用户而言,每次用户必须返回所有输入并一次又一次地填充它们时,这很烦人。
我是一个有反应的初学者,并且确实对这个问题感到困惑。 这是我现在的位置。
我的登录课程摘要:
class Login extends Component {
constructor(props) {
super(props);
this.state = {
email: "",
password: "",
isLoggedIn: false,
user: {}
};
this.onChange = this.onChange.bind(this);
this.login = this.login.bind(this);
}
login(e) {
e.preventDefault();
this.props.login(this.state.email, this.state.password);
}
onChange(e) {
this.setState({ [e.target.name]: e.target.value });
}
我的输入示例:
<div className="form-group centerErrs">
<input
type="text"
value={this.state.email}
onChange={this.onChange}
className="form-control form-control-user"
placeholder="Username or Email Address"
autoComplete="off"
id="email-input"
name="email"
/>
{this.props.errors ? (
<small className="form-text red">
{this.props.errors.email}
</small>
) : null}
</div>
我的登录功能摘要:
var formData = new FormData();
formData.append("email", email);
formData.append("password", password);
//posting to the api
.then(json => {
if (json.data.success) {
//handling the user data
let appState = {
isLoggedIn: true,
user: userData
};
// save app state with user date in local storage
localStorage["appState"] = JSON.stringify(appState);
this.setState({
isLoggedIn: appState.isLoggedIn,
user: appState.user
});
//updated : here how i handle in fail case
else {
let appState = {
isLoggedIn: false,
errors: json.data
};
this.setState({
isLoggedIn: appState.isLoggedIn,
errors: appState.errors
});
}
更新:这是我的父组件构造函数:
constructor(props) {
super(props);
this.state = {
isLoggedIn: false,
user: {},
errors: {},
};
this.login = this.login.bind(this);
}
更新登录容器:
const LoginContainer = () => (
<div>
{!this.state.isLoggedIn ? (
<Login login={this.login} errors={this.state.errors} />
) : (
<Redirect to="/" />
)}
</div>
);
以及父级中的渲染器:
<Route exact path="/(login)" component={LoginContainer} />
我只想在表单提交失败时保持输入状态。
我将不胜感激,并感谢您。
答案 0 :(得分:0)
只要LoginContainer是一个函数,而不是ReactJs Component,它将重新创建整个UI,因此您应将其转换为React.Component,并且检查Auth状态的逻辑不应位于LoginContainer内部,因为路由Login不应如果用户已登录,则不存在
{this.state.loggedin?
[Auth routes]:
[<Route exact path="/(login)" component={LoginContainer} />...]
P.S。最好使用全局存储来存储auth状态,例如redux或unstated或其他任何状态。