【发布时间】:2023-02-15 19:51:53
【问题描述】:
我这里有一个案例,就是在登录的时候做一个remember me的功能。
所以,昨天我在 codesandbox 上获得了一个在线 repo,其中包含 reactjs 组件记住我。
然后我想把它转换成反应钩子。
代码是这样的(React Component 原创)
import React from "react";
class RememberMe extends React.Component {
static displayName = "RememberMe";
state = {
email: "",
password: "",
isChecked: false
};
componentDidMount() {
if (localStorage.checkbox && localStorage.email !== "") {
this.setState({
isChecked: true,
email: localStorage.username,
password: localStorage.password
});
}
}
onChangeValue = (event) => {
this.setState({
[event.target.name]: event.target.value
});
};
onChangeCheckbox = (event) => {
this.setState({
isChecked: event.target.checked
});
};
loginSubmit = () => {
const { email, password, isChecked } = this.state;
if (isChecked && email !== "") {
localStorage.username = email;
localStorage.password = password;
localStorage.checkbox = isChecked;
}
};
render() {
const { email, password, isChecked } = this.state;
return (
<div>
<form>
<table align="center">
<tr>
<td>
<label>Email</label>
</td>
<td>
<input
type="email"
name="email"
value={email}
onChange={this.onChangeValue}
/>
</td>
</tr>
<tr>
<td>
<label>Password</label>
</td>
<td>
<input
type="password"
name="password"
value={password}
onChange={this.onChangeValue}
/>
</td>
</tr>
<tr>
<td colSpan="2">
<input
type="checkbox"
checked={isChecked}
name="lsRememberMe"
onChange={this.onChangeCheckbox}
/>
<label>Remember me</label>
</td>
</tr>
<tr>
<td colSpan="2">
<input type="button" value="Login" onClick={this.loginSubmit} />
</td>
</tr>
</table>
</form>
</div>
);
}
}
export default RememberMe;
然而,当它完成后,我试图将它转换成钩子,但它没有正常工作,我想,“我的代码有什么问题吗?谢谢
import React, { useState, useEffect } from "react";
const Me = () => {
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [isChecked, setIsChecked] = useState(false);
useEffect(() => {
if (localStorage.checkbox && localStorage.email !== "") {
setEmail({ email: localStorage.username });
setPassword({ password: localStorage.password });
setIsChecked({
isChecked: true
});
}
}, []);
const onChangeValue = (event) => {
setIsChecked({
[event.target.name]: event.target.value
});
};
const onChangeCheckbox = (event) => {
setIsChecked({
isChecked: event.target.checked
});
};
const loginSubmit = () => {
if (isChecked && email !== "") {
localStorage.username = email;
localStorage.password = password;
localStorage.checkbox = isChecked;
}
};
return (
<div>
<form>
<table align="center">
<tr>
<td>
<label>Email</label>
</td>
<td>
<input
type="email"
name="email"
value={email}
onChange={onChangeValue}
/>
</td>
</tr>
<tr>
<td>
<label>Password</label>
</td>
<td>
<input
type="password"
name="password"
value={password}
onChange={onChangeValue}
/>
</td>
</tr>
<tr>
<td colSpan="2">
<input
type="checkbox"
checked={isChecked}
name="lsRememberMe"
onChange={onChangeCheckbox}
/>
<label>Remember me</label>
</td>
</tr>
<tr>
<td colSpan="2">
<input type="button" value="Login" onClick={loginSubmit} />
</td>
</tr>
</table>
</form>
</div>
);
};
export default Me;
https://codesandbox.io/s/remember-me-localstorage-forked-crpt1z
【问题讨论】:
-
“它没有正常工作”是不够的。哪些该做的没做,哪些不该做?有什么错误吗?
-
我把codesandbox链接放在了我的问题codesandbox.io/s/remember-me-localstorage-forked-crpt1z ,你可以试试吗?也许你可以在那里修好它。我真的很感激,谢谢你
标签: reactjs