javascript - 登录后重定向 url (react js)

标签 javascript reactjs ecmascript-6 formik yup

我是一个 React js 初学者。我被这个问题困扰了很多天。我不知道登录成功(没有验证错误)时如何重定向到路径/users。如果有什么不清楚的,请告诉我。这是我第一次在 stackoverflow 上提问。请帮忙:(

//app.js

import React from "react"
import ValidationLog from "./ValidationLog"
import PostList from "./PostList"
import  {BrowserRouter as Router,Route,Switch,Redirect}  from "react-router-dom"

function App() {
  

  return (
    <Router>
      <div className="App">

        <Switch>
          <Route exact path="/" component={ValidationLog}></Route>
          <Route path="/users" component={PostList}></Route>
        </Switch>
          
      </div>
    </Router>
  )
  
}
export default App

//ValidationLog.js

import React from "react"
import {Formik} from "formik"
import * as Yup from "yup"
import  {BrowserRouter as Router,Route,Switch,Redirect}  from "react-router-dom"


const ValidationLog = () => (
    
    <Formik 
    
     initialValues = {{email: "", password: ""}}
     onSubmit = {(values,{ setSubmitting}) => {
         setTimeout(() => {
            <Redirect to="/users" /> 
            
         }, 500);
     }}
     
     validationSchema = {Yup.object().shape({
        email: Yup.string()
            .email()
            .required("Required"),
        password: Yup.string()
            .required("No password provided")
            .min(8,"Password has to be at least 8 characters.")
     })
            
    }
    >
        {props => {
            const {
                values,
                touched,
                errors,
                isSubmitting,
                handleChange,
                handleBlur,
                handleSubmit
            } = props

            
            
            
            return (
                    
                    <div>
                        

                        <form autoComplete = "off" onSubmit = {handleSubmit}>
                            <h2 style={{fontSize: 22}}>Login to view our user pool</h2>
                            <label htmlFor="email">Email:</label>
                            <input type="text" value={values.email} name="email" onChange={handleChange} onBlur={handleBlur} placeholder="Enter your email" className={errors.email && touched.email && "error"}/>
                            {errors.email && touched.email && (<div className="input-feedback">{errors.email}</div>)}
                            <label htmlFor="email">Password:</label>
                            <input type="password" value={values.password} name="password" onChange={handleChange} onBlur={handleBlur} placeholder="Enter your password" className={errors.password && touched.password && "error"}/>
                            {errors.password && touched.password && (<div className="input-feedback">{errors.password}</div>)}
                            <button type="submit" disabled={isSubmitting}>Login</button>
                            
                        </form>

                    </div>
            )
        }}
    </Formik>
)


export default ValidationLog

以下是我尝试过的。我尝试在 ValidationLog.js 中添加

 onSubmit = {(values,{ setSubmitting}) => {
         setTimeout(() => {
            <Redirect to="/users" /> 
            
         }, 500);
     }}

我还尝试在 ValidationLog.js 中设置变量 islogin,并在没有验证错误时导入 app.js,但 islogin 在 app.js 中始终为 false。

//ValidationLog.js

export let islogin = false
onSubmit = {(values,{ setSubmitting}) => {
         setTimeout(() => {
            islogin = true
            console.log(`Logged in ${islogin}`)
         }, 500);
     }}

//app.js

import ValidationLog,{islogin} from "./ValidationLog"

<Route exact path="/">
  {islogin ? <Redirect to="/users" /> : null}
</Route>

最佳答案

<Redirect ... />是一个 JSX-Construct,用于在此位置创建一个组件。就其本身而言,这不会在像 onSubmit 这样的命令式代码路径中执行任何操作。处理程序。

您正在寻找的是一个可以在 React-Tree 外部调用的命令式函数。就像来自useHistory从 react 路由器 Hook 。

import { useHistory } from "react-router-dom";

...

const history = useHistory();

...

  onSubmit={() => history.push("/home")}

更具体地说,对于您的示例:

const ValidationLog = () => {
  const history = useHistory();
  return (
    
    <Formik 
    
     initialValues = {{email: "", password: ""}}
     onSubmit = {(values,{ setSubmitting}) => {
         setTimeout(() => {
            history.push(...)
            
         }, 500);
     }}
...

关于javascript - 登录后重定向 url (react js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66209355/

相关文章:

javascript - laravel包含基于语言的js脚本

javascript - 在哪里将其他类函数放在钩子(Hook)中?

javascript - 从 Route 发送后获取 React Props

javascript - 使用 Jest 对 ES7 React 组件进行单元测试

javascript - ecmascript 6 中的 "@"字符是什么意思?

javascript - ES6 中的私有(private) props 不适用于 WeakMap

javascript - 在 JavaScript 中从 Rest 服务器返回 JSON

javascript - AngularJS 无法识别 Controller

javascript - Node (ES6) : SyntaxError: Unexpected token {

javascript - Jquery Accordion 上的图标更改