Реагирующий маршрутизатор отображает информацию в зависимости от URL

#javascript #reactjs #react-router #react-hooks

#javascript #reactjs #реагирующий маршрутизатор #реагирующие крючки

Вопрос:

Итак, я пытаюсь изучить React, я работаю над проектом, в котором я хочу отображать статьи об автомобилях. У меня есть мой CarContext

 export const CarProvider = (props) => {
  const [cars, setCars] = useState([
    {
      name: 'Car1',
      img: car1,
      id: 1,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
    {
      name: 'car2',
      img: car2,
      id: 2,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
    {
      name: 'car3',
      img: car3,
      id: 3,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
  ]);
  return (
    <CarContext.Provider value={[cars, setCars]}>
      {props.children}
    </CarContext.Provider>
  );
};
 

App.js

 function App() {
  return (
    <CarProvider>
      <Router>
        <div className='App'>
          <Header />
        </div>
        <Switch>
          <Route path='/articles' exact component={Articles} />
          <Route path='/articles/:id' component={SpecificArticle} />
          <Route path='/' exact component={Home} />
        </Switch>
        <Footer />
      </Router>
    </CarProvider>
  );
}
 

Я создал компонент под названием CarArticles, в котором я отображаю все статьи (имя и img) и кнопку.

 import { CarContext } from '../CarContext';

const CarArticles = () => {
  const [cars, setCars] = useContext(CarContext);
  return (
    <div>
      {cars.map((car) => (
        <Card
          name={car.name}
          img={car.img}
          key={car.id}
          id={car.id}
        />
      ))}
    </div>
  );
};

export default CarArticles;

 
 const Card = ({ name, img, id }) => {
  return (
    <div>
      <h3>{name}</h3>
      <img src={img} alt='img of car'/>
      <Link to={`/articles/${id}`}>
        <button>read more</button>
      </Link>
    </div>
  );
};

export default Card;

 

Когда я нажимаю на одну из кнопок, отображается конкретная статья компонента со статическим текстом «Вот страница конкретной статьи об автомобиле в зависимости от того, какую кнопку вы нажали»

 const SpecificArticle = () => {

  return (
    <div>
      <h3>
        <h2>
          "Here's the specific Car article page depending on which button you
          clicked"
        </h2>
      </h3>
    </div>
  );
};

export default SpecificArticle;

 

Мой вопрос в том, как мне получить конкретную информацию об автомобиле внутри ‘SpecificArticle? Если я нажму на статью 1, я хочу, чтобы компонент отображал информацию из object1… и если я нажму на статью 2, мне нужна информация из object2, например, имя img и информация…

Ответ №1:

Доступ к параметрам URL осуществляется с помощью useParams():

 import {useParams} from "react-router-dom";

const SpecificArticle = () => { 
  const params  = useParams();
  const id = params.id;
  
  return (
    <div>This is the id : {id}</div>
  )
 }
   

Поскольку вы хотите использовать поставщик контекста, он должен быть определен как

 export const cars = {
    'Car1': {
      name: 'Car1',
      img: car1,
      id: 1,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
    'car2': {
      name: 'car2',
      img: car2,
      id: 2,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
    'car3': {
      name: 'car3',
      img: car3,
      id: 3,
      info:
        'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Illum qui unde voluptate numquam aspernatur dolor sunt ducimus dolore nesciunt. Voluptate suscipit omnis velit maxime explicabo dicta at quo modi placeat',
    },
};

export const CarsProvider = React.createContext(
  cars.Car1 // default value
); 

Если используется только несколько машин, это использование должно быть в порядке, но по мере роста проекта может быть лучше загрузить файл json или базу данных.

Ответ №2:

useParams

Рассмотрите возможность использования параметров использования маршрутизатора react.

Пример:

 const SpecificArticle = () => {
  const { id } = useParams();

  return (
    <div>
      ...
    </div>
  );
};
 

CarContext

 // create CarContext using an initial object with 'cars' being an empty array
const CarContext = createContext({cars: []})

// put cars data into the context provider
const cars = []; // array of data
<CarContext.Provider value={cars} />

// access the cars using the context anywhere inside the CarContext tree
const { cars } = useContext(CarContext);
 

На самом деле это довольно просто, пожалуйста, изучите, как использовать контекст react, который «обеспечивает способ передачи данных через дерево компонентов без необходимости вручную передавать реквизиты на каждом уровне».

Комментарии:

1. Спасибо, я пытался использовать параметры использования, и я понимаю, что должен использовать его, но я не понимаю, как я получаю всю информацию из объектов в массиве. car1.name и car1.image, например.