React路由器的确切属性不起作用



react router中exact属性的目的是,不要对路由进行部分匹配。但是,就我而言,这并不奏效。

我有两个分量Write an articleView a particular article with id。我将两者的路线定义为:

<Route exact path='/article/write' exact component={ArticleOrBlog}/>   
<Route exact  path='/article/:id'  component={ArticleOne}></Route> 

两条路由都具有exact属性。预期的行为是,当ArticleOrBlog组件渲染时,ArticleOne必须不渲染,反之亦然。

这里的问题是一致的

ArticleOne组件渲染时,ArticleOrBlog组件不渲染,但是当ArticleOrBlog组件渲染时ArticleOne组件也在渲染。ArticleOne组件正在ArticleOrBlog组件下方渲染。

此处行为发生变化

当我定义路线时,比如:

<Route exact path='/write' exact component={ArticleOrBlog}/>   
<Route exact  path='/article/:id'  component={ArticleOne}></Route> 
<Route exact path='/write/anything' exact component={ArticleOrBlog}/>   
<Route exact  path='/article/:id'  component={ArticleOne}></Route> 

那么它工作得很好。

当ArticleOrBlog组件渲染时,ArticleOne组件同时呈现

ArticleOne组件也进行渲染的原因是,路由中有一个动态参数:id,它与任何内容都匹配,包括/article/write中的'write'

exact道具并没有阻止react路由器渲染所有匹配的路由;它只确保只渲染完全匹配的路由。

因此,当路由为/article/write时,它匹配两个确切的路径:

  • /article/write
  • /article/:id

因此渲染两个组件而不是仅渲染一个组件。

当您将路由更改为/write/article/:id时,它会按预期工作,因为现在/article/:id/write完全不同。

解决方案:

使用Switch组件,确保只渲染第一个匹配的路由。

<Switch>
<Route exact path="/article/write" component={ArticleOrBlog} />
<Route exact path="/article/:id" component={ArticleOne} />
</Switch>

这里需要记住的一点是,当使用如上所示的Switch时,定义Route组件的顺序很重要。

在您的情况下,路径/article/writeRoute应在路径/article/:idRoute之前定义。这是因为如果在/article/write之前定义了/article/:id,那么由于动态参数:id/article/write将与/article/:id路径匹配,并且由于Switch/article/write路径处的组件将永远不会被渲染。

相关内容

  • 没有找到相关文章

最新更新