Как изменить цвет фона элемента, который находится внутри компонента GatsbyJS, на основе страницы, на которой я импортирую компонент?

#javascript #html #css #reactjs #gatsby

#javascript #HTML #css — файл #reactjs #gatsby #css

Вопрос:

Я впервые создаю веб-сайт с помощью GatsbyJS, и я пытаюсь создать некоторые компоненты для использования по всему сайту.

Одним из этих компонентов является нижний колонтитул. Я написал его структуру, но я хочу изменить цвет <div> , который является частью нижнего колонтитула, в зависимости от того, какую страницу я посещаю. Я не хочу, чтобы весь нижний колонтитул менял цвет, только этот div, который является частью нижнего колонтитула.

Чтобы быть более точным: если я посещаю домашнюю страницу, я хочу, чтобы у этого div был оранжевый фон, тогда как если я нахожусь на странице контактов, я хочу, чтобы у него был синий фон.

Возможно ли это?

Это часть кода моего нижнего колонтитула (то есть footer.js компонент gatsby, который я импортирую на свои страницы):

 <footer className={footerStyle.footer}>
  <div className={footerStyle.parteSopra}>
    <div className={footerStyle.parteSopra}>
      <div className={footerStyle.ottanta}>
        <h3 className={footerStyle.rimaniamo  ' ' footerStyle.dimTitoli}>rimaniamo<br />in contatto</h3>
      </div>
      <div className={footerStyle.venti}>

      </div>
    </div>
    <div className={footerStyle.parteSotto}>
      <div className={footerStyle.ottanta  ' ' footerStyle.boxFrecciaBlu}>
        <div className={footerStyle.contieniFrecciaBlu}>
          <img className={footerStyle.frecciaBlu} src={frecciaBlu} alt="Freccia giù" />
        </div>
      </div>
      <div className={footerStyle.venti  ' ' footerStyle.boxFbEInstaBlu}>
        <div className={footerStyle.contieniFbBlu}>
          <a href="https://it-it.facebook.com/DiamanteCalzature" target="_blank" rel="noopener noreferrer">
            <img className={footerStyle.fbBlu} src={iconaFbBlu} alt="Facebook" />
          </a>
        </div>
        <div className={footerStyle.contieniInstaBlu}>
          <a href="https://instagram.com/diamantecalzature?igshid=cta3uh8iob7a" target="_blank" rel="noopener noreferrer">
            <img className={footerStyle.instaBlu} src={iconaInstaBlu} alt="Instagram" />
          </a>
        </div>
      </div>
    </div>
  </div>
  <div id="coloreFootSotto" className={footerStyle.parteSotto  ' ' footerStyle.coloreFooterSotto}>
    <div className={footerStyle.ottanta}>

    </div>
    <div className={footerStyle.venti  ' ' footerStyle.boxTornaSu}>

    </div>
  </div>
</footer>  

Я импортирую его при написании на своих страницах <Footer /> и я подумал, что мог бы добавить атрибут, реквизит или что-то внутри этого тега, чтобы реализовать то, что я хочу. Мне нужно, чтобы div с идентификатором id="coloreFootSotto" имел другой цвет фона в зависимости от страницы, которую я посещаю. На данный момент я просто манипулирую DOM на некоторых страницах, чтобы изменить цвет фона, но мне было интересно, возможно ли это сделать с помощью реквизита или чего-то подобного (возможно, нет).

Кто-нибудь знает это? Спасибо

Ответ №1:

Gatsby использует reach router, поэтому вы можете использовать useLocation в своем компоненте и что-то делать с location.pathname для определенных маршрутов.

 // Footer.js
import React from 'react';
import { useLocation } from "@reach/router"

import Container from 'components/Container';

const Footer = () => {
  const {pathname} = useLocation()
  console.log(pathname)
  return (
    <footer style={pathname=== '/' ? {backgroundColor: 'blue'} : null} >
      <Container>
        <p>amp;copy; {new Date().getFullYear()}, My Gatsby Site</p>
      </Container>
    </footer>
  );
};

export default Footer;
  

Также стоит упомянуть, что вы можете получить данные о местоположении со страницы gatsby через ее идентификатор местоположения.

В зависимости от того, как структурировано ваше приложение, вы также можете получить эти данные из своего компонента страницы и передать соответствующие данные с помощью реквизитов вниз по дереву компонентов.

например, Расширение > Макет > Нижний колонтитул

Для нескольких страниц вы могли бы сделать что-то вроде этого.

 // Footer.js
import React from 'react';
import { useLocation } from "@reach/router"
import Container from 'components/Container';

const pagesWithColoredFooter = ['/', '/page-2', 'page-3'];

const Footer = () => {
  const {pathname} = useLocation()
  console.log(pathname)
  return (
    <footer style={pagesWithColoredFooter.includes(pathname) ? {backgroundColor: 'blue'} : null} >
      <Container>
        <p>amp;copy; {new Date().getFullYear()}, My Gatsby Site</p>
      </Container>
    </footer>
  );
};

export default Footer;
  

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

1. Спасибо за ваш ответ! Если я использую этот метод, который вы сказали {backgroundColor: ‘blue’} : null} > как я могу указать более одной страницы, на которой я хочу использовать синий фон?

2. Хорошо, большое вам спасибо! Я попробую и сообщу вам, получилось ли у меня это

3. Извините, но я пытался и, вероятно, не совсем понял, как использовать массив путей, не могли бы вы, пожалуйста, привести мне пример использования с моим или вашим кодом? Спасибо

4. Отлично, спасибо! Извините, если я задам вам другой вопрос по этому поводу: возможно ли также использовать этот метод для изменения эффектов onOver (например, onMouseOver=»this.style. что угодно» или что-то подобное) или заменить используемое изображение другим, всегда основанным на странице?

5. В конце концов мне удалось все сделать. Еще раз большое вам спасибо за помощь