禁用基于页面的组件功能
disable component functionality based on page
我有一个导航,其中的菜单项是隐藏的,直到您到达页面上的某个点,然后它们才会显示。
这在主页上效果很好,因为它是一个相对较长的页面。但是,我的其他一些页面很短,没有超过视口的高度。所以当页面加载时没有导航菜单选项,它显示导航是空白的。
有没有一种方法可以根据您所在的布局或页面有条件地禁用组件?
示例:在 Jekyll 中,您可以创建一个 if 语句并使用 {% if page.layout == 'home' %}hide{% endif %}
之类的东西隐藏 class 或部分。使用react时有没有equivalent/similar方法?
代码:
import React from 'react';
import { Collapse, Navbar, NavbarToggler, NavbarBrand, Nav, NavItem, NavLink } from 'reactstrap';
export default class Example extends React.Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
isOpen: false,
isTop: true,
width: 0,
height: 0
};
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
toggle() {
this.setState({
isOpen: !this.state.isOpen
});
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener('resize', this.updateWindowDimensions);
document.addEventListener('scroll', () => {
const isTop = window.scrollY < window.innerHeight - 50;
if (isTop !== this.state.isTop) {
this.setState({ isTop })
}
});
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({ width: window.innerWidth, height: window.innerHeight - 50 });
}
render() {
return (
<div>
<Navbar color="light" light expand="md">
<NavbarBrand href="/">Maryland <span>Brand</span></NavbarBrand>
<NavbarToggler onClick={this.toggle} />
<Collapse isOpen={this.state.isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink className="active" href="/">Our Brand</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Logos</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Color</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Typography</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Imagery</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Editorial</NavLink>
</NavItem>
<NavItem>
<NavLink className="red bold uppercase show" href="/">Communicators Toolkit</NavLink>
</NavItem>
</Nav>
</Collapse>
</Navbar>
</div>
);
}
}
Gatsby 自带 reach router,所以你可以用它来获取 location.pathname
然后有条件地渲染一些东西。
import React from 'react'
import { Location } from '@reach/router'
const HomepageOnly = () => (
<Location>
{({ location }) =>
location.pathname === '/' ? (
<p>This is the homepage</p>
) : (
<p>This is not</p>
)
}
</Location>
)
export default HomepageOnly
我有一个导航,其中的菜单项是隐藏的,直到您到达页面上的某个点,然后它们才会显示。
这在主页上效果很好,因为它是一个相对较长的页面。但是,我的其他一些页面很短,没有超过视口的高度。所以当页面加载时没有导航菜单选项,它显示导航是空白的。
有没有一种方法可以根据您所在的布局或页面有条件地禁用组件?
示例:在 Jekyll 中,您可以创建一个 if 语句并使用 {% if page.layout == 'home' %}hide{% endif %}
之类的东西隐藏 class 或部分。使用react时有没有equivalent/similar方法?
代码:
import React from 'react';
import { Collapse, Navbar, NavbarToggler, NavbarBrand, Nav, NavItem, NavLink } from 'reactstrap';
export default class Example extends React.Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
isOpen: false,
isTop: true,
width: 0,
height: 0
};
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
toggle() {
this.setState({
isOpen: !this.state.isOpen
});
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener('resize', this.updateWindowDimensions);
document.addEventListener('scroll', () => {
const isTop = window.scrollY < window.innerHeight - 50;
if (isTop !== this.state.isTop) {
this.setState({ isTop })
}
});
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({ width: window.innerWidth, height: window.innerHeight - 50 });
}
render() {
return (
<div>
<Navbar color="light" light expand="md">
<NavbarBrand href="/">Maryland <span>Brand</span></NavbarBrand>
<NavbarToggler onClick={this.toggle} />
<Collapse isOpen={this.state.isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink className="active" href="/">Our Brand</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Logos</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Color</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Typography</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Imagery</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Editorial</NavLink>
</NavItem>
<NavItem>
<NavLink className="red bold uppercase show" href="/">Communicators Toolkit</NavLink>
</NavItem>
</Nav>
</Collapse>
</Navbar>
</div>
);
}
}
Gatsby 自带 reach router,所以你可以用它来获取 location.pathname
然后有条件地渲染一些东西。
import React from 'react'
import { Location } from '@reach/router'
const HomepageOnly = () => (
<Location>
{({ location }) =>
location.pathname === '/' ? (
<p>This is the homepage</p>
) : (
<p>This is not</p>
)
}
</Location>
)
export default HomepageOnly