如何使用React正确设置react-router-dom链接

爱国者1984

由于缺乏经验,我一直在挣扎我的第一个独奏作品,这是我遇到的麻烦:

我需要设置一个(react-router-dom)的链接组件,单击该按钮后,它会将我带到另一个新页面。考虑到选择需要传递给链接(和上下文)id,以便可以从API提取数据,但是我不知道如何使它起作用。这是按钮链接组件:

Model.jsx

import React, { useState, useContext } from 'react';
import { BrowserRouter as Router, Switch, Route, Link, Redirect } from 'react-router-dom';
import FileModel from "../FileModel/FileModel";
import { ModelsContext } from "../../context/ModelsContext";

const Model = ({modelo}) => {

    const { id, name, year, price, photo } = modelo;

    const { guardarModelo } = useContext(ModelsContext);

    const [display, setDisplay] = useState("btn-notdisplayed");
    const showButton = e => {
      e.preventDefault();
      setDisplay("btn-displayed");
    };
  
    const hideButton = e => {
      e.preventDefault();
      setDisplay("btn-notdisplayed");
    };

 

    return (   
            <div 
                className="card"
                onMouseEnter={e => showButton(e)}
                onMouseLeave={e => hideButton(e)}
            >
                <div className="card-body">
                    <p className="card-name">{name}</p>
                    <p className="card-yearprice">{year} | $ {price}</p>
                </div>
                <img src={`https://challenge.agenciaego.tech${photo}`} className="card-image" alt={`Imagen de ${name}`} />
                <Router>
                    <button 
                        type="button" 
                        className={display}
                        onClick={() => {
                            guardarModelo(modelo);
                        }}
                    ><Link to={`/models/${modelo.id}`}>Ver Modelo</Link>
                    </button>
                    <Switch>
                        <Route exact path={`/models/${modelo.id}`} component={FileModel} />
                    </Switch>
                </Router>         
            </div>   
     );
}
 
export default Model;

然后,我从上下文获取数据:

ModelsContext.jsx

import React, { createContext, useState, useEffect } from 'react';

export const ModelsContext = createContext();

const ModelsProvider = (props) => {

        //State de modelos
        const [ modelo, guardarModelo ] = useState({});
        const [ modelos, guardarModelos ] = useState([]);
        const [ allModelos, guardarAllModelo ] = useState([]);
 

         //Cargar un modelo
         useEffect(() => {
             const consultarAPI = async () => {
                

                 const api = await fetch("https://challenge.agenciaego.tech/models");
                 const modelos = await api.json();

                 const api2 = await fetch(`https://challenge.agenciaego.tech/models/${id}`);
                 const modelo = await api2.json();
                 
                 guardarAllModelo(modelos);
                 guardarModelos(modelos);
                 guardarModelo(modelo);

             }
             consultarAPI()
         }, []);

    return (
        <ModelsContext.Provider
            value={{
                allModelos,
                modelo,
                modelos,
                guardarModelo,
                guardarModelos
            }}
        >
            {props.children}
        </ModelsContext.Provider>
    )
}

export default ModelsProvider;

最终,我得到了从中路由主要组件的App.js,其想法是将名为“ FileModel.jsx”的新组件的链接作为子组件获得,从而维护Navbar组件。

App.js

import React from "react";
import Navbar from "./components/Nav/Navbar";
import Models from "./components/Models/Models";
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
import Logo from "./assets/img/logo.png";
import ModelsProvider from "./context/ModelsContext";
import ModelFooter from "./components/Models/ModelFooter";

function App() {

  return (
    <ModelsProvider> 
        <Router>
            <nav className="navbar">
                <img src={Logo} className="logo" alt="Ego Logo" />
                <div className="menu-container">
                    <Link to={'/models'} className="menu-items">Modelos</Link>
                    <a className="menu-items">Ficha de modelo</a>
                </div>
                <div className="bottom-line"></div>
            </nav>
            <Switch>
              <Route exact path='/models' component={Models} />
            </Switch>
        </Router>
        <Navbar />
        <ModelFooter /> 
    </ModelsProvider>
  );
}

export default App;

到目前为止,这是fileModel.jsx:

import React, { useContext } from 'react';
import Navbar from "../Nav/Navbar";
import { ModelsContext } from "../../context/ModelsContext";

const FileModel = () => {

    const { modelo } = useContext(ModelsContext);

    console.log(modelo.id);

    return ( 
        <Navbar />
     );
}
 
export default FileModel;

我希望能清楚地说明我的问题,非常感谢所有关心我的人!

干杯!

附:也许您可以找到一些要重构的东西(稍后我将需要检查我的代码),如果您发现类似的东西,将不胜感激!

更新

由于Linda的建议,我将两个上下文合并为一个,并更改了我之前编写的代码的几行,因此我无法设置将单独模型传递给fileModel组件的状态,并且链接仍然无法正常工作,我在考虑一个函数可以做到的是,我创建了另一个状态,一个单一的模型,但是当我单击按钮时,我得到了一个错误且未定义,因为Idk如何将Id设置为状态并将其传递给API调用,终端说const api2中的id =等待fetch(https://challenge.agenciaego.tech/models/${id}); 没有定义。

爱国者1984

我终于解决了我的问题!!!我必须在组件之间重新分配一些元素,以使api上下文采用id并将其传递给FileModel组件,并将Link路由器更改为App.js,这就是解决方法:

App.js

import React from "react";
import Navbar from "./components/Nav/Navbar";
import Models from "./components/Models/Models";
import { BrowserRouter as Router, Switch, Route, Link } from 'react-router-dom';
import Logo from "./assets/img/logo.png";
import ModelsProvider from "./context/ModelsContext";
import ModelFooter from "./components/Models/ModelFooter";
import FileModel from "./components/FileModel/FileModel";


function App() {

  return (
    <ModelsProvider> 
        <Router>
            <nav className="navbar">
                <img src={Logo} className="logo" alt="Ego Logo" />
                <div className="menu-container">
                    <Link to={'/models'} className="menu-items">Modelos</Link>
                    <Link to={`/models/1`} className="menu-items">Ficha del Modelo</Link>
                </div>
                <div className="bottom-line"></div>             
            </nav>
            <Switch>
              <Route exact path='/models' component={Models} />
              <Route exact path='/models' component={Models} />
            </Switch>
        </Router>
        <Navbar />
        <FileModel />
        <ModelFooter />
    </ModelsProvider>
  );
}

export default App;

Modelscontext.jsx

import React, { createContext, useState, useEffect } from 'react';

export const ModelsContext = createContext();

const ModelsProvider = (props) => {

        //State de modelos
        const [ modelo, guardarModelo ] = useState([]);
        const [ modelos, guardarModelos ] = useState([]);
        const [ allModelos, guardarAllModelo ] = useState([]);

        
        const { id } = modelo;

         //Cargar un modelo
         useEffect(() => {
             const consultarAPI = async () => {
                

                 const api = await fetch("https://challenge.agenciaego.tech/models");
                 const modelos = await api.json();

                 const api2 = await fetch(`https://challenge.agenciaego.tech/models/${id}`);
                 const modelo = await api2.json();
                 
                 guardarAllModelo(modelos);
                 guardarModelos(modelos);
                 guardarModelo(modelo);

             }
             consultarAPI()
         }, [modelo.id]);

    return (
        <ModelsContext.Provider
            value={{
                allModelos,
                modelo,
                modelos,
                guardarModelo,
                guardarModelos
            }}
        >
            {props.children}
        </ModelsContext.Provider>
    )
}

export default ModelsProvider;

Model.js

import React, { useState, useContext } from 'react';
import { Link } from 'react-router-dom';
import { ModelsContext } from "../../context/ModelsContext";


const Model = ({modelo}) => {

    const { name, year, price, photo } = modelo;

    const { guardarModelo } = useContext(ModelsContext);

    const [display, setDisplay] = useState("btn-notdisplayed");
    const showButton = e => {
      e.preventDefault();
      setDisplay("btn-displayed");
    };
  
    const hideButton = e => {
      e.preventDefault();
      setDisplay("btn-notdisplayed");
    };

    return (   
            <div 
                className="card"
                onMouseEnter={e => showButton(e)}
                onMouseLeave={e => hideButton(e)}
            >
                <div className="card-body">
                    <p className="card-name">{name}</p>
                    <p className="card-yearprice">{year} | $ {price}</p>
                </div>
                <img src={`https://challenge.agenciaego.tech${photo}`} className="card-image" alt={`Imagen de ${name}`} />
                    <Link to={`/models/${modelo.id}`}><button 
                        type="button" 
                        className={display}
                        onClick={() => {
                            guardarModelo(modelo);
                        }}
                    >Ver Modelo
                    </button></Link>
            </div>   
     );
}
 
export default Model;

FileModel.js(到目前为止...)

import React, { useContext } from 'react';
import Navbar from "../Nav/Navbar";
import { ModelsContext } from "../../context/ModelsContext";

const FileModel = () => {

    const { modelo } = useContext(ModelsContext);

    const { photo, name } = modelo;

    return (
        <> 
        <Navbar />
        <section>
            <img src={`https://challenge.agenciaego.tech${photo}`} alt={`Imagen de ${name}`}/>
        </section>
        </>
     );
}
 
export default FileModel;

感谢Linda给我有关重构上下文的投入!干杯!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用链接测试React Router

来自分类Dev

React-Router:如何测试渲染链接的href?

来自分类Dev

React Router深层链接

来自分类Dev

如何使用react-router-dom在react中创建受保护的路由

来自分类Dev

如何在React-Router上的链接中引用状态

来自分类Dev

如何正确使用React-Router

来自分类Dev

React-router链接,传入参数

来自分类Dev

使用带有可选URL参数的react-router链接设置活动类

来自分类Dev

如何在使用中发送参数React Router Dom的历史?

来自分类Dev

react-router-dom <链接>未更新页面

来自分类Dev

带有react-router-dom链接的SpeedDialAction

来自分类Dev

如何覆盖react-router-link链接样式属性?

来自分类Dev

使用React-Router-Dom创建PrivateRoute

来自分类Dev

react-router-dom链接-悬停时隐藏URL

来自分类Dev

如何使用CSS在React Router Dom中选择链接标签?

来自分类Dev

React Router Dom的<Switch>问题

来自分类Dev

在react-router-dom链接中传递参数不能正常工作

来自分类Dev

设置React Router链接的样式

来自分类Dev

当使用react-router-dom匹配URL路径时,如何防止React组件卸载

来自分类Dev

React Router dom将活动类设置为NavLink

来自分类Dev

react-router-dom链接无法导航到目标页面的开始

来自分类Dev

如何正确使用React-Router

来自分类Dev

Redux和React-Router正确设置

来自分类Dev

react-router-dom 元素类型无效

来自分类Dev

可重用的 react-router-dom 链接 hrefs

来自分类Dev

我在 React 应用程序中遇到了两个 .js 文件的问题!我正在使用 react-router-dom。我的问题是链接标签

来自分类Dev

如何使用 react-router-dom 创建动态路由?

来自分类Dev

如何从 react-dom-router 模块设置 Link 的样式?

来自分类Dev

使用 react-router-dom 在反应中全局使用 Header

Related 相关文章

  1. 1

    使用链接测试React Router

  2. 2

    React-Router:如何测试渲染链接的href?

  3. 3

    React Router深层链接

  4. 4

    如何使用react-router-dom在react中创建受保护的路由

  5. 5

    如何在React-Router上的链接中引用状态

  6. 6

    如何正确使用React-Router

  7. 7

    React-router链接,传入参数

  8. 8

    使用带有可选URL参数的react-router链接设置活动类

  9. 9

    如何在使用中发送参数React Router Dom的历史?

  10. 10

    react-router-dom <链接>未更新页面

  11. 11

    带有react-router-dom链接的SpeedDialAction

  12. 12

    如何覆盖react-router-link链接样式属性?

  13. 13

    使用React-Router-Dom创建PrivateRoute

  14. 14

    react-router-dom链接-悬停时隐藏URL

  15. 15

    如何使用CSS在React Router Dom中选择链接标签?

  16. 16

    React Router Dom的<Switch>问题

  17. 17

    在react-router-dom链接中传递参数不能正常工作

  18. 18

    设置React Router链接的样式

  19. 19

    当使用react-router-dom匹配URL路径时,如何防止React组件卸载

  20. 20

    React Router dom将活动类设置为NavLink

  21. 21

    react-router-dom链接无法导航到目标页面的开始

  22. 22

    如何正确使用React-Router

  23. 23

    Redux和React-Router正确设置

  24. 24

    react-router-dom 元素类型无效

  25. 25

    可重用的 react-router-dom 链接 hrefs

  26. 26

    我在 React 应用程序中遇到了两个 .js 文件的问题!我正在使用 react-router-dom。我的问题是链接标签

  27. 27

    如何使用 react-router-dom 创建动态路由?

  28. 28

    如何从 react-dom-router 模块设置 Link 的样式?

  29. 29

    使用 react-router-dom 在反应中全局使用 Header

热门标签

归档