当前位置: 代码迷 >> 综合 >> 初识React——路由(Router)
  详细解决方案

初识React——路由(Router)

热度:60   发布时间:2024-02-22 22:56:36.0

目录

1、路由(Router)

1.1、路由模式

1.1.1、BrowserRouter

1.1.2、HashRouter

1.2、声明式路由导航

1.2.3、模糊匹配

1.2.4、多级路由

1.3、高阶组件

1.3.1、withRouter

1.4、路由进阶

1.4.1、监控路由变化

1.4.2、编程式导航

1.4.3、路由传参


1、路由(Router)

根据 url 的不同来切换对应的组件,实现 spa(单页面应用)在页面切换的时候不会刷新,更加接近原生体验。

1.1、路由模式

1.1.1、BrowserRouter

历史记录模式,没有#号,他是通过历史记录 api 来进行路由切换的,刷新会丢失,本地不会。

先在主页(index.js)中导入路由,由路由模式包裹根组件。

代码如下:

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {BrowsweRouter} from "react-router-dom"
ReactDOM.render(<BrowsweRouter><App /></BrowsweRouter>,document.getElementById('root')
);
serviceWorker.unregister();

在 App.js 中使用路由。

代码如下:

function App() {return (<div className="App"><Route path="/home" component={Home}/><Route path="/user" component={User}/></div>);
}
export default App;

1.1.2、HashRouter

hash 模式,带#号,刷新的时候页面不会丢失。只需要将导入的 BrowserRouter 修改为 BrowserRouter 即可。

1.2、声明式路由导航

当使用路由时不可能让用户自己到地址栏中去输入地址,因此使用点击链接的方式。

代码如下:

function App() {return (<div className="App"><div><Link to="/home">点我去home</Link><Link to="/user">点我去user</Link></div><Route path="/home" component={Home}/><Route path="/user" component={User}/></div>);
}
export default App;

和 Link 的用法一致,但会在组件中增加 class="active",而后可以自行对该 class 进行编辑,达到点击后样式的控制。

代码如下:

function App() {return (<div className="App"><div><NavLink to="/home">点我去home</NavLink><NavLink to="/user">点我去user</NavLink></div><Route path="/home" component={Home}/><Route path="/user" component={User}/></div>);
}
export default App;

1.2.3、模糊匹配

路由规则本质上是进行选择匹配,当匹配到多个时也就会显示多个,当设置 path 为 / 时,任意路径都能匹配,点击任意路径都会同时显示 / 所指向内容,如果加入 exact 属性,则会进行精准匹配,只会当路径为 / 时才会匹配。

代码如下:

function App() {return (<div className="App"><div><Link to="/home">点我去home</Link><Link to="/user">点我去user</Link></div><Route path="/" exact component={Home}/><Route path="/home" component={Home}/><Route path="/user" component={User}/></div>);
}
export default App;

当设置两个相同的路由时会多次渲染,为了避免这种问题,可以引用 switch。

代码如下:

function App() {return (<div className="App"><div><Link to="/home">点我去home</Link><Link to="/user">点我去user</Link></div><Switch><Route path="/" exact component={Home}/><Route path="/home" component={Home}/><Route path="/user" component={User}/></Switch></div>);
}
export default App;

1.2.4、多级路由

在路由跳转后的页面再加一个路由即可实现多级路由,再次点击可新增渲染。

1.3、高阶组件

参数是一个组件,返回的也是一个组件。

1.3.1、withRouter

让不是路由切换的组件具备路由切换组件的三个属性(location match history)。

代码如下:

function App(props) {console.log(props)return (<div className="App"><div><Link to="/home">点我去home</Link><Link to="/user">点我去user</Link></div><Switch><Route path="/home" component={Home}/><Route path="/home" component={Home}/><Route path="/user" component={User}/><Redirect from="/" to="/home" exact></Redirect></Switch></div>);
}
export default withRouter(App);

1.4、路由进阶

1.4.1、监控路由变化

代码如下:

function App(props) {props.history.listen((link)=>{console.log(link)})return (<div className="App"><div><Link to="/home">点我去home</Link><Link to="/user">点我去user</Link></div><Switch><Route path="/home" component={Home}/><Route path="/home" component={Home}/><Route path="/user" component={User}/><Redirect from="/" to="/home" exact></Redirect></Switch></div>);
}
export default withRouter(App);

1.4.2、编程式导航

代码如下:

function App(props) {props.history.listen((link)=>{console.log(link)})return (<div className="App"><button onClick={()=>{props.history.push("/home")}}>点我去home</button></div>);
}
export default withRouter(App);

1.4.3、路由传参

params 方式进行传参

  • 需要在路由规则中设置传递的接受参数
  • 发送参数,直接在跳转路径后进行编写
  • 接受props.match.params.参数名

优势:刷新地址,参数依然存在

缺点:只能传递字符串,并且参数过多时url会变得丑陋。

代码如下:

function App(props) {props.history.listen((link)=>{console.log(link)})return (<div className="App"><div><Link to="/home/我是参数">点我去home</Link><Link to="/user">点我去user</Link></div><Switch><Route path="/home/:id" component={Home}/><Route path="/user" component={User}/><Redirect from="/" to="/home" exact></Redirect></Switch></div>);
}
export default withRouter(App);

而后在 Home.js 中接受参数即可。

代码如下:

export default class Home extends Component{componentDidMount(){console.log(this.props.match.params.id)}
}

query 方式进行传参

  • 不需要在路由规则中进行传递参数的配置
  • 直接发送数据
  • 使用 this.props.location.query.xxx

代码如下:

function App(props) {props.history.listen((link)=>{console.log(link)})return (<div className="App"><div><Link to={
   {pathname:"/user",query:{name:"小明"}}}>点我去user</Link></div><Route path="/user" component={User}/></div>);
}
export default withRouter(App);

而后在 User.js 中接受参数即可。

代码如下:


export default class Phone extends Component{componentDidMount(){console.log(this.props.location.query.name)}
}

 

  相关解决方案