admin管理员组文章数量:1425707
I'm new to react and struggling to redirect the user in a demo app to a default page after they submit the login form. I'm not entirely sure why return <Redirect to="/default" />;
isn't doing anything.
Code Sandbox
App.js
import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Form from "./Form";
import Default from "./default";
const App = () => {
return (
<Router>
<div>
<Switch>
<Route path="/default" ponent={Default} />
<Route path="/" ponent={Form} />
</Switch>
</div>
</Router>
);
};
export default App;
Form.jsx
import React from "react";
import useForm from "./useForm";
import validate from "./LoginFormValidationRules";
import { Redirect } from "react-router-dom";
const Form = () => {
const { values, errors, handleChange, handleSubmit } = useForm(
login,
validate
);
function login() {
console.log("logged in");
return <Redirect to="/default" />;
}
return (
<div className="section is-fullheight">
<div className="container">
<div className="column is-6 is-offset-3">
<div className="box">
<form onSubmit={handleSubmit} noValidate>
<div className="field">
<label className="label">Email Address</label>
<div className="control">
<input
autoComplete="off"
className={`input ${errors.email && "is-danger"}`}
type="email"
name="email"
onChange={handleChange}
value={values.email || ""}
required
/>
{errors.email && (
<p className="help is-danger">{errors.email}</p>
)}
</div>
</div>
<div className="field">
<label className="label">Password</label>
<div className="control">
<input
className={`input ${errors.password && "is-danger"}`}
type="password"
name="password"
onChange={handleChange}
value={values.password || ""}
required
/>
</div>
{errors.password && (
<p className="help is-danger">{errors.password}</p>
)}
</div>
<button
type="submit"
className="button is-block is-info is-fullwidth"
>
Login
</button>
</form>
</div>
</div>
</div>
</div>
);
};
export default Form;
useForm.jsx
import { useState, useEffect } from "react";
const useForm = (callback, validate) => {
const [values, setValues] = useState({});
const [errors, setErrors] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
useEffect(() => {
if (Object.keys(errors).length === 0 && isSubmitting) {
callback();
}
}, [errors]);
const handleSubmit = event => {
if (event) event.preventDefault();
setErrors(validate(values));
setIsSubmitting(true);
};
const handleChange = event => {
event.persist();
setValues(values => ({
...values,
[event.target.name]: event.target.value
}));
};
return {
handleChange,
handleSubmit,
values,
errors
};
};
export default useForm;
I'm new to react and struggling to redirect the user in a demo app to a default page after they submit the login form. I'm not entirely sure why return <Redirect to="/default" />;
isn't doing anything.
Code Sandbox
App.js
import React from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Form from "./Form";
import Default from "./default";
const App = () => {
return (
<Router>
<div>
<Switch>
<Route path="/default" ponent={Default} />
<Route path="/" ponent={Form} />
</Switch>
</div>
</Router>
);
};
export default App;
Form.jsx
import React from "react";
import useForm from "./useForm";
import validate from "./LoginFormValidationRules";
import { Redirect } from "react-router-dom";
const Form = () => {
const { values, errors, handleChange, handleSubmit } = useForm(
login,
validate
);
function login() {
console.log("logged in");
return <Redirect to="/default" />;
}
return (
<div className="section is-fullheight">
<div className="container">
<div className="column is-6 is-offset-3">
<div className="box">
<form onSubmit={handleSubmit} noValidate>
<div className="field">
<label className="label">Email Address</label>
<div className="control">
<input
autoComplete="off"
className={`input ${errors.email && "is-danger"}`}
type="email"
name="email"
onChange={handleChange}
value={values.email || ""}
required
/>
{errors.email && (
<p className="help is-danger">{errors.email}</p>
)}
</div>
</div>
<div className="field">
<label className="label">Password</label>
<div className="control">
<input
className={`input ${errors.password && "is-danger"}`}
type="password"
name="password"
onChange={handleChange}
value={values.password || ""}
required
/>
</div>
{errors.password && (
<p className="help is-danger">{errors.password}</p>
)}
</div>
<button
type="submit"
className="button is-block is-info is-fullwidth"
>
Login
</button>
</form>
</div>
</div>
</div>
</div>
);
};
export default Form;
useForm.jsx
import { useState, useEffect } from "react";
const useForm = (callback, validate) => {
const [values, setValues] = useState({});
const [errors, setErrors] = useState({});
const [isSubmitting, setIsSubmitting] = useState(false);
useEffect(() => {
if (Object.keys(errors).length === 0 && isSubmitting) {
callback();
}
}, [errors]);
const handleSubmit = event => {
if (event) event.preventDefault();
setErrors(validate(values));
setIsSubmitting(true);
};
const handleChange = event => {
event.persist();
setValues(values => ({
...values,
[event.target.name]: event.target.value
}));
};
return {
handleChange,
handleSubmit,
values,
errors
};
};
export default useForm;
Share
Improve this question
edited Dec 13, 2019 at 20:06
Charles L.
asked Dec 13, 2019 at 19:41
Charles L.Charles L.
1,9802 gold badges39 silver badges61 bronze badges
5
-
From where is
login()
called? – ghchoi Commented Dec 13, 2019 at 20:22 -
@GyuHyeonChoi
login()
is the callback function – Charles L. Commented Dec 13, 2019 at 20:24 - So it seems not a full code. I think it is very unfamiliar (at least with me) to return something from callback function. – ghchoi Commented Dec 13, 2019 at 20:26
- @GyuHyeonChoi Im still fairly new to react. Visit the CodeSandbox to see the current working version – Charles L. Commented Dec 13, 2019 at 20:27
-
<Redirect to="/default" />
block should be somewhere inForm/return
. I think... – ghchoi Commented Dec 13, 2019 at 20:39
1 Answer
Reset to default 5I updated my solutions.
import React, {useState} from "react";
import useForm from "./useForm";
import validate from "./LoginFormValidationRules";
import { Redirect } from "react-router-dom";
const Form = () => {
const { values, errors, handleChange, handleSubmit } = useForm(
login,
validate
);
const[loggedIn, setLoggedIn] = useState(false);
function login() {
console.log("logged in");
setLoggedIn(true);
return <Redirect to="/default" />;
}
return (
<div className="section is-fullheight">
{
loggedIn && (
<Redirect to="/default" />
)
}
<div className="container">
<div className="column is-6 is-offset-3">
<div className="box">
<form onSubmit={handleSubmit} noValidate>
<div className="field">
<label className="label">Email Address</label>
<div className="control">
<input
autoComplete="off"
className={`input ${errors.email && "is-danger"}`}
type="email"
name="email"
onChange={handleChange}
value={values.email || ""}
required
/>
{errors.email && (
<p className="help is-danger">{errors.email}</p>
)}
</div>
</div>
<div className="field">
<label className="label">Password</label>
<div className="control">
<input
className={`input ${errors.password && "is-danger"}`}
type="password"
name="password"
onChange={handleChange}
value={values.password || ""}
required
/>
</div>
{errors.password && (
<p className="help is-danger">{errors.password}</p>
)}
</div>
<button
type="submit"
className="button is-block is-info is-fullwidth"
>
Login
</button>
</form>
</div>
</div>
</div>
</div>
);
};
export default Form;
But I wanna to say that there are some solutions to implement it. Above one is the one of them. please try to use this.
本文标签: javascriptReact Login with Redirect on callbackStack Overflow
版权声明:本文标题:javascript - React Login with Redirect on callback - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745455771a2659094.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论