react-router 中 exact 精确匹配使用

应用场景

exact 需要在哪种场景使用

1. 当要匹配路由样式 比如要匹配 to=“/” 但当跳转到其他路由时  to=“/”路由到样式还是存在,因为路由匹配是模糊的 所以要精确匹配 to=“/”路由时候需要加个 exact 来达到精确匹配的目的

2. 当 父路由为 to=“/about” 时候  嵌套的子路由也有 一个为 to=“/about” 但还有其它的子路由 分别是 to=“/about/user”  to=“/about/message”  

  这时候子路由需要一种样式,父路由也需要一种样式,但是其中一个子路由和父路由一样,这是要想将此路由样式生效就需要用到 exact 来进行精确匹配

 

这里主要讲第二种匹配

如图:

     

 

 

 

 

 

代码 (父路由)

     /about 路由不能精确匹配

  如果 父路由 /about 进行精确匹配 那么当点击子路由时候 父路由样式将会失效

<div className="App">
  <NavLink exact to="/" activeClassName="link-active">首页</NavLink>
  <NavLink to="/about" activeClassName="link-active">关于</NavLink>
  <NavLink to="/profile" activeClassName="link-active">我的</NavLink>
  <NavLink to="/user" activeClassName="link-active">用户</NavLink>
  <hr/>
 // 匹配父路由所显示的信息 <Switch> <Route exact path="/" component={Home}></Route> <Route path="/about" component={About}></Route> <Route path="/profile" component={About}></Route> <Route path="/user" component={About}></Route> </Switch> </div>

// 下面代码展示 about 子路由 进行 精确匹配

<div>
      <h2>my/我的</h2>
      <NavLink exact to="/about" activeClassName="about-active">信息</NavLink>
      <NavLink exact to="/about/user" activeClassName="about-active">用户</NavLink>
      <hr/>
      <Route path="/about" exact>
        个人信息
      </Route>
      <Route path="/about/user">
        用户名称
      </Route>
</div>

 

完整代码

目录

    

index.js

import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
import {BrowserRouter} from 'react-router-dom'

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
, document.getElementById("root"));

App.js

import React from "react";
import { NavLink, Switch, Route, withRouter} from "react-router-dom";

import Home from "./components/home";
import About from "./components/about";

import './app.css'

function App() {
  return (
    <div className="App">
      <NavLink exact to="/" activeClassName="link-active">首页</NavLink>
      <NavLink exact to="/about" activeClassName="link-active">关于</NavLink>
      <NavLink to="/profile" activeClassName="link-active">我的</NavLink>
      <NavLink to="/user" activeClassName="link-active">用户</NavLink>
      <hr/>
      <Switch>
        <Route exact path="/" component={Home}></Route>
        <Route path="/about" component={About}></Route>
        <Route path="/profile" component={About}></Route>
        <Route path="/user" component={About}></Route>
      </Switch>
    </div>
  );
}

export default withRouter(App);

app.css

a {
  margin: 0 10px;
}

a.active, a.link-active {
  color: red;
  font-size: 30px;
}

a.about-active {
  color: orange;
  font-size: 20px;
}

about.js

import React, { PureComponent } from 'react';
import { NavLink, Route } from 'react-router-dom';

class My extends PureComponent {
  state = {  }
  render() { 
    return ( 
    <div>
      <h2>我是about</h2>
      <NavLink exact to="/about" activeClassName="about-active">信息</NavLink>
      <NavLink exact to="/about/user" activeClassName="about-active">用户</NavLink>
      <hr/>
      <Route path="/about" exact>
        个人信息
      </Route>
      <Route path="/about/user">
        用户名称
      </Route>
    </div> );
  }
}
 
export default My;

// home.js    profile.js   user.js   这几个组件自己随便写,这里主要代码在 App.js 和 about.js  里

 

posted @ 2020-07-25 23:27  林中有风  阅读(2611)  评论(0编辑  收藏  举报