react router中exact
属性的目的是,不要对路由进行部分匹配。但是,就我而言,这并不奏效。
我有两个分量Write an article
和View 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/write
的Route
应在路径/article/:id
的Route
之前定义。这是因为如果在/article/write
之前定义了/article/:id
,那么由于动态参数:id
,/article/write
将与/article/:id
路径匹配,并且由于Switch
,/article/write
路径处的组件将永远不会被渲染。