React 路由器 - url 更改,没有渲染 [英] React router - url changes, no render

查看:20
本文介绍了React 路由器 - url 更改,没有渲染的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用一个简单的链接到 / 路由到通过 React 浏览器路由器.

Using a simple link to / route to via React browser Router.

我让它在路由到根组件 (/) 时工作​​正常,但是在尝试路由到 (/drink/:drinkId) 时它没有按预期运行>),但如果我手动尝试访问它,URL 会发生变化并且页面会加载.

I got it to work fine with routing to the root component (/), however it does not function as expected when trying to route to (/drink/:drinkId), though the URL changes and the page loads if I manually try to access it.

应用组件:

import React from "react";
import "./App.css";
import Cocktails from "./Cocktails";
import { Container } from "react-bootstrap";
import NavApp from "./Navbar";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import DrinkDetails from "./DrinkDetails";
import "./App.css";

function App() {
  return (
    <Router>
      <Container className="App-container">
        <NavApp />
        <Switch>
          <Route exact path="/">
            <Cocktails size={20} />
          </Route>
          <Route exact path="/drink/:drinkId">
            <DrinkDetails />
          </Route>
        </Switch>
      </Container>
    </Router>
  );
}

export default App;

饮品详情组件:

import { React, useState, useEffect } from "react";
import { Jumbotron, Button } from "react-bootstrap";
import {
  BrowserRouter as Router,
  Switch,
  Route,
  Link,
  useParams,
} from "react-router-dom";
import axios from "axios";

function DrinkDetails() {
  let { drinkId } = useParams();
  const [drink, setDrink] = useState(null);
  const [ingrdts, setIngrdts] = useState([]);

  useEffect(() => {
    const getDrinkSpecs = async () => {
      const res = await axios.get(
        `https://www.thecocktaildb.com/api/json/v1/1/lookup.php?i=${drinkId}`
      );
      let newDrink = res.data.drinks[0];
      setDrink(newDrink);
      let newIngrdts = [];
      for (let i = 1; i <= 15; i++) {
        if (newDrink[`strIngredient${i}`] != null) {
          let ingrdtVal = {};
          ingrdtVal["ing"] = newDrink[`strIngredient${i}`];
          ingrdtVal["val"] = newDrink[`strMeasure${i}`];
          newIngrdts.push(ingrdtVal);
        }
      }
      setIngrdts([...newIngrdts]);
    };
    getDrinkSpecs();
  }, [drinkId]);

  return drink ? (
    <Jumbotron>
      <h1>
        {drink.strDrink}
        <img src={drink.strDrinkThumb} />
      </h1>
      <p>Glass: {drink.strGlass}</p>
      <p>Category: {drink.strCategory}</p>
      <p>Instructions: {drink.strInstructions}</p>
      {ingrdts.map((ingrdt) => (
        <p>
          {ingrdt.ing} : {ingrdt.val}
        </p>
      ))}
      <p>
        <Button variant="primary">Learn more</Button>
      </p>
    </Jumbotron>
  ) : (
    <Jumbotron>
      <h1>Hmmm... we don't have this yet!</h1>
      <p>
        This is a simple hero unit, a simple jumbotron-style component for
        calling extra attention to featured content or information.
      </p>
      <p>
        <Button variant="primary">Learn more</Button>
      </p>
    </Jumbotron>
  );
}

export default DrinkDetails;

这是我使用Link的地方:

import React from "react";
import { Button, Card } from "react-bootstrap";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import "./Card.css";

function CardDrink({ data, select }) {
  return (
    <Router>
      <Card className="Cocktail-card">
        <Link to={`/drink/${data.idDrink}`}>
          <Card.Img
            variant="top"
            src={data.strDrinkThumb}
            className="Cocktail-card-img"
            onClick={() => select(data.idDrink)}
          />
        </Link>
        <Card.Body>
          <Card.Title>{data.strDrink}</Card.Title>
        </Card.Body>
      </Card>
    </Router>
  );
}

export default CardDrink;

推荐答案

CardDrink 组件中移除 .您只需要一个 Router根级别,您已经在App 组件中.

Remove <Router> from CardDrink component. You need only one Router at root level which you already have in App component.

此外,作为一种实践,不要在组件中保留未使用的导入.我也看到 DrinkDetails 组件中导入了 Router.

Also, as a practice don't keep unused imports in your component. I see Router imported in DrinkDetails component as well.

来自文档

要使用路由器,只需确保它在元素层次结构的根部呈现.通常,您会将顶级元素包装在路由器中.

To use a router, just make sure it is rendered at the root of your element hierarchy. Typically you’ll wrap your top-level element in a router.

这篇关于React 路由器 - url 更改,没有渲染的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆