#javascript #css #reactjs
Вопрос:
Это, вероятно, очень просто, но я хочу поменять класс, когда меня нет на моей домашней странице. Например, у меня есть это:
customBurgerIcon={
<span className='font-bold text-xl md:text-2xl text-gray-100 tracking-wider hover:underline'>
Menu
</span>
}
Я хочу переключиться text-gray-100
на другой класс, когда меня нет на моей домашней странице. Я также хочу иметь возможность отключать изображение, когда я не нахожусь на своей домашней странице.
import Logo from '../images/logo-2-light.png';
// markup
const Header = () => {
return (
// <header className=' '>
<header className='bg-transparent absolute top-8 md:top-14 left-10 z-10'>
<Link to='/'>
<img src={Logo} className='w-20 md:w-24 lg:w-52' alt='PNFB LTD logo' />
</Link>
</header>
);
};
Я хочу иметь возможность переключить его обратно в исходный класс, когда я нахожусь на домашней странице. Это потому, что моя домашняя страница темная, а другие страницы светлые.
Я провел некоторое исследование, и кажется, что я могу сделать это с помощью тернарного оператора? Но все примеры используются для активных ссылок и т. Д., Что не подходит для того, что мне нужно.
Любая помощь была бы очень кстати.
РЕДАКТИРОВАТЬ: компонент, на котором я хочу изменить класс
import React from 'react';
import { slide as Menu } from 'react-burger-menu';
import { Link } from 'gatsby';
var styles = {
bmCrossButton: {
height: '64px',
width: '64px',
right: '2rem',
top: '2rem',
},
bmMenuWrap: {
position: 'fixed',
height: '100%',
},
bmMorphShape: {
fill: '#373a47',
},
bmOverlay: {
background: 'rgba(0, 0, 0, 0.3)',
},
};
class Sidebar extends React.Component {
constructor(props) {
super(props);
this.state = {
menuOpen: false,
};
}
// This keeps your state in sync with the opening/closing of the menu
// via the default means, e.g. clicking the X, pressing the ESC key etc.
handleStateChange(state) {
this.setState({ menuOpen: state.isOpen });
}
// This can be used to close the menu, e.g. when a user clicks a menu item
closeMenu() {
this.setState({ menuOpen: false });
}
// This can be used to toggle the menu, e.g. when using a custom icon
// Tip: You probably want to hide either/both default icons if using a custom icon
// See https://github.com/negomi/react-burger-menu#custom-icons
toggleMenu() {
this.setState((state) => ({ menuOpen: !state.menuOpen }));
}
render() {
return (
<Menu
right
width={425}
styles={styles}
isOpen={this.state.menuOpen}
onStateChange={(state) => this.handleStateChange(state)}
burgerButtonClassName={'absolute top-8 md:top-14 right-10 hover:underline text-white'}
// crossButtonClassName={'absolute top-16 md:top-14 right-10 text-gray-900'}
itemListClassName={'flex'}
menuClassName={'bg-gray-900 text-gray-100 px-6 focus:outline-none'}
customBurgerIcon={
<span className={`font-bold text-xl md:text-2xl text-gray-100 tracking-wider hover:underline`}>
Menu
</span>
}
customCrossIcon={
<span className='font-bold text-xl md:text-2xl text-gray-100 tracking-wider hover:underline'>
Close
</span>
}>
<div className='flex flex-col pt-16 sm:pt-32 md:pt-48 px-12 '>
<nav className='flex flex-col '>
<Link
onClick={() => this.closeMenu()}
className='font-bold uppercase montserrat text-2xl md:text-4xl mb-6 tracking-wide hover:text-red-500'
to='/'>
Home
</Link>
<Link
onClick={() => this.closeMenu()}
className='font-bold uppercase montserrat text-2xl md:text-4xl mb-6 tracking-wide hover:text-red-500'
to='/charity'>
Our Charity
</Link>
<Link
onClick={() => this.closeMenu()}
className='font-bold uppercase montserrat text-2xl md:text-4xl tracking-wide hover:text-red-500'
to='/contact'>
Contact
</Link>
</nav>
</div>
</div>
</Menu>
);
}
}
export default Sidebar;
Комментарии:
1. вы используете react router dom ?
2. я использую Гэтсби, поэтому использую API ссылок
Ответ №1:
Пример:
const Header = () => {
const url = typeof window !== 'undefined' ? window.location.href : '';
return (
<header className={url === 'yoursite.com/home' ? 'text-gray-100' : ''}>
<Link to='/'>
<img src={Logo} className='w-20 md:w-24 lg:w-52' alt='PNFB LTD logo' />
</Link>
</header>
);
};
Комментарии:
1. как я могу сделать это для компонента класса?
Ответ №2:
Используйте тернарный оператор для классов, может быть так:
className={`font-bold text-xl ${condition ? 'text-gray-100': ''}`}
Для изображения можно сделать вот так внутри компонента:
{
condition ?
<Link>
<img src={Logo} className='w-20 md:w-24 lg:w-52' alt='PNFB LTD logo'/>
</Link> : <> </> // Or the image replacement
}
Комментарии:
1. вот что я подумал…но как я могу изменить это в зависимости от того, нахожусь я на домашней странице или нет? Мне нужно переключиться
2. Да, условие может быть параметром маршрутизатора
3. у вас есть пример?
4. Вы используете gatsby, вы можете получить доступ к значению из реквизитов компонента:
const url = props.location.href ? props.location.href : '';
здесь вы можете сравнить по URL5. Я добавил свой компонент в свой вопрос… Я полагаю, что это было бы по-другому с компонентом класса?