【问题标题】:Redirect React Router Route From onClick in Modal从模态的onClick重定向React路由器路由
【发布时间】:2021-02-04 14:14:11
【问题描述】:

以下是注册模式正文的代码。我希望它的工作方式是用户输入凭据,当他们单击提交时,他们会自动转到作为他们的仪表板的路由“/secret”。

目前,当用户单击提交时,会引发错误并出现警报“('登录时出错,请重试')”。我只希望在他们的输入有错误时发生这种情况(即非唯一条目,未达到要求等)

无论输入是否满足要求并被推送到数据库,每次用户单击提交时都会引发此警报。同样由于某种原因,react 似乎忽略了将用户重定向到所需路线的代码行。

if (res.status === 200) 
{  this.props.history.push('/secret'); 
} 

如果我收到 res.status === 200,是否有办法重定向路由,同时如果发生错误,还能保持抛出错误的条件?

signup.js(模态体)

import React, { Component } from 'react';
import API from "../utils/API.js";
import { Container, Row, Col, Button, Alert, Modal, ModalHeader, ModalBody, ModalFooter, Label, Input } from 'reactstrap';
export default class Signup extends Component {
  constructor(props) {
    super(props)
    this.state = {
      email: '',
      password: '',
      username: ''
    };
  }
  handleInputChange = (event) => {
    const { value, name } = event.target;
    this.setState({
      [name]: value
    });
  }
  onSubmit = (event) => {
    event.preventDefault();
    API.signUpUser(this.state.email, this.state.username, this.state.password)
   
      .then(res => {
        if (res.status === 200) {
          this.props.history.push('/secret');
        } else {
          const error = new Error(res.error);
          throw error;
        }
      })
      .catch(err => {
        console.error(err);
        alert('Error logging in please try again');
      });
  }
  render() {
    console.log(this.state)
    return (
      <form onSubmit={this.onSubmit}>

        Email: <input
          type="email"
          name="email"
          placeholder="Enter email"
          value={this.state.email}
          onChange={this.handleInputChange}
          required
        />
        <br></br>
        <br></br>

        Username: <input
          type="text"
          name="username"
          placeholder="Enter username"
          value={this.state.username}
          onChange={this.handleInputChange}
          required
        />
        <br></br>
        <br></br>


        Password: <input
          type="password"
          name="password"
          placeholder="Enter password"
          value={this.state.password}
          onChange={this.handleInputChange}
          required
        />
         <br></br>
        <br></br>
        <Button type="submit" value="Submit" color="primary" className="btn btn-warning">Sign Up</Button>

      
      </form>
    );
  }
}

app.js(反应路线)

 <Switch>
            <Route path="/" exact component={Home} />
            <Route path="/hometwo" exact component={Home2} />
            <Route path="/secret" component={withAuth(Secret)} />
            <Route path="/login" component={Login} />
            <Route path="/signup" component={Signup} />
            <Route path="/signout" component={Signout} />
            <Route path="/loggedIn" component={withAuth(loggedIn)} />
          </Switch>

注册用户 API

  signUpUser: function (email, username, password) {

    const signUpURL = "/api/user"
    // console.log("username " + username + "password " + password)
    return axios.post(signUpURL, { email,username, password }).then(result => result.data);
    // return axios.post(signUpURL, { email, username, password }).then(result => result.data);
    // .then(result => result.data);

  },

新 Signup.js


import React, { Component } from 'react';
import API from "../utils/API.js";
import { Container, Row, Col, Button, Alert, Modal, ModalHeader, ModalBody, ModalFooter, Label, Input } from 'reactstrap';
export default class Signup extends Component {
  constructor(props) {
    super(props)
    this.state = {
      email: '',
      password: '',
      username: '',
 
    };
  }
  handleInputChange = (event) => {
    const { value, name } = event.target;
    this.setState({
      [name]: value
    });
  }
  onSubmit = (event) => {
    event.preventDefault();
    // API.signUpUser(this.state.email, this.state.username, this.state.password)

      fetch('/api/authenticatesignup', {
          method: 'POST',
          body: JSON.stringify(this.state),
          headers: {
            'Content-Type': 'application/json'
          }
        })
      .then(res => {
        console.log("THIS IS res " + JSON.stringify(res.status));
        if (res.status === 200) {

          // alert("You can now go to your dashboard")
          // window.location.reload();

          // // alert("You can now go to your dashboard")
          this.props.history.push('/secret')
        } else {
          const error = new Error(res.error);
          // console.log("This is error on client side " + error)
          throw error;
          // alert('Error logging in please try again');

        }
      })
      .catch(err => {
        console.error(err);
        alert('Error logging in please try again');
      });
  }
  render() {
    console.log(this.state)
    return (
      <form onSubmit={this.onSubmit}>

        Email: <input
          type="email"
          name="email"
          placeholder="Enter email"
          value={this.state.email}
          onChange={this.handleInputChange}
          required
        />
        <br></br>
        <br></br>

        Username: <input
          type="text"
          name="username"
          placeholder="Enter username"
          value={this.state.username}
          onChange={this.handleInputChange}
          required
        />
        <br></br>
        <br></br>


        Password: <input
          type="password"
          name="password"
          placeholder="Enter password"
          value={this.state.password}
          onChange={this.handleInputChange}
          required
        />
        <br></br>
        <br></br>
        <Button type="submit" value="Submit" color="primary" className="btn btn-warning">Sign Up</Button>


      </form>
    );
  }
}

服务器中注册的 API 端点

//authenticate checker signup
app.post('/api/authenticatesignup', function (req, res) {
  const { email, username, password } = req.body;
  User.create({
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
  }, 
  
  function (err, user) {
    if (err) {
      console.error(err);
      res.status(500)
        .json({
          error: 'Internal error please try again'
        });
    }
    else {
      // Issue token
      const payload = { username };
      const token = jwt.sign(payload, secret, {
        expiresIn: '1h'
      });
      res.cookie('token', token, { httpOnly: true })
        .sendStatus(200);
        console.log("New USER!" + req.body.email + req.body.password)
    }
  })


});

【问题讨论】:

  • 似乎api调用有问题,这就是调用catch块的原因。检查你的控制台,控制台打印出什么错误
  • 你能 console.log 响应吗?
  • 如果它显示警报然后它应该打印一些东西到控制台,因为你有这个 console.error(err);你能显示控制台说什么吗?
  • 如果不知道确切的错误和您的 api 端点就很难判断,而且看起来您在没有指定属性的情况下发送凭证信息:通常您发送一个对象,如下所示:@ 987654329@
  • 您收到一个带有登录数据的普通对象,但您没有状态参数,这就是 if 语句跳过的原因

标签: reactjs react-router bootstrap-modal react-router-dom react-props


【解决方案1】:

你需要用withRouter包裹组件。

您可以通过 withRouter 高阶组件访问历史对象的属性和最接近的匹配项。 withRouter 将在渲染时将更新的匹配、位置和历史道具传递给包装的组件。

import React, { Component } from 'react';
import { withRouter } from "react-router";
import API from "../utils/API.js";
import { Container, Row, Col, Button, Alert, Modal, ModalHeader, ModalBody, ModalFooter, Label, Input } from 'reactstrap';

class SignupComp extends Component {
    constructor(props) {
        super(props)
        this.state = {
            email: '',
            password: '',
            username: '',

        };
    }
    handleInputChange = (event) => {
        const { value, name } = event.target;
        this.setState({
            [name]: value
        });
    }
    onSubmit = (event) => {
        event.preventDefault();
        // API.signUpUser(this.state.email, this.state.username, this.state.password)
        fetch('/api/authenticatesignup', {
            method: 'POST',
            body: JSON.stringify(this.state),
            headers: {
                'Content-Type': 'application/json'
            }
        })
            .then(res => {
                console.log("THIS IS res " + JSON.stringify(res.status));
                if (res.status === 200) {
                    // alert("You can now go to your dashboard")
                    // window.location.reload();
                    // // alert("You can now go to your dashboard")
                    this.props.history.push('/secret')
                } else {
                    const error = new Error(res.error);
                    // console.log("This is error on client side " + error)
                    throw error;
                    // alert('Error logging in please try again');
                }
            })
            .catch(err => {
                console.error(err);
                alert('Error logging in please try again');
            });
    }
    render() {
        console.log(this.state)
        return (
            <form onSubmit={this.onSubmit}>
                Email: <input
                    type="email"
                    name="email"
                    placeholder="Enter email"
                    value={this.state.email}
                    onChange={this.handleInputChange}
                    required
                />
                <br></br>
                <br></br>
                Username: <input
                    type="text"
                    name="username"
                    placeholder="Enter username"
                    value={this.state.username}
                    onChange={this.handleInputChange}
                    required
                />
                <br></br>
                <br></br>

                Password: <input
                    type="password"
                    name="password"
                    placeholder="Enter password"
                    value={this.state.password}
                    onChange={this.handleInputChange}
                    required
                />
                <br></br>
                <br></br>
                <Button type="submit" value="Submit" color="primary" className="btn btn-warning">Sign Up</Button>

            </form>
        );
    }
}

const Signup = withRouter(SignupComp);
export default Signup;

【讨论】:

    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 2018-12-25
    • 2020-02-03
    • 2019-07-16
    • 2022-01-21
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多