Javascript 为什么赢了';当我使用重定向时,我的组件是否重新渲染?
我正在使用LaravelAPI在React中进行身份验证,除了一些路由器问题外,其他一切都工作得很好 我有条件地呈现如下重定向:Javascript 为什么赢了';当我使用重定向时,我的组件是否重新渲染?,javascript,reactjs,react-router,react-dom,Javascript,Reactjs,React Router,React Dom,我正在使用LaravelAPI在React中进行身份验证,除了一些路由器问题外,其他一切都工作得很好 我有条件地呈现如下重定向: if (this.state.redirect) { return <Redirect to="/home" />; } const login = localStorage.getItem("isLoggedIn"); if (login) {
if (this.state.redirect) {
return <Redirect to="/home" />;
}
const login = localStorage.getItem("isLoggedIn");
if (login) {
return <Redirect to="/home" />;
}
if(this.state.redirect){
返回;
}
const login=localStorage.getItem(“isLoggedIn”);
如果(登录){
返回;
}
App.js
export default class App extends Component {
render() {
let navLink = (
<div className="Tab">
<NavLink to="/sign-in" activeClassName="activeLink" className="signIn">
Sign In
</NavLink>
<NavLink exact to="/" activeClassName="activeLink" className="signUp">
Sign Up
</NavLink>
</div>
);
const login = localStorage.getItem("isLoggedIn");
return (
<div className="App">
{login ? (
<Router>
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
) : (
<Router>
{navLink}
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
)}
</div>
);
}
}
export default class Signin extends Component {
constructor(props) {
super(props);
this.state = {
email: "",
password: "",
msg: "",
isLoading: false,
redirect: false,
errMsgEmail: "",
errMsgPwd: "",
errMsg: "",
};
}
onChangehandler = (e) => {
let name = e.target.name;
let value = e.target.value;
let data = {};
data[name] = value;
this.setState(data);
};
onSignInHandler = () => {
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-login", {
email: this.state.email,
password: this.state.password,
})
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
localStorage.setItem("isLoggedIn", true);
localStorage.setItem("userData", JSON.stringify(response.data.data));
this.setState({
msg: response.data.message,
redirect: true,
});
}
if (
response.data.status === "failed" &&
response.data.success === undefined
) {
this.setState({
errMsgEmail: response.data.validation_error.email,
errMsgPwd: response.data.validation_error.password,
});
setTimeout(() => {
this.setState({ errMsgEmail: "", errMsgPwd: "" });
}, 2000);
} else if (
response.data.status === "failed" &&
response.data.success === false
) {
this.setState({
errMsg: response.data.message,
});
setTimeout(() => {
this.setState({ errMsg: "" });
}, 2000);
}
})
.catch((error) => {
console.log(error);
});
};
render() {
if (this.state.redirect) {
return <Redirect to="/home" />;
}
const login = localStorage.getItem("isLoggedIn");
if (login) {
return <Redirect to="/home" />;
}
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers">
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.email}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.msg}</span>
<span className="text-danger">{this.state.errMsgEmail}</span>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.password}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.errMsgPwd}</span>
</FormGroup>
<p className="text-danger">{this.state.errMsg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSignInHandler}
>
Sign In
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
</Form>
</div>
);
}
}
export default class Signup extends Component {
userData;
constructor(props) {
super(props);
this.state = {
signupData: {
name: "",
email: "",
phone: "",
password: "",
isLoading: "",
},
msg: "",
};
}
onChangehandler = (e, key) => {
const { signupData } = this.state;
signupData[e.target.name] = e.target.value;
this.setState({ signupData });
};
onSubmitHandler = (e) => {
e.preventDefault();
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-signup", this.state.signupData)
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
this.setState({
msg: response.data.message,
signupData: {
name: "",
email: "",
phone: "",
password: "",
},
});
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
if (response.data.status === "failed") {
this.setState({ msg: response.data.message });
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
});
};
render() {
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers shadow">
<FormGroup>
<Label for="name">Name</Label>
<Input
type="name"
name="name"
placeholder="Enter name"
value={this.state.signupData.name}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.signupData.email}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="phone">Phone Number</Label>
<Input
type="phone"
name="phone"
placeholder="Enter phone number"
value={this.state.signupData.phone}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.signupData.password}
onChange={this.onChangehandler}
/>
</FormGroup>
<p className="text-white">{this.state.msg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSubmitHandler}
>
Sign Up
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
<Link to="/sign-in" className="text-white ml-5">I'm already member</Link>
</Form>
</div>
);
}
}
导出默认类应用程序扩展组件{
render(){
让导航链接=(
登录
注册
);
const login=localStorage.getItem(“isLoggedIn”);
返回(
{登录(
) : (
{navLink}
)}
);
}
}
Signin.js
export default class App extends Component {
render() {
let navLink = (
<div className="Tab">
<NavLink to="/sign-in" activeClassName="activeLink" className="signIn">
Sign In
</NavLink>
<NavLink exact to="/" activeClassName="activeLink" className="signUp">
Sign Up
</NavLink>
</div>
);
const login = localStorage.getItem("isLoggedIn");
return (
<div className="App">
{login ? (
<Router>
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
) : (
<Router>
{navLink}
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
)}
</div>
);
}
}
export default class Signin extends Component {
constructor(props) {
super(props);
this.state = {
email: "",
password: "",
msg: "",
isLoading: false,
redirect: false,
errMsgEmail: "",
errMsgPwd: "",
errMsg: "",
};
}
onChangehandler = (e) => {
let name = e.target.name;
let value = e.target.value;
let data = {};
data[name] = value;
this.setState(data);
};
onSignInHandler = () => {
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-login", {
email: this.state.email,
password: this.state.password,
})
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
localStorage.setItem("isLoggedIn", true);
localStorage.setItem("userData", JSON.stringify(response.data.data));
this.setState({
msg: response.data.message,
redirect: true,
});
}
if (
response.data.status === "failed" &&
response.data.success === undefined
) {
this.setState({
errMsgEmail: response.data.validation_error.email,
errMsgPwd: response.data.validation_error.password,
});
setTimeout(() => {
this.setState({ errMsgEmail: "", errMsgPwd: "" });
}, 2000);
} else if (
response.data.status === "failed" &&
response.data.success === false
) {
this.setState({
errMsg: response.data.message,
});
setTimeout(() => {
this.setState({ errMsg: "" });
}, 2000);
}
})
.catch((error) => {
console.log(error);
});
};
render() {
if (this.state.redirect) {
return <Redirect to="/home" />;
}
const login = localStorage.getItem("isLoggedIn");
if (login) {
return <Redirect to="/home" />;
}
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers">
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.email}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.msg}</span>
<span className="text-danger">{this.state.errMsgEmail}</span>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.password}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.errMsgPwd}</span>
</FormGroup>
<p className="text-danger">{this.state.errMsg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSignInHandler}
>
Sign In
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
</Form>
</div>
);
}
}
export default class Signup extends Component {
userData;
constructor(props) {
super(props);
this.state = {
signupData: {
name: "",
email: "",
phone: "",
password: "",
isLoading: "",
},
msg: "",
};
}
onChangehandler = (e, key) => {
const { signupData } = this.state;
signupData[e.target.name] = e.target.value;
this.setState({ signupData });
};
onSubmitHandler = (e) => {
e.preventDefault();
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-signup", this.state.signupData)
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
this.setState({
msg: response.data.message,
signupData: {
name: "",
email: "",
phone: "",
password: "",
},
});
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
if (response.data.status === "failed") {
this.setState({ msg: response.data.message });
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
});
};
render() {
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers shadow">
<FormGroup>
<Label for="name">Name</Label>
<Input
type="name"
name="name"
placeholder="Enter name"
value={this.state.signupData.name}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.signupData.email}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="phone">Phone Number</Label>
<Input
type="phone"
name="phone"
placeholder="Enter phone number"
value={this.state.signupData.phone}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.signupData.password}
onChange={this.onChangehandler}
/>
</FormGroup>
<p className="text-white">{this.state.msg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSubmitHandler}
>
Sign Up
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
<Link to="/sign-in" className="text-white ml-5">I'm already member</Link>
</Form>
</div>
);
}
}
导出默认类登录扩展组件{
建造师(道具){
超级(道具);
此.state={
电邮:“,
密码:“”,
味精:“,
孤岛加载:false,
重定向:false,
errMsgEmail:“”,
errMsgPwd:“”,
errMsg:“,
};
}
onChangehandler=(e)=>{
让name=e.target.name;
设值=e.target.value;
让数据={};
数据[名称]=值;
此设置状态(数据);
};
OnSignenHandler=()=>{
this.setState({isLoading:true});
axios
.post(“http://localhost:8000/api/user-登录“{
电子邮件:this.state.email,
密码:this.state.password,
})
。然后((响应)=>{
this.setState({isLoading:false});
如果(response.data.status==200){
setItem(“isLoggedIn”,true);
setItem(“userData”,JSON.stringify(response.data.data));
这是我的国家({
msg:response.data.message,
重定向:对,
});
}
如果(
response.data.status==“失败”&&
response.data.success==未定义
) {
这是我的国家({
errMsgEmail:response.data.validation\u error.email,
errMsgPwd:response.data.validation\u error.password,
});
设置超时(()=>{
this.setState({errMsgEmail:,errMsgPwd:});
}, 2000);
}否则如果(
response.data.status==“失败”&&
response.data.success==false
) {
这是我的国家({
errMsg:response.data.message,
});
设置超时(()=>{
this.setState({errMsg::});
}, 2000);
}
})
.catch((错误)=>{
console.log(错误);
});
};
render(){
if(this.state.redirect){
返回;
}
const login=localStorage.getItem(“isLoggedIn”);
如果(登录){
返回;
}
const isLoading=this.state.isLoading;
返回(
电子邮件id
{this.state.msg}
{this.state.errMsgEmail}
密码
{this.state.errMsgPwd}
{this.state.errMsg}
登录
{孤岛加载(
) : (
)}
);
}
}
Signup.js
export default class App extends Component {
render() {
let navLink = (
<div className="Tab">
<NavLink to="/sign-in" activeClassName="activeLink" className="signIn">
Sign In
</NavLink>
<NavLink exact to="/" activeClassName="activeLink" className="signUp">
Sign Up
</NavLink>
</div>
);
const login = localStorage.getItem("isLoggedIn");
return (
<div className="App">
{login ? (
<Router>
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
) : (
<Router>
{navLink}
<Route exact path="/" component={Signup}></Route>
<Route path="/sign-in" component={Signin}></Route>
<Route path="/home" component={Home}></Route>
</Router>
)}
</div>
);
}
}
export default class Signin extends Component {
constructor(props) {
super(props);
this.state = {
email: "",
password: "",
msg: "",
isLoading: false,
redirect: false,
errMsgEmail: "",
errMsgPwd: "",
errMsg: "",
};
}
onChangehandler = (e) => {
let name = e.target.name;
let value = e.target.value;
let data = {};
data[name] = value;
this.setState(data);
};
onSignInHandler = () => {
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-login", {
email: this.state.email,
password: this.state.password,
})
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
localStorage.setItem("isLoggedIn", true);
localStorage.setItem("userData", JSON.stringify(response.data.data));
this.setState({
msg: response.data.message,
redirect: true,
});
}
if (
response.data.status === "failed" &&
response.data.success === undefined
) {
this.setState({
errMsgEmail: response.data.validation_error.email,
errMsgPwd: response.data.validation_error.password,
});
setTimeout(() => {
this.setState({ errMsgEmail: "", errMsgPwd: "" });
}, 2000);
} else if (
response.data.status === "failed" &&
response.data.success === false
) {
this.setState({
errMsg: response.data.message,
});
setTimeout(() => {
this.setState({ errMsg: "" });
}, 2000);
}
})
.catch((error) => {
console.log(error);
});
};
render() {
if (this.state.redirect) {
return <Redirect to="/home" />;
}
const login = localStorage.getItem("isLoggedIn");
if (login) {
return <Redirect to="/home" />;
}
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers">
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.email}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.msg}</span>
<span className="text-danger">{this.state.errMsgEmail}</span>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.password}
onChange={this.onChangehandler}
/>
<span className="text-danger">{this.state.errMsgPwd}</span>
</FormGroup>
<p className="text-danger">{this.state.errMsg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSignInHandler}
>
Sign In
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
</Form>
</div>
);
}
}
export default class Signup extends Component {
userData;
constructor(props) {
super(props);
this.state = {
signupData: {
name: "",
email: "",
phone: "",
password: "",
isLoading: "",
},
msg: "",
};
}
onChangehandler = (e, key) => {
const { signupData } = this.state;
signupData[e.target.name] = e.target.value;
this.setState({ signupData });
};
onSubmitHandler = (e) => {
e.preventDefault();
this.setState({ isLoading: true });
axios
.post("http://localhost:8000/api/user-signup", this.state.signupData)
.then((response) => {
this.setState({ isLoading: false });
if (response.data.status === 200) {
this.setState({
msg: response.data.message,
signupData: {
name: "",
email: "",
phone: "",
password: "",
},
});
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
if (response.data.status === "failed") {
this.setState({ msg: response.data.message });
setTimeout(() => {
this.setState({ msg: "" });
}, 2000);
}
});
};
render() {
const isLoading = this.state.isLoading;
return (
<div>
<Form className="containers shadow">
<FormGroup>
<Label for="name">Name</Label>
<Input
type="name"
name="name"
placeholder="Enter name"
value={this.state.signupData.name}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="email">Email id</Label>
<Input
type="email"
name="email"
placeholder="Enter email"
value={this.state.signupData.email}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="phone">Phone Number</Label>
<Input
type="phone"
name="phone"
placeholder="Enter phone number"
value={this.state.signupData.phone}
onChange={this.onChangehandler}
/>
</FormGroup>
<FormGroup>
<Label for="password">Password</Label>
<Input
type="password"
name="password"
placeholder="Enter password"
value={this.state.signupData.password}
onChange={this.onChangehandler}
/>
</FormGroup>
<p className="text-white">{this.state.msg}</p>
<Button
className="text-center mb-4"
color="success"
onClick={this.onSubmitHandler}
>
Sign Up
{isLoading ? (
<span
className="spinner-border spinner-border-sm ml-5"
role="status"
aria-hidden="true"
></span>
) : (
<span></span>
)}
</Button>
<Link to="/sign-in" className="text-white ml-5">I'm already member</Link>
</Form>
</div>
);
}
}
导出默认类注册扩展组件{
用户数据;
建造师(道具){
超级(道具);
此.state={
签名a:{
姓名:“,
电邮:“,
电话:“,
密码:“”,
孤岛加载:“”,
},
味精:“,
};
}
onChangehandler=(e,键)=>{
const{signupdatea}=this.state;
SignUpdatea[e.target.name]=e.target.value;
this.setState({signupdatea});
};
onSubmitHandler=(e)=>{
e、 预防默认值();
this.setState({isLoading:true});
axios
.post(“http://localhost:8000/api/user-注册“,this.state.signUpdatea)
。然后((响应)=>{
this.setState({isLoading:false});
如果(response.data.status==200){
这是我的国家({
msg:response.data.message,
签名a:{
姓名:“,
电邮:“,
电话:“,
密码:“”,
},
});
设置超时(()=>{
this.setState({msg:'});
}, 2000);
}
如果(response.data.status==“失败”){
this.setState({msg:response.data.message});
设置超时(()=>{
this.setState({msg:'});
}, 2000);
}
});
};
render(){
const isLoading=this.state.isLoading;
返回(
名称
电子邮件id
电话号码
密码
{this.state.msg}
注册
{孤岛加载(
) : (
)}
我已经是会员了
);
}
}
我的问题是,{navLink}组件在两种情况下仍然呈现,无论是否登录!!但是,当我手动刷新页面时,它会消失
Imgs
我在这方面有一些经验,所以我会给你分享,也许对你有帮助 创建受保护的根目录
export const ProtectedRoute = (props) => {
let redirectPath = "";
if (!localStorage.getItem("isLoggedIn")) {
redirectPath = props.authenticationPath;
}
if (redirectPath) {
const renderComponent = () => <Redirect to={{ pathname: redirectPath }} />;
return <Route {...props} component={renderComponent} render={undefined} />;
} else {
return <Route {...props} />;
}
};
我确实为大家做了一个小例子,希望对大家有所帮助。在提交表单供重新提交后,您应该使用
历史记录。push()
,但我的答案是制作受保护路由的最佳方法。我在提交问题之前使用了history.push(),但没有解决问题。您能用代码制作沙盒吗?我来帮你修理