用道具反应路线问题

时间:2019-11-13 15:35:54

标签: javascript reactjs routes

我在渲染组件时遇到问题。我有三个JS文件 1- App.js

import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom'
import './App.css';
import Login from './components/Login'
import Register from './components/Register'
import ForgotPassword from './components/ForgotPassword'

function App() { 

 return (
  <div className="App">
   <BrowserRouter>
     <Route exact path='/'  component={Login} />
     <Route path='/register' component={Register} />
     <Route path='/forgot-password' component={ForgotPassword} />      
   </BrowserRouter>
  </div>
);
}

export default App;

此文件加载“登录”组件。在“登录”组件中,我检查用户是否通过Cookie登录?如果用户已登录,它将加载“主要”组件。否则,它将加载“登录”组件。 2- Login.js

 import React, { Component } from 'react'
 import { Link } from 'react-router-dom'
 import axios from 'axios'
 import Main from './Main'
 import { setCookie, getCookie } from '../utils.js';

class Login extends Component {

constructor(){
    super()

    var token = getCookie('access_token')
    console.log(token)

    if (token !== '') {
        const user = JSON.parse(getCookie('user'))
        console.log(user)
        this.state = {
            email: '',
            password: '',
            showComponent: false,
            isLoggedIn: true,
            user: user
        }
    }else{
        this.state = {
            email: '',
            password: '',
            showComponent: false,
            isLoggedIn: false,
            user: null
        }
    }
}


changeHandler = e => {
    this.setState({[e.target.name]: e.target.value})
}

submitHandler = e => {
    e.preventDefault()

    const headers = {
        'Content-Type': 'application/json',
    }
    axios.post(
        'http://localhost/guest-guide-book-api/public/api/login', this.state, 
        { headers: headers  }
    )
    .then(response => {
        var user = response.data.user
        this.setState({
            user: user, 
            showComponent: true, 
            email: '',
            password: ''})
        var token = response.data.access_token

        setCookie('access_token', token, 7)
        setCookie('user', JSON.stringify(user), 7)
    })
    .catch((error) => {
        console.log('Error ' + error);
    });
}


render(){
    const { email, password, user } = this.state

    return (
        <div>

        {this.state.showComponent || this.state.isLoggedIn ?
           <Main> {user} </Main>  :
             <div>
                <form className="user" onSubmit={this.submitHandler}>
                    <input type="email" name="email" value={email} onChange={this.changeHandler} className="form-control form-control-user" id="exampleInputEmail" aria-describedby="emailHelp" placeholder="Enter Email Address..." />
                    <input type="password" name="password" value={password} onChange={this.changeHandler} className="form-control form-control-user" id="exampleInputPassword" placeholder="Password" />
                    <input type="checkbox" className="custom-control-input" id="customCheck" />
                    <label className="custom-control-label" htmlFor="customCheck">Remember Me</label>
                    <button type="submit" className="btn btn-primary btn-user btn-block">
                    Login
                    </button>
                </form>

                <Link className="small" to="/forgot-password">Forgot Password?</Link>

                <Link className="small" to="/register">Create an Account!</Link>
             </div>               
        }
        </div>
    )
}
}

export default Login

成功登录后,服务器发送用户信息和访问令牌,并加载“主要”组件。真正的问题带有“主要”组件。 “主要”组件包含所有溃败。这些路由仅适用于登录用户。 “主要”组件包含“页眉”,“页脚”和“ LoggedInSidebar”组件,这些组件在下一页通用。登录后,页面结构是“页眉”,“页脚”和“ LoggedInSidebar”组件保持不变。调用完每条路线后,内容区域(侧栏的第二列)将发生变化。 3- Main.js

 import React, { Component } from 'react'
 import ReactDOM from 'react-dom';
 import { BrowserRouter, Route, withRouter } from 'react-router-dom'
 import Header from './Header'
 import MainBody from './MainBody'
 import Footer from './Footer'
 import AddProperty from './AddProperty'
 import AccountSettings from './AccountSettings'
 import Video from './Video'
 import GettingStart from './GettingStart'
 import Content from './Content'
 import Download from './Download'
 import HelpSupport from './HelpSupport'
 import LoggedInSidebar from './LoggedInSidebar'
 import Hook from './Hook'
 import { useHistory } from "react-router-dom";
 import UpdateProperty from './UpdateProperty';

class Main extends Component {

constructor(props){
    super(props)
    this.state = {
        user: props.children[1]
    }
    console.log(props)
}
componentDidUpdate(){
    const user = this.state.user;
    //let history = useHistory();
    console.log(user)
    this.props.history.push({
        pathname: '/index',
        state: {
        user: user
        }
    });
}

render(){
    const  user  = this.state.user
    console.log(user)
return (
    <BrowserRouter>
        <Header>{user} </Header>
            <div className="main-wrap">
            <div className="container">
                <div className="row">                  
                <LoggedInSidebar> {user} </LoggedInSidebar>             
                <Hook> {user} </Hook>

                <Route path='/index' component={Hook} user={user} />
                <Route path='/add-property' component={AddProperty} />
                <Route path='/update-property' component={UpdateProperty} />
                <Route path='/account-settings' component={AccountSettings} />
                <Route path='/photos-videos' component={Video} />
                <Route path='/getting-start' component={GettingStart} />
                <Route path='/content' component={Content} />
                <Route path='/download' component={Download} />
                <Route path='/help-support' component={HelpSupport} />
                </div>
                </div>
            </div>
        <Footer />

    </BrowserRouter>
)
}

}

export default withRouter(Main)

问题:默认情况下,我在“主要”组件中调用“挂钩”组件。现在每次,当我单击侧栏上的菜单之一时,它会加载适当的组件以及“挂钩”组件。我只希望该新组件替换Hook组件。我没有找到一种方法。所有路线链接都在“ LoggedInSidebar”中。 重要的是“挂钩”,“ LoggedInSidebar”组件从“ Main”组件获取道具。我尝试了history.push()方法。但这没有用。 如果需要“挂钩”,“ LoggedInSidebar”组件代码,我将发布它们。这些组件包含左右列HTML。左列是侧边栏,右列是内容区域。 谢谢

0 个答案:

没有答案