【问题标题】:react-router-dom isnt working just render "/"react-router-dom 不工作只是渲染“/”
【发布时间】:2020-10-03 16:21:20
【问题描述】:

我有一些 throubes 试图渲染多个页面并做出反应。我是 react 新手,这就是为什么我在很多页面和教程中寻找的原因。我使用 react、webpack、babel 和 eslint airbnb

当我渲染我的 React 应用时看起来像这样。

hows render homepage

我用来渲染所有路由的页面App是这样的。

import React from 'react';
import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom';
import Homepage from './Homepage';
import Layout from '../components/Layout';
import NotFound from './NotFound';
// import NotFound from './NotFound';

function App() {
  return (
    <BrowserRouter>
      <Layout>
        <Switch>
          <Route exact path='/' component={Homepage} />
          <Route exact path='/homepage' component={Homepage} />
          <Route path='/404' component={NotFound} />
          <Redirect from='*' to='/404' />
        </Switch>
      </Layout>
    </BrowserRouter>
  );
}

export default App;

然后当我去路线 /homepage 或任何路线看起来像这样

render nothing

NotFound页面代码是这样的。

import React from 'react';

function NotFound() {
  return <h1> Error 404: Not Found</h1>;
}

export default NotFound;

我的布局是这样的

import React from 'react';
import Header from './Header';
import Footer from './Footer';

function Layout(props) {
  const { children } = props;
  return (
    <>
      <Header />
      {children}
      <Footer />
    </>
  );
};

export default Layout;

我正在寻找解决它的答案,也许可能是我正在使用但我不确定的 webpack 配置。 我的 webpack 是这样的。

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  // para definir nuestra entrada index.js y la salida nuestro archivo bunble.js
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'bundle.js',
  },
  //  para resolver nuestros elementos
  resolve: {
    extensions: ['.js', '.jsx'],
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
        },
      },
      {
        test: /\.html$/,
        use: {
          loader: 'html-loader',
        },
      },
      {
        test: /\.(s*)css$/,
        use: [
          { loader: MiniCssExtractPlugin.loader },
          'css-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.(png|gif|jpg)$/,
        use: [
          {
            loader: 'file-loader',
            options: { name: 'assets/[hash].[ext]' },
          },
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './public/index.html',
      filename: './index.html',
    }),
    new MiniCssExtractPlugin({
      filename: 'assets/[name].css',
    }),
  ],
};

我的 package.json 是这样的

{
  "name": "legendary-deca-meca-app",
  "version": "1.0.0",
  "description": "Legendary app ",
  "main": "index.js",
  "dependencies": {
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.2.0",
    "react-scripts": "^3.4.1"
  },
  "devDependencies": {
    "@babel/core": "^7.10.2",
    "@babel/preset-env": "^7.10.2",
    "@babel/preset-react": "^7.10.1",
    "babel-eslint": "^10.1.0",
    "babel-loader": "^8.1.0",
    "css-loader": "^3.5.3",
    "eslint": "^7.2.0",
    "eslint-config-airbnb": "^18.1.0",
    "eslint-plugin-import": "^2.21.2",
    "eslint-plugin-jsx-a11y": "^6.2.3",
    "eslint-plugin-react": "^7.20.0",
    "file-loader": "^6.0.0",
    "html-loader": "^1.1.0",
    "html-webpack-plugin": "^4.3.0",
    "mini-css-extract-plugin": "^0.9.0",
    "node-sass": "^4.14.1",
    "sass-loader": "^8.0.2",
    "webpack": "^4.43.0",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.11.0"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --mode production",
    "start": "webpack-dev-server --open --mode development"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/RaPzoD1/legendary-deca-meca-app.git"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/RaPzoD1/legendary-deca-meca-app/issues"
  },
  "homepage": "https://github.com/RaPzoD1/legendary-deca-meca-app#readme"
}

感谢您的 cmets 和您的时间。

【问题讨论】:

  • 请分享您的 index.js 文件
  • 我的索引看起来像这样import React from 'react'; import ReactDOM from 'react-dom'; import App from './containers/App'; ReactDOM.render(&lt;App /&gt;, document.getElementById('app'));
  • import React from 'react'; import ReactDOM from 'react-dom'; import App from './containers/App'; import { BrowserRouter as Router } from 'react-router-dom' ReactDOM.render(&lt;Router&gt;&lt;App /&gt;&lt;/Router&gt;, document.getElementById('app'));......试试这个代码我希望这会工作
  • 您的 App.js 文件将如下所示 import React from 'react'; import { Switch, Route } from 'react-router-dom'; import Homepage from './Homepage'; function App() {return ( &lt;Route&gt;&lt;Switch&gt;&lt;Route exact path="/" component={Homepage} /&gt;&lt;/Switch&gt;&lt;/Route&gt;);}export default App;

标签: javascript reactjs webpack babeljs eslint-config-airbnb


【解决方案1】:

将此添加到您的 webpack.config.js

module.exports={
...
devServer: {
  historyApiFallback: true,
},
...
}

【讨论】:

    【解决方案2】:

    谢谢你们的帮助,我找到了答案。 问题是 react-router-dom,我使用的是“react-router-dom”:“^5.2.0”,但我看到的教程是 react-router-dom 版本 4.3.1

    我做了下一个更改

    import React from 'react';
    import { HashRouter as Router, BrowserRouter, Route, Switch, Redirect } from 'react-router-dom';  ---> i import HashRouter as Router
    import Homepage from './Homepage';
    // import Layout from '../components/Layout';
    import NotFound from './NotFound';
    import Header from '../components/Header';
    import Footer from '../components/Footer';
    // import NotFound from './NotFound';
    
    function App() {
      return (
        <Router> -----> here i change the BrowserRoter for Router
          <Header /> --> here i erase the layout and i put teh <header> and <footer>
          <Switch>
            <Route exact path='/' component={Homepage} />
            <Route exact path='/homepage' component={Homepage} />
            <Route path='/404' component={NotFound} />
            <Redirect from='*' to='/404' />
          </Switch>
          <Footer />
        </Router>
      );
    }
    
    export default App;
    

    这里是截图 homepage NotFound

    【讨论】:

      【解决方案3】:
      您可以尝试使用 'exact' 属性
      <Route path='/homepage' exact component={Homepage} />
      

      【讨论】:

        【解决方案4】:

        您可以尝试使用如下链接和路由器。

          <Router>
              <div>
                <nav>
                  <ul>
                    <li>
                      <Link to="/">HomePage</Link>
                    </li>
                    <li>
                      <Link to="/homepage">Homepage</Link>
                    </li>
                    <li>
                      <Link to="/404">NotFound</Link>
                    </li>
                  </ul>
                </nav>
        
                <Switch>
                  <Route path="/homepage">
                    <HomePage />
                  </Route>
                  <Route path="/404">
                    <NotFound />
                  </Route>
                  <Route path="/">
                    <HomePage />
                  </Route>
                  <Redirect from='*' to='/404' />
                </Switch>
              </div>
            </Router>
        

        【讨论】:

          【解决方案5】:

          还不能评论。 :)

          您是否尝试过将“/”路径移动到块的底部,如下所示:

                  <Switch>
                    <Route path='/homepage' component={Homepage} />
                    <Route path='/404' component={NotFound} />
                    <Route exact path='/' component={Homepage} />
                    <Redirect from='*' to='/404' />
                  </Switch>
          

          【讨论】:

            猜你喜欢
            • 2022-06-16
            • 2021-03-26
            • 2022-07-28
            • 2020-03-30
            • 2019-01-15
            • 1970-01-01
            • 1970-01-01
            • 2017-11-14
            • 2022-01-13
            相关资源
            最近更新 更多