使用 React Router v4 进行身份验证后导航到页面

2023-12-08

我正在尝试在身份验证成功后从 login.js 导航到 app.js。我可以使用 router v3 和 browserhistory 相对轻松地完成此操作。我不太确定如何使用 router v4 导航页面,因为它们的方法似乎非常不同,而且我以前使用的方法不再有效。我尝试参考这篇文章在 React-Router v4 中以编程方式导航,但这些建议对我不起作用。关于如何使用 v4 遍历应用程序中的页面有什么建议吗?

这是一个电子应用程序

Index.js

import { HashRouter as Router } from 'react-router-dom';
import React from 'react';
import ReactDOM from 'react-dom';
import { Switch, Route } from 'react-router';
import { BrowserRouter } from 'react-router-dom'

import Login from './screens/Login';
import App from './App';


const Application = () => (
  <Router>
    <App />
  </Router>
);

ReactDOM.render(<Application />, document.getElementById('root'));

Login.js

'use strict';

import React, {PropTypes} from 'react';
import ReactDOM from 'react-dom';
import { Route, Router } from 'react-router-dom';
import { matchPath, withRouter, browserHistory} from 'react-router';




class Login extends React.Component{
  constructor(context){
      super(context);
      this.state = {
        email:'',
        password:'',
        err:'',
        loader: 0
      };



      this.handleEmailChange = this.handleEmailChange.bind(this);
      this.handlePasswordChange = this.handlePasswordChange.bind(this);
      this.handleSubmit = this.handleSubmit.bind(this);
  }

  focusEmptyInput(){
    //Focus prvog praznog inputa
    for (var ref in this.refs) {
      if(this.state[ref] === ''){
        this.refs[ref].focus();
        break;
      }
    }
  }
  handleNameChange(e){
    this.setState({name: e.target.value});
  }
  handleEmailChange(e){
    this.setState({email: e.target.value});
  }
  handlePasswordChange(e){
    this.setState({password: e.target.value});
  }
  handleSubmit(e){
    e.preventDefault();

    const email = this.state.email.trim();
    const password = this.state.password.trim();

    //Provjeri prazne inpute i focus na prvi prazan
    if((email === '')||(password === '')){
      this.setState({ err: 'All fields are required.'});
      this.focusEmptyInput();
      return;
    }



    this.setState({ err: ''});


    /** AJAX REST calls............ **/
    const userInfo = {
      email: email,
      pass: password
    };

    this.setState({ loader: 100});



var jsforce = require('jsforce');
var conn = new jsforce.Connection({
  oauth2 : {
    // you can change loginUrl to connect to sandbox or prerelease env.
    loginUrl : 'https://test.salesforce.com',
     clientId : 'empty',
    clientSecret : 'empty',
    redirectUri : 'https://test.salesforce.com/services/oauth2/token',
  }
});
conn.login(email, password, function(err, userInfo) {
  if (err) { return console.error(err,email,password);
 }

  // Now you can get the access token and instance URL information.
  // Save them to establish connection next time.
    var token = conn.accessToken;
  console.log(conn.accessToken);
  console.log(conn.instanceUrl);
  //exports.token = conn.accessToken

  sessionStorage.setItem("token", token);


  console.log("User ID: " + userInfo.id);
  console.log("Org ID: " + userInfo.organizationId);
  // ...

  // I would like to be able to redirect to app.js
   browserHistory.push('../app.js')


})









}
  render(){
    return (
      <div className="login-page">
        <div className="wrapper">
          <form className="login-form" onSubmit={this.handleSubmit}>
              <div className="title">
                  <h1>Login</h1>
                  <p>Please enter your login informations.</p>
              </div>
              <div className={(this.state.err === "") ? "hidden" : "error-message fadeIn"}>
                  <p>{this.state.err}</p>
              </div>
              <input
                  type="text"
                  ref="email"
                  className="form-control"
                  value={this.state.email}
                  onChange={this.handleEmailChange}
                  placeholder="Email"
              />
              <input
                  type="password"
                  ref="password"
                  className="form-control"
                  value={this.state.password}
                  onChange={this.handlePasswordChange}
                  placeholder="Password"
              />
              <button type="submit" className="btn">Login</button>
          </form>
        </div>
      </div>
    );
  }
}





export default Login;

app.js

import React, { Component } from 'react';
import { Route } from 'react-router-dom';
import { matchPath, withRouter } from 'react-router';
import {
  Window,
  TitleBar,
  NavPane,
  NavPaneItem,
} from 'react-desktop/windows';

import { Home, Settings } from './screens';
import * as Icons from './assets/icons';


const routes = [{
  path: '/',
  exact: true,
  title: 'Home',
  icon: Icons.welcomeIcon,
  component: Home,
}, {
  path: '/settings',
  title: 'Settings',
  icon: Icons.formIcon,
  component: Settings,
}];


class App extends Component {
  static defaultProps = {
    theme: 'dark',
    color: '#cc7f29',
  }

  render() {
    const { replace, location, theme, color } = this.props; // eslint-disable-line

    return (
      <Window theme={theme} color={color}>
        <TitleBar title="My Windows Application" controls />
        <NavPane openLength={200} push theme={theme} color={color}>
          {routes.map(route => (
            <NavPaneItem
              key={route.path}
              title={route.title}
              icon={route.icon}
              selected={Boolean(matchPath(location.pathname, route.path, {
                exact: route.exact, strict: route.strict,
              }))}
              onSelect={() => {
                replace(route.path);
              }}
              color={color}
              background="#ffffff"
              theme="light"
              padding="10px 20px"
              push
            >
              <Route exact={route.exact} path={route.path} component={route.component} />
            </NavPaneItem>
          ))}
        </NavPane>
      </Window>
    );
  }
}

export default withRouter(App);

通过输入以下条目,我能够在 Router v4 上正常工作。

class Login extends React.Component{
  constructor(){
      super();
      this.state = {

        redirect: false
      };

     this.handleSubmit = this.handleSubmit.bind(this);

在我的登录功能中我使用了这个

 handleSubmit(){

    // On Success do this...

     this.setState({
     redirect: true
   })
   }.bind(this))
}

然后在渲染函数中。

 render(){

 if (this.state.redirect) {
    return <Redirect to="../app.js" />;
  }

    return (

              </div>
              <button type="submit" onClick={this.handleSubmit} className="btn">Login</button>
              </div>
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 React Router v4 进行身份验证后导航到页面 的相关文章

随机推荐

  • 制作自定义 django 视图装饰器(带参数)时遇到问题

    因此 我阅读了所有类似的问题并复制了他们写的内容 但我仍然遇到问题 所以我想要这样的东西 Yes I know django has one but I want to make my own rate limit seconds 10 m
  • Excel Jet OLE DB:插入日期时间值

    OLEDB 可用于读取和写入 Excel 工作表 考虑以下代码示例 using OleDbConnection conn new OleDbConnection Provider Microsoft Jet OLEDB 4 0 Data S
  • 禁用 Laravel 中的日志记录?

    是否有任何全局配置选项来禁用所有日志记录 我的意思不仅仅是禁用错误记录 我的意思是在调用 Log 时实际上禁用写入文件 如果您不想写入日志文件 您可以简单地注释掉文件中的以下行start global php Log useFiles st
  • 如何在java中使用LinkedHashMap从sql server数据库填充下拉列表

    在 SQL Server 数据库中 我有一个表 其中包含三列 即 Ref Name Ref from 和 Ref to 现在我想要一个下拉列表来按行保存值 即该行的所有列值应按以下方式位于下拉列表中 参考 1 2014 10 10 07 1
  • PostGIS 中的缓冲区(圆形)

    我必须扩展普通的 GeoJSON 格式以添加一些不受支持的多边形 例如圆 type Circle radius 0 001 coordinates 5 417075157165527 43 29129488122568 这是一个例子 坐标标
  • Doctrine2 在复合主键中映射具有复合外键的实体

    我有一个有很多表的模型 但在本例中我们只需要三个 关键是 1 的复合主键也是外键 复合脚趾 Symfony 抛出此异常 MappingException 无法映射实体 你的 SomethingBundle Entity Empleado 使
  • 如何将执行延迟到 os.system 完成之后?

    我在用os system将文件从一个系统复制到另一个系统 一个非常简单的程序的逻辑是在复制该文件后执行另一组命令 问题是os system实际上并不等待文件被复制 而是开始执行下一行 这会导致系统出现问题 我实际上可以通过提供一些等待功能t
  • 将 setHours 设置为零在 NodeJs 中不起作用

    我正在尝试获取当前日期进行比较并将时间设置为零但仍然有时间 var today new Date new Date setHours 0 0 0 0 var todaynew today toISOString console log to
  • 如何将 JSON 响应映射到自定义类对象

    我正在使用 C 调用 APIUnirest io 我得到以下 JSON 响应 如响应体 persons id a010 name Joe subjects Math English id b020 name Jill subjects Sc
  • 使用模态窗口或弹出窗口打开表单

    对此我有些挣扎 我有一个数据表表单 其中列出了每条记录的 ID 和其他信息 到目前为止 我已经找到了一些 VBA 代码 它将每个 ID 作为超链接打开并将其传递到另一个表单中 我遇到的问题是我希望在弹出窗口或模式窗口中打开表单 到目前为止我
  • 如何在 JSF 中的 EL 表达式 #{ } 中写入硬编码字符串值?

    我正在尝试执行以下操作 rendered billBean company equals something 但问题是我不会写 something inside 它会导致以下 XML 解析错误 元素类型 h commandLink 后面必须
  • 指定 jar 的类路径

    我正在尝试配置 JAR 的类路径 以便我的 ResourceBundle 可以从中获取属性文件 如果我从 class 文件运行它并指定 cp标记它工作正常 并且System err println System getProperty ja
  • Android 和 IOS 上的 Qt 会话管理

    我目前正在使用 Qt Quick Controls 2 开发一个适用于 Android 和 IOS 的应用程序 该应用程序可以登录 帐户凭据将存储到外部 SQL 数据库中 我已经弄清楚如何与数据库交互 但我无法弄清楚如何在 Android
  • 是否可以等待未声明为异步的 IO 操作?如果没有,我该怎么办?

    我是 C 异步编程的新手 但我仍然对一些事情感到困惑 我读到 在 NET 4 5 之后 不再推荐 APM 和 EAP 用于新开发 因为 TAP 应该取代它们 source 我想我了解 async await 的工作原理 并且我能够使用它们来
  • 垂直居中、高度未知、页面上的其他内容

    好吧 这基本上是常见的 如何使用 CSS 垂直居中 问题 但有一些问题 没有 JavaScript 仅限 HTML 和 CSS 只要当今的浏览器能够很好地支持 CSS3 就可以了 该元素的内容以及高度都是未知的 它可能是几十到几百像素 将来
  • iOS GCD 自定义并发队列执行顺序

    我对这个问题有疑问 根据苹果公司的文件 同时 并发队列 也称为全局调度队列的一种 同时执行一个或多个任务 但任务仍按照添加到队列的顺序启动 当前正在执行的任务在由调度队列管理的不同线程上运行 在任何给定点执行的任务的确切数量是可变的 并且取
  • Bash:从最大列递归地将一行写入文件

    链接回我之前的问题 我发现问题并没有完全解决 问题是这样的 我有名为RUN1 RUN2 and RUN3每个目录都有一些文件 目录RUN1有文件mod1 1 csv mod1 2 csv mod1 3 csv 目录RUN2有文件mod2 1
  • 如何在 JavaScript 函数调用中预先设置参数? (部分功能应用)

    我正在尝试编写一个 JavaScript 函数 它将返回其第一个参数 函数 并将其所有其余参数作为该函数的预设参数 So function out a b document write a b function setter setter
  • ANT 使用具有属性的文件替换指定文件中的字符串

    我在文件 dev properties 中有一个属性 它们看起来像这样 test url https www example com 在项目文件中有一个令牌 test url 我想将其替换为https www example com 我只想
  • 使用 React Router v4 进行身份验证后导航到页面

    我正在尝试在身份验证成功后从 login js 导航到 app js 我可以使用 router v3 和 browserhistory 相对轻松地完成此操作 我不太确定如何使用 router v4 导航页面 因为它们的方法似乎非常不同 而且