react-31-路由配置-重定向-404-嵌套路由

简介: 路由 是中大型项目不可或缺的先做一些准备工作2个界面组件 ,便于路由跳转熟悉一下路由基础

1.前言


路由 是中大型项目不可或缺的

先做一些准备工作2个界面组件 ,便于路由跳转

熟悉一下路由基础


2. 城市组件


/src/pages/cities/index.js

写标签的 需要先写出 左半边   < 然后敲完标签 会自动生成 另外一半


import React, { Component } from 'react'
export default class index extends Component {
    render() {
        return (
            <div>
                <h1>城市列表</h1>
            </div>
        )
    }
}



3. 搜索界面


/src/pages/citySearch/index.js


import React, { Component } from 'react'
export default class index extends Component {
    render() {
        return (
            <div>
                <h1> 城市搜索</h1>
            </div>
        )
    }
}



4. 路由依赖安装



npm i react-router-dom -S



5. 路由引用


App.js 全局使用


import RouterComponent from "./pages/router"
function App() {
  return (
    <div className="App">
    <RouterComponent></RouterComponent>
</div>
  );
}
export default App;



6. 路由配置


参考vue的配置

pages/router/index.js

}LTO%L_MBOJ}U}NSMDT25~I.png

1.png

Router作为 BrowserRouter  的别名 从 react-router-dom 引入 BrowserRouter 是对路由配置的 容器 不能省


7. 匹配  ---path


7.1 path属性设置

Route 我习惯写成 单标签闭合标签     < 然后敲完标签后,再敲个 / 就不会 生成 另外的结束标签了


<Router>
                <Route path="/" component={CityComponent}  />
                <Route  path="/search" component={CitySearchComponet} />
            </Router>

问题效果

C{(UMO6H0487FZG82`%%Z3U.png

1.gif

/ 根路径默认匹配所有,所以/search会匹配2个,显示2个

/search/a/search/assss/sfaf 都能匹配上, 因为默认是模糊匹配


7.2 精确匹配  exact

exact 设置


return (
        <div>
            <Router>
                <Route  exact path="/" component={CityComponent} />
                <Route exact path="/search" component={CitySearchComponet}  />
            </Router>
        </div>
    )

精确匹配 只有 / 才能匹配

只有一级/search才能匹配 后面再加 2级,3级都匹配不上了


8.404组件


pages/404/index.js

Link 来源于路由依赖 类似 Vuerouter-link,写法以一样,只是标签名不一样而已,to的值是想要跳转的,路由的,对应的path


import React, { Component } from 'react';
import {
    Link  } from "react-router-dom"
export default class Component404 extends Component {
    render() {
        return (
            <div>
                <h1> 404  <Link to="/">   首页 </link>  </h1>
            </div>
        )
    }
}



9. 404路由配置


因为404 是都匹配不到 才走404 的,所以放到路由配置的末尾

不需要写 path属性


return (
        <div>
            <Router>
                <Route  exact path="/" component={CityComponent} />
                <Route exact path="/search" component={CitySearchComponet} />
                <Route component={Component404 }/>
            </Router>
        </div>
    )


问题

EZ4J9G6AILDDWI_(W(92EPV.png



10. switch 解决问题


因为 404组件没写path 所以都能匹配上,

但我们是想要所有的路由 只匹配一个就行了, 所以需要引入一个

Switch 组件

10.1 引入


import {
    BrowserRouter as Router,
    Route,
    Switch,
    Redirect,
    withRouter,
    Link,
    NavLink
} from "react-router-dom";


10.2 使用Switch

Switch 注意大写 包裹着 所有的路由


return (
        <div>
            <Router>
                <Switch>
                    <Route  exact path="/" component={CityComponent} />
                    <Route exact path="/search" component={CitySearchComponet} />
                    <Route component={Component404 }/>
                </Switch>
            </Router>
        </div>
    )

效果就不在贴图了,要不然图片太多了


11. 重定向 Redirect


Redirect来源于  路由依赖具名导入


<Redirect from="/home" to ="/" />

from 从哪个路由 跳转 ,也就是哪个路由需要重定向

上面的 地址栏 输入 /home 会重定向到 /


12.withRouter


非页面组件想拥有router功能

withRouter 来源于 路由依赖的具名导入

12.1 核心代码


class Swiper extends Component {
    render() {
        console.log("轮播图", this.props)
        return (
            <div>
                <button onClick={() => { this.props.history.goBack() }}>返回</button>
                <h1>轮播图</h1>
            </div>
        )
    }
}
// 将路由注入 Swiper
Swiper = withRouter(Swiper)


12.2编程式导航

类似vue里面的导航

NFH9]V8(I%`8O5V@I[GV@02.png

1.png


history里面 JS的相关API都有,所以可以自由操作


13. 非页面组件路由配置


像路由一样使用就行


<Route component={Swiper }/>



14.嵌套路由


嵌套路由  顶层路由不要加 exact


{/* 嵌套路由  顶层路由不要加 exact!!!!*/}
<Router>
                <Switch>
<Route  exact path="/" component={CityComponent} />
                    <Route exact path="/search" component={CitySearchComponet} />
                    <Route  path="/home" render={() => {
                        return (
                            <HomeComponent>
                                <Route exact path="/home/wx" component={WxComponent} />
                                <Route exact path="/home/my" component={MyComponent} />
                                <Route exact path="/home/fd" component={FdComponent} />
                                <Route exact path="/home/ad" component={AdComponent} />
                            </HomeComponent>
                        )
                    }}>
                    </Route>
                    <Route component={Component404 }/>
    </Switch>
</Router>



15. 嵌套路由出口


子路由是在HomeComponent里面所以出口也在HomeComponent 里面

出口直接是{this.props.children} 占位 和 vue 类似


class HomeComponent extends Component {
    render() {
        return (
            <div>
                {/* vue里面这样写 <router-view /> */}
                {/* 占位标志 */}
                {this.props.children}
                <div className={styles.tabBar}>
                  <ul>
                    <li>
                      <NavLink to="/home/wx" activeClassName={styles.selected}>
                        <i className="myFont">&#xe70b;</i>
                        <p>微信</p>
                      </NavLink>
                    </li>
                    <li>
                      < NavLink to = "/home/my"
                      activeClassName = {
                        styles.selected
                      } >
                        <i className="myFont">&#xe607;</i>
                        <p>我的</p>
                      </NavLink>
                    </li>
                    <li>
                      <NavLink to="/home/fd" activeClassName={styles.selected}>
                        <i className="myFont">&#xe629;</i>
                        <p>朋友圈</p>
                      </NavLink>
                    </li>
                    <li>
                      <NavLink to="/home/ad" activeClassName={styles.selected}>
                        <i className="myFont">&#xe652;</i>
                        <p>通讯录</p>
                      </NavLink>
                    </li>
                  </ul>
               </div> 
            </div>
        );
    }
}



16. iconfont


这里引用了 阿里妈妈的图标库,我是使用在线的

G2USR35E$YJ~TLN4V70_XJD.png

完全可以自己在 assets/ 下面放 图标相关的文件




相关文章
|
5天前
create-react-app配置环境变量
create-react-app配置环境变量
82 0
|
5天前
|
前端开发 JavaScript
React和Vue实现路由懒加载
React和Vue实现路由懒加载
37 2
|
5天前
|
前端开发
如何使用react-router v6快速搭建路由?
如何使用react-router v6快速搭建路由?
60 0
|
5天前
|
资源调度 前端开发 JavaScript
React 的antd-mobile 组件库,嵌套路由
React 的antd-mobile 组件库,嵌套路由
48 0
|
5天前
|
前端开发 数据可视化 API
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(二)
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏
39 0
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(二)
|
5天前
|
前端开发 JavaScript CDN
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏(一)
前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏
35 0
|
5天前
|
前端开发 Android开发 iOS开发
应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
【2月更文挑战第31天】应用研发平台EMAS使用 aliyun-react-native-push 库接入推送和辅助通道,推送都可以收到,但是在App切到后台或者杀掉进程之后就收不到推送了,是需要配置什么吗?
34 2
|
5天前
|
前端开发 中间件 数据安全/隐私保护
React路由进阶方法
React路由进阶方法
29 1
|
5天前
|
JavaScript 前端开发 网络安全
vue与react路由拦截
vue与react路由拦截
31 4
|
9月前
|
前端开发
前端学习笔记202305学习笔记第二十九天-React keep alive原理之2
前端学习笔记202305学习笔记第二十九天-React keep alive原理之2
42 0

热门文章

最新文章