React:在特定路线上隐藏组件
React: Hide a Component on a specific Route
React 新手:
我有一个 <Header />
组件,我想 仅在用户访问特定页面时隐藏该组件 。
到目前为止,我设计我的应用程序的方式是 <Header />
组件在导航时 而不是 re-rendered ,只有页面内容是,所以它提供非常流畅的体验。
我尝试 re-render 每条路线的 header ,这样可以很容易地隐藏起来,但每次导航时我都会遇到难看的 re-rendering 故障。
所以基本上,有没有办法 re-render 只有在进出特定路线时才会出现组件?
如果不是,实现此目标的最佳实践是什么?
App.js:
class App extends Component {
render() {
return (
<BrowserRouter>
<div className="App">
<Frame>
<Canvas />
<Header />
<Main />
<NavBar />
</Frame>
</div>
</BrowserRouter>
);
}
}
Main.js:
const Main = () => (
<Switch>
<Route exact activeClassName="active" path="/" component={Home} />
<Route exact activeClassName="active" path="/art" component={Art} />
<Route exact activeClassName="active" path="/about" component={About} />
<Route exact activeClassName="active" path="/contact" component={Contact} />
</Switch>
);
您可以将它添加到所有路由(通过声明一个非精确路径)并将它隐藏在您的特定路径中:
<Route path='/' component={Header} /> // note, no exact={true}
然后在 Header
渲染方法中:
render() {
const {match: {url}} = this.props;
if(url.startWith('/your-no-header-path') {
return null;
} else {
// your existing render login
}
}
您可以依靠状态进行重新渲染。
如果您从路线 shouldHide
导航,则 this.setState({ hide: true })
您可以使用条件将 <Header>
包裹在渲染中:
{
!this.state.hide &&
<Header>
}
或者你可以使用函数:
_header = () => {
const { hide } = this.state
if (hide) return null
return (
<Header />
)
}
并且在渲染方法中:
{this._header()}
我还没有尝试过 react-router,但这样的东西可能会起作用:
class App extends Component {
constructor(props) {
super(props)
this.state = {
hide: false
}
}
toggleHeader = () => {
const { hide } = this.state
this.setState({ hide: !hide })
}
render() {
const Main = () => (
<Switch>
<Route exact activeClassName="active" path="/" component={Home} />
<Route
exact
activeClassName="active"
path="/art"
render={(props) => <Art toggleHeader={this.toggleHeader} />}
/>
<Route exact activeClassName="active" path="/about" component={About} />
<Route exact activeClassName="active" path="/contact" component={Contact} />
</Switch>
);
return (
<BrowserRouter>
<div className="App">
<Frame>
<Canvas />
<Header />
<Main />
<NavBar />
</Frame>
</div>
</BrowserRouter>
);
}
}
并且需要手动调用Art里面的函数:
this.props.hideHeader()
我也是 React 的新手,但遇到了这个问题。已接受答案的基于 react-router
的替代方法是使用 withRouter
,它包装您要隐藏的组件并为其提供 location
道具(以及其他)。
import { withRouter } from 'react-router-dom';
const ComponentToHide = (props) => {
const { location } = props;
if (location.pathname.match(/routeOnWhichToHideIt/)){
return null;
}
return (
<ComponentToHideContent/>
)
}
const ComponentThatHides = withRouter(ComponentToHide);
请注意来自 the docs 的警告:
withRouter does not subscribe to location changes like React Redux’s
connect does for state changes. Instead, re-renders after location
changes propagate out from the component. This means that
withRouter does not re-render on route transitions unless its parent
component re-renders.
尽管如此,这种方法似乎适用于与 OP 非常相似的用例。
从 React Router 5.1 开始有钩子 useLocation,它可以让你轻松访问当前位置。
import { useLocation } from 'react-router-dom'
function HeaderView() {
let location = useLocation();
console.log(location.pathname);
return <span>Path : {location.pathname}</span>
}
{location.pathname !== '/page-you-dont-want' && <YourComponent />}
这将检查路径名称,如果它不是您不希望组件出现的页面,则不会显示它,否则将显示它。
React 新手:
我有一个 <Header />
组件,我想 仅在用户访问特定页面时隐藏该组件 。
到目前为止,我设计我的应用程序的方式是 <Header />
组件在导航时 而不是 re-rendered ,只有页面内容是,所以它提供非常流畅的体验。
我尝试 re-render 每条路线的 header ,这样可以很容易地隐藏起来,但每次导航时我都会遇到难看的 re-rendering 故障。
所以基本上,有没有办法 re-render 只有在进出特定路线时才会出现组件?
如果不是,实现此目标的最佳实践是什么?
App.js:
class App extends Component {
render() {
return (
<BrowserRouter>
<div className="App">
<Frame>
<Canvas />
<Header />
<Main />
<NavBar />
</Frame>
</div>
</BrowserRouter>
);
}
}
Main.js:
const Main = () => (
<Switch>
<Route exact activeClassName="active" path="/" component={Home} />
<Route exact activeClassName="active" path="/art" component={Art} />
<Route exact activeClassName="active" path="/about" component={About} />
<Route exact activeClassName="active" path="/contact" component={Contact} />
</Switch>
);
您可以将它添加到所有路由(通过声明一个非精确路径)并将它隐藏在您的特定路径中:
<Route path='/' component={Header} /> // note, no exact={true}
然后在 Header
渲染方法中:
render() {
const {match: {url}} = this.props;
if(url.startWith('/your-no-header-path') {
return null;
} else {
// your existing render login
}
}
您可以依靠状态进行重新渲染。
如果您从路线 shouldHide
导航,则 this.setState({ hide: true })
您可以使用条件将 <Header>
包裹在渲染中:
{
!this.state.hide &&
<Header>
}
或者你可以使用函数:
_header = () => {
const { hide } = this.state
if (hide) return null
return (
<Header />
)
}
并且在渲染方法中:
{this._header()}
我还没有尝试过 react-router,但这样的东西可能会起作用:
class App extends Component {
constructor(props) {
super(props)
this.state = {
hide: false
}
}
toggleHeader = () => {
const { hide } = this.state
this.setState({ hide: !hide })
}
render() {
const Main = () => (
<Switch>
<Route exact activeClassName="active" path="/" component={Home} />
<Route
exact
activeClassName="active"
path="/art"
render={(props) => <Art toggleHeader={this.toggleHeader} />}
/>
<Route exact activeClassName="active" path="/about" component={About} />
<Route exact activeClassName="active" path="/contact" component={Contact} />
</Switch>
);
return (
<BrowserRouter>
<div className="App">
<Frame>
<Canvas />
<Header />
<Main />
<NavBar />
</Frame>
</div>
</BrowserRouter>
);
}
}
并且需要手动调用Art里面的函数:
this.props.hideHeader()
我也是 React 的新手,但遇到了这个问题。已接受答案的基于 react-router
的替代方法是使用 withRouter
,它包装您要隐藏的组件并为其提供 location
道具(以及其他)。
import { withRouter } from 'react-router-dom';
const ComponentToHide = (props) => {
const { location } = props;
if (location.pathname.match(/routeOnWhichToHideIt/)){
return null;
}
return (
<ComponentToHideContent/>
)
}
const ComponentThatHides = withRouter(ComponentToHide);
请注意来自 the docs 的警告:
withRouter does not subscribe to location changes like React Redux’s connect does for state changes. Instead, re-renders after location changes propagate out from the component. This means that withRouter does not re-render on route transitions unless its parent component re-renders.
尽管如此,这种方法似乎适用于与 OP 非常相似的用例。
从 React Router 5.1 开始有钩子 useLocation,它可以让你轻松访问当前位置。
import { useLocation } from 'react-router-dom'
function HeaderView() {
let location = useLocation();
console.log(location.pathname);
return <span>Path : {location.pathname}</span>
}
{location.pathname !== '/page-you-dont-want' && <YourComponent />}
这将检查路径名称,如果它不是您不希望组件出现的页面,则不会显示它,否则将显示它。