如何通过在 react.js 中从该组件设置道具来重定向到另一个组件

苏里亚·雷迪

我正在通过应用我自己的一些逻辑来创建一个简单的登录应用程序。身份验证成功,我需要在登录后重定向到另一个组件,我需要将名称从登录组件带到我的主组件,以便我可以在该组件中显示为“Welcome -name-”

我尝试将道具传递给 ,但没有用

这是我的 Login.js:

    import React, { Component } from 'react';
    import axios from 'axios';
    // import Loader from 'react-loader-spinner';
    import { Link, Route, Redirect } from 'react-router-dom';
    import "react-loader-spinner/dist/loader/css/react-spinner-loader.css";
    import './Login.css';       
    import Home from '../Home/Home'


    class Login extends Component {     
        state = {
            email: null,
            password: null,
            status: null,
            name: null
        }       
        submitHandler = (event) => {
            event.preventDefault();
            console.log(this.state);
            axios.get("http://localhost:5000/login/" + this.state.email + "/" + this.state.password).then((res) => {
                this.setState({ status: res.status, name: res.data.name });
                console.log(this.state);        
            });     
        }       
        changeHandler = (event) => {
            event.preventDefault();
            const { name, value } = event.target;
            this.setState({ [name]: value });
        }       
        render() {
            const home = <Home />
            return (<div className="wrapper">
                <div className="form-wrapper">
                    <h1>Login</h1>
                    <form onSubmit={this.submitHandler} noValidate>
                        <div className="email">
                            <label htmlFor="email">Email</label>
                            <input type="text" placeholder="Email" name="email" noValidate onChange={this.changeHandler} />
                        </div>
                        <div className="password">
                            <label htmlFor="password">Password</label>
                            <input type="password" placeholder="Password" name="password" noValidate onChange={this.changeHandler} />
                        </div>
                        <div className="login">
                            <button type="submit">Login</button>
                        </div>
                        <div>
                            {((this.state.status) && this.state.status === 200) ? <Redirect to="/home" /> : null}
                        </div>
                    </form>
                </div>
            </div>);
        }

    }

    export default Login;

这是我的 Home.js:

    import React from 'react';

    const Home = (props)=>{
        return(<h1>Welcome {props.name}</h1>);
    }
    export default Home;

我所需要的只是在成功提交表单时将 Home.js 中的输出显示为“Welcome -name-”。但是,名称处于 Login.js 的状态。请帮我解决这个问题。

马吉德·阿米里 |

您对此问题有多种选择,但我注意到您正在使用,react-router-dom因此您可以执行以下操作之一:

  • 将用户名作为 url 的参数传递:

    <Route path="/home/:username" component={Home} />;
    const Home = (props)=>{
      return(<h1>Welcome {props.match.params.username}</h1>);
    }
    

并像这样重定向:

<Redirect to="/home/john-doe" />
  • 使用redux您的变量存储在全球存储和从任何地方访问它们。

常量.js:

export const SET_USERNAME = 'SET_USERNAME'

动作.js:

import {SET_USERNAME} from './constants'
export function setUsername(payload) {
  return {
    type: SET_USERNAME,
    payload,
  };
}

减速器.js:

import {
  SET_USERNAME,
} from './constants';

export const initialState = {
  username: '',
};

export function userReducer(state = initialState, action) {
  switch (action.type) {
    case SET_USERNAME:
      return { ...state, username: action.payload }
    default:
      return state;
  }
}

登录.js:

import React, {Component} from 'react';
import axios from 'axios';
// import Loader from 'react-loader-spinner';
import {Link, Route, Redirect} from 'react-router-dom';
import { connect } from 'react-redux';
import {setUsername} from './actions'
import "react-loader-spinner/dist/loader/css/react-spinner-loader.css";
import './Login.css';
import Home from '../Home/Home'


class Login extends Component {
  state = {
    email: null,
    password: null,
    status: null,
    name: null
  }
  submitHandler = (event) => {
    event.preventDefault();
    console.log(this.state);
    axios.get("http://localhost:5000/login/" + this.state.email + "/" + this.state.password).then((res) => {
      this.setState({status: res.status, name: res.data.name});
      this.props.setUsername(res.data.name) // Here you set the username in your redux store
      console.log(this.state);
    });
  }
  changeHandler = (event) => {
    event.preventDefault();
    const {name, value} = event.target;
    this.setState({[name]: value});
  }

  render() {
    const home = <Home/>
    return (<div className="wrapper">
      <div className="form-wrapper">
        <h1>Login</h1>
        <form onSubmit={this.submitHandler} noValidate>
          <div className="email">
            <label htmlFor="email">Email</label>
            <input type="text" placeholder="Email" name="email" noValidate onChange={this.changeHandler}/>
          </div>
          <div className="password">
            <label htmlFor="password">Password</label>
            <input type="password" placeholder="Password" name="password" noValidate onChange={this.changeHandler}/>
          </div>
          <div className="login">
            <button type="submit">Login</button>
          </div>
          <div>
            {((this.state.status) && this.state.status === 200) ? <Redirect to="/home"/> : null}
          </div>
        </form>
      </div>
    </div>);
  }

}

export function mapDispatchToProps(dispatch) {
  return {
    setUsername: username => dispatch(setUsername(username)),
  };
}

const withConnect = connect(
  null,
  mapDispatchToProps,
);

export default withConnect(Login);

主页.js:

import React, {Component} from 'react';
import { connect } from 'react-redux';
class Home extends Component{
  render(){
    const {username} = this.props;
    return(<h1>`Welcome ${username}`</h1>);
  }
}

function mapStateToProps(state) {
  const { username } = state.user;
  return { username };
}

const withConnect = connect(mapStateToProps);

export default withConnect(Home);
  • 使用 cookie 来存储登录用户的用户名。
import Cookies from 'universal-cookie';
const cookies = new Cookies();
cookies.set('username', username);

实际上可能有多种其他解决方案,但这些是我想到的事情。希望对你有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通过在react chrome扩展程序中按按钮重定向到另一个组件?

如何在 React 的 JS 类中重定向到另一个路由?

如何将组件作为道具传递给 react js 中的另一个组件?

无法通过React.js中的组件设置包含另一个组件的div的样式显示

React-如何将API数据从一个组件传递到另一个js文件中的另一个组件?

如何在React.js中从一个组件(子组件)到另一个组件(父组件)获取值?

将道具传递到React.js中的另一个组件

如何通过在React中单击另一个组件来删除组件?

在React中将其重定向到另一个组件时,如何停止呈现先前的组件

如何覆盖css并使用react js中的另一个组件导入

如何在React.js中获取另一个组件的元素?

如何从React.js中的另一个类组件调用方法

我如何从React JS中的另一个组件路由

如何在React中从另一个组件设置一个组件的状态

如何在React.js中从另一个组件调用不同组件的ComponentDidMount()

React.js:如何在单击菜单时重定向到另一个页面?

如何使用React js的历史记录重定向到另一个页面?

从另一个组件 React js 设置状态

如何键入包含 React 组件作为属性以及该组件的道具作为另一个属性的对象?

React.js如何在另一个组件中使用一个组件?

如何使用另一个组件使用的ES6在React JS中创建公共帮助器类?

链接按钮路由到另一个组件在 React js 中不起作用

在React中重定向到另一个路由时如何传递状态/属性?

如何重定向到 React 中的另一个视图

如何将组件作为道具传递给Vue.js中的另一个组件

如何重定向到node.js中的另一个页面

如何在Aurelia JS中重定向到另一个视图模型?

使用React Router Link时如何将道具从一个组件传递到另一个组件

如何从一个组件访问状态值到另一个文件中的另一个函数(不是组件)?反应 js