javascript - <Redirect/> 的正确使用

标签 javascript reactjs

阅读教程后,我设法弄清楚了 <Redirect /> 的用法。 , 在代码中:

import React from 'react';
import Login from './Login';
import Dashboard from './Dashboard';
import {Route, NavLink, BrowserRouter, Redirect} from 'react-router-dom';

const supportsHistory = 'pushState' in window.history;

export default class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            username: '',
            password: '',
            redirectToDashboard: false,
        }
    }

//-----------------------LOGIN METHODS-----------------------------
    onChangeInput(e) {
        this.setState({[e.target.name]:e.target.value});
    }
    login(e) {
        e.preventDefault();
        const mainThis = this;
        if (mainThis.state.username && mainThis.state.password) {
            fetch('APILink')
            .then(function(response) {
                response.text().then(function(data) {
                    data = JSON.parse(data);
                    if (!data.error) {
                        mainThis.setState({redirectToDashboard:true});
                    } else {
                        alert(data.msg);
                    }
                })  
            })
        } else {
            alert('Username and Password needed');
        }
    }

    renderRedirect = () => {
        if (this.state.redirectToDashboard) {
            return <Redirect exact to='/company' />
        } else {
            return <Redirect exact to='/login' />

        }
     }

    render() {
        let renderedComp;
        return(
            <BrowserRouter 
                    basename='/'
                    forceRefresh={!supportsHistory}>
                <React.Fragment>
                    {this.renderRedirect()}
                    <Route exact path="/company" render={()=><Dashboard/>} />
                    <Route exact path="/login" render={()=><Login login={(e)=>this.login(e)} onChangeInput={(e)=>this.onChangeInput(e)} />} />
                </React.Fragment>
            </BrowserRouter>
        )
    }
}

这会根据 this.state.redirectToDashboard 的值检查要显示的组件, 但因为:

onChangeInput(e) {
    this.setState({
        [e.target.name]:e.target.value
    });
}

每次输入都会重新呈现页面,给我留​​下:

Warning: You tried to redirect to the same route you're currently on: "/login"

我知道是什么导致了这个警告,只是我想不出其他方法来让它工作。我应该做出哪些改变,或者至少应该提出一个想法才能使这项工作正常进行?

最佳答案

你可以包装你的 Route Switch 中的组件这将使一次只渲染它的一个子项。

然后您可以添加来自 / 的重定向至 /login作为第一个 child ,并保持重定向到 /companySwitch之外什么时候redirectToDashboardtrue .

示例

<BrowserRouter basename="/" forceRefresh={!supportsHistory}>
  <div>
    {this.state.redirectToDashboard && <Redirect to="/company" />}
    <Switch>
      <Redirect exact from="/" to="/login" />
      <Route path="/company" component={Dashboard} />
      <Route
        path="/login"
        render={() => (
          <Login
            login={e => this.login(e)}
            onChangeInput={e => this.onChangeInput(e)}
          />
        )}
      />
    </Switch>
  </div>
</BrowserRouter>

关于javascript - <Redirect/> 的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55117272/

相关文章:

javascript - 使 javascript-snippet 影响 3 个 div,而不是 1 个

javascript - 如何从 React 类访问自动绑定(bind)函数?

javascript - anchor 标记没有调用 React 中的 onClick 函数

javascript - ReactJS 示例失败

javascript - 将按钮引用到特定的 li?

javascript - react : Are props objects passed automatically to children components or does there always exist some default props?

javascript - $ ("<option>", { value : "thing1", text: "thing2"})); 的 JavaScript 等价物是什么

javascript - 如何快速将剪贴板的内容粘贴到 Chrome 开发控制台中的变量中?

javascript - 来自 Swift 转换的 json 字符串导致 JSON 解析失败

javascript - 您如何同时映射生成器结果?