【问题标题】:How to correctly use react-router如何正确使用 react-router
【发布时间】:2016-09-28 00:59:09
【问题描述】:

有点新反应,喜欢图书馆,但遇到路由器各种头痛。

这是我目前的代码,问题如下:

// 路由.js

var React = require('react');
var ReactDOM = require('react-dom');
import {Router, Route, IndexRoute, browserHistory} from 'react-router';

import App from './App';
import MainLayout from './components/MainLayout';
import Home from './components/home/Home';
import Product from './components/product/Product';
import Category from './components/category/Category';
import Cart from './components/cart/Cart';
import NotFound from './components/NotFound';

export default (
  <Router history={browserHistory}>
    <Route component={App} >
      <Route path='/' component={Home} />
      <Route path='/product/:productId' component={Product} />
      <Route path='/category/:catNumber' component={Category} />
      <Route path='/cart' component={Cart} />
    </Route>
    <Route path='*' component={NotFound} />
  </Router>
)

现在,我遇到了三个主要问题,这让我觉得我可能只是严重误解了路由器的工作原理。

1) 来自 react [http://localhost:3002/#/?_k=xv1opy] 的奇怪 url 哈希,即使它们不应该存在,因为我已经设置了 history={browserHistory}

2) 浏览器控制台警告:“警告:位置“/”不匹配任何路线”和“警告:您无法更改;它将被忽略。”不知道这里发生了什么,因为我已经非常清楚地定义了 Home 组件来渲染 path='/'。

3) 可能相关,但每当我更改路线时,整个应用程序都会重新加载,清除我所有的商店数据。不理想,但我认为一旦我修复了#1 和(尤其是)#2,就可以解决这个问题。

更多可能有用的信息:

// app.js 渲染() 方法

render() {
return (
  <div>
    <Header />
    <Subheader />
    {this.props.children}
    <Footer />
  </div>
);

}

// index.js

'use strict';

import React from 'react';
import ReactDOM from 'react-dom';

import Routes from './routes';

if ( process.env.NODE_ENV !== 'production') {
  window.React = React;
}

ReactDOM.render(Routes, document.getElementById('main'));

任何对 React 更熟悉的人可以在这里为我指明正确的方向吗?在过去的两天里一直在为此拉头发,并且似乎阅读了所有关于 react-router 的指南都无济于事。

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    您的路由有点缺陷。试试这个:

    <Router history={browserHistory}>
      <Route path='/' component={App} >
        <IndexRoute component={Home} />
        <Route path='product/:productId' component={Product} />
        <Route path='category/:catNumber' component={Category} />
        <Route path='cart' component={Cart} />
      </Route>
      <Route path='*' component={NotFound} />
    </Router>
    

    这应该可以解决您的大部分错误。

    【讨论】:

    • 这种感觉,直觉上应该可以。但我仍然遇到同样的问题。
    • 你的依赖更新了吗?你用的是什么版本的reactreact-router
    • React 0.14.8 和 react-router 1.0.3。
    • 我相信我们已经找到了这种情况下的问题。 react-router v1.0.3 已经快 6 个月了。最新版本是 2.4.1。 browserHistory 直到 2.0.0 才引入。更新您的路由器版本,然后重试。还有一个更新版本的react。还要检查您的其他依赖项。如果你使用 npm,你可以运行命令 npm outdated 来查看哪些包是旧的。
    • 今天我在 React 生态系统中学到了宝贵的一课:P. 还出现了一些其他问题,但这解决了路由器问题。谢谢。
    【解决方案2】:

    路由可以很方便的输入“localhost:3000/”类型我们可以得到登录页面,如果只通过创建登录页面和其他页面组件来获取

            import React from 'react';
            import { Component } from "react";
            import { BrowserRouter, Switch, Route } from 'react-router-dom';
            import "bootstrap/dist/css/bootstrap.min.css";
            import login from './components/loginpage-component';
            import signup from './components/signup-component';
            render(){
            return (
             <BrowserRouter>
                 <Switch>
                    <Route exact path="/" component={login} /> 
                    <Route exact path="/signup" component={signup} /> 
                    <Route exact path="/live" component={live}/>
                 </Switch>  
             </BrowserRouter>
             );
            }
    
            }
           export default App;
    

    【讨论】:

      【解决方案3】:
      1. 使用 yarnnpm

        安装 react-router-dom

        yarn add react-router-dom

      2. 像这样导入 react-router

        import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'

      3. 这样使用

        <Switch> <Route path="/scopes"> <Scopes /> </Route> <Route path={"/disciplines"}> <Disciplines /> </Route> <Route path={"/fields"}> <Fields /> </Route> <Route path={"/issues"}> <Issues /> </Route> <Route path={"/articles"}> <Articles /> </Route> <Route path={"/indexing"}> <Indexing /> </Route> <Route path={"/settings"}> <Settings /> </Route> </Switch>

      4. 现在您可以像这样创建到每个路由器的链接

        &lt;Link to="/articles"&gt;Articles&lt;/Link&gt;

        导入链接为: import { Link } from 'react-router-dom'

      【讨论】:

        【解决方案4】:

        如果你关注这个文档https://reactrouter.com/web/guides/quick-start,它会说

        第 1 步: 移动到项目文件夹并键入 npm install react-router-dom --save

        第 2 步: 导入路由文件

        App.js

        import React from 'react;
        import {BrowserRouter as Router,Switch,Route} from "react-router-dom";
        
        import Home from './components/home/Home';
        import Product from './components/product/Product';
        import Category from './components/category/Category';
        import Cart from './components/cart/Cart';
        
        const App = () => {
         return (
          <div>
        
           <Router>
            <Switch>
        
              <Route exact path="/">
                <Home />
              </Route>
              //by providing exact attribute will only match if the path matches the exact location else if we don't provide it will never render other components because it renders the first one that matches the current URL 
              <Route path="/product">
               <Product />
              </Route>
              <Route path="/category">
               <Category />
              </Route>
              <Route path="/cart">
               <Cart />
              </Route>
            </Switch>
           </Router>
        
         </div>
        )
        }
        export default App;
        

        【讨论】:

          猜你喜欢
          • 2018-09-25
          • 2016-10-31
          • 2017-12-11
          • 2021-02-26
          • 2020-06-06
          • 2022-11-29
          • 1970-01-01
          • 2017-02-20
          • 2016-07-22
          相关资源
          最近更新 更多