React(8)

news/2024/7/15 19:20:14 标签: react.js, javascript, 前端

千锋学习视频https://www.bilibili.com/video/BV1dP4y1c7qd?p=72&spm_id_from=pageDriver&vd_source=f07a5c4baae42e64ab4bebdd9f3cd1b3

1.React 路由

1.1 什么是路由?

        路由是根据不同的 url 地址展示不同的内容或页面。 

        一个针对React而设计的路由解决方案、可以友好的帮你解决React components 到URl之间的同步映射关系。

1.2 路由安装

npm i react-router-dom@5

1.3 路由使用

javascript">import React, { Component } from 'react'
import {HashRouter,Route} from 'react-router-dom'
import Film from './views/Film'
import Cinemas from './views/Cinemas'
import Center from './views/Center'



export default class componentName extends Component {
    render() {
        return (
            <div>
                 <HashRouter>  
                    <Route path="/films" component={Film}></Route>
                    <Route path="/cinemas" component={Cinemas}></Route>
                    <Route path="/Center" component={Center}></Route>
                </HashRouter> 
            </div>
        )
    }
}

  <HashRouter> 会让路径带上一个/#

也可以把路由封装成一个组件抽离出去

javascript">
import React, { Component } from 'react'

import MyRouter from './MyRouter'
// import Film from './views/Film'
// import Cinemas from './views/Cinemas'
// import Center from './views/Center'



export default class componentName extends Component {
    render() {
        return (
            <div>
                {/* <HashRouter>  也可以把路由封装成一个组件抽离出去
                    <Route path="/films" component={Film}></Route>
                    <Route path="/cinemas" component={Cinemas}></Route>
                    <Route path="/Center" component={Center}></Route>
                </HashRouter> */}
                <MyRouter></MyRouter>
        
            </div>
        )
    }
}

javascript">
import React, { Component } from 'react'
import {HashRouter,Route} from 'react-router-dom'
import Film from './views/Film'
import Cinemas from './views/Cinemas'
import Center from './views/Center'

export default class MyRouter extends Component {
    render() {
        return (
            <div>
                 <HashRouter>  
                    <Route path="/films" component={Film}></Route>
                    <Route path="/cinemas" component={Cinemas}></Route>
                    <Route path="/Center" component={Center}></Route>
                </HashRouter>
            </div>
        )
    }
}

1.4 路由重定向

如果没有匹配的路径,需要跳转到指定的路径  使用<Redirect  from=""  to="" />

javascript">
import React, { Component } from 'react'
import {HashRouter,Route,Redirect,Switch} from 'react-router-dom'
import Film from './views/Film'
import Cinemas from './views/Cinemas'
import Center from './views/Center'

export default class MyRouter extends Component {
    render() {
        return (
            <div>
                 <HashRouter>  
                    <Route path="/films" component={Film}></Route>
                    <Route path="/cinemas" component={Cinemas}></Route>
                    <Route path="/Center" component={Center}></Route>
                    {/* 匹配/路径的时候 模糊匹配  跳转到/films */}
                    <Redirect from="/" to="/films"></Redirect>
                    
                </HashRouter>
            </div>
        )
    }
}

 但是这个做法存在问题:当输入http://localhost:3000/#/center 会跳到center 但再次刷新又会跳到/films 

改进:使用Switch   匹配一次后将不再继续匹配

javascript">
import React, { Component } from 'react'
import { HashRouter, Route, Redirect, Switch } from 'react-router-dom'
import Film from './views/Film'
import Cinemas from './views/Cinemas'
import Center from './views/Center'

export default class MyRouter extends Component {
    render() {
        return (
            <div>
                <HashRouter>
                    <Switch>
                        <Route path="/films" component={Film}></Route>
                        <Route path="/cinemas" component={Cinemas}></Route>
                        <Route path="/Center" component={Center}></Route>
                        {/* 匹配/路径的时候  跳转到/films */}
                        <Redirect from="/" to="/films"></Redirect>
                    </Switch>
                </HashRouter>
            </div>
        )
    }
}

精准匹配exact

场景:/ 跳转到/films  其他不匹配上述路由的跳转到404

javascript">
import React, { Component } from 'react'
import { HashRouter, Route, Redirect, Switch } from 'react-router-dom'
import Film from './views/Film'
import Cinemas from './views/Cinemas'
import Center from './views/Center'
import NotFound from './views/NotFound'

export default class MyRouter extends Component {
    render() {
        return (
            <div>
                <HashRouter>
                    <Switch>
                        <Route path="/films" component={Film}></Route>
                        <Route path="/cinemas" component={Cinemas}></Route>
                        <Route path="/Center" component={Center}></Route>
                        {/* 匹配/路径的时候  跳转到/films */}
                        <Redirect from="/" to="/films" exact></Redirect>
                        
                        <Route component={NotFound}></Route>
                    </Switch>
                </HashRouter>
            </div>
        )
    }
}

javascript">import React, { Component } from 'react'

export default class NotFound extends Component {
    render() {
        return (
            <div>
                404 Not Found
            </div>
        )
    }
}

注意:exact 精确匹配 (Redirect 即使使用了exact, 外面还要嵌套Switch 来用)

1.5 嵌套路由

MyRouter组件中的路由保持不变   当/film模糊匹配到后会进入Film组件

以下代码在Film组件中写即可

javascript"><Switch>
    <Route path="/films/nowplaying" component={Nowplaying}/>
    <Route path="/films/comingsoon" component={Comingsoon}/>
    <Redirect from="/films" to="/films/nowplaying"/>
</Switch>

1.6 路由跳转方式

1.声明式导航

 

javascript">import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'

export default class Navbar extends Component {
    render() {
        return (
            <div>
                <li><NavLink to="/films">电影</NavLink></li>
                <li><NavLink to="/cinemas">影院</NavLink></li>
                <li><NavLink to="/center">我的</NavLink></li>

            </div>
        )
    }
}

意思是可以监听到地址  如果是/center会给我的这个a标签给加上class="active"的属性,

也可以自定义属性,方便设置css高亮显示

javascript">  <li><NavLink to="/films" activeClassName="Navbaractive">电影</NavLink></li>
  <li><NavLink to="/cinemas" activeClassName="Navbaractive">影院</NavLink></li>
  <li><NavLink to="/center" activeClassName="Navbaractive">我的</NavLink></li>

2.编程式导航

javascript">this.props.history.push(`/center`)

或者导入useHistory

javascript">import {useHistory} from 'react-router-dom'

const history =useHistory()

history.push(`/detail`)

 


http://www.niftyadmin.cn/n/4960368.html

相关文章

WPS右键新建没有docx pptx xlsx 修复

解决wps右键没有新建文档的问题 右键没有新建PPT和Excel 1 wps自带的修复直接修复没有用 以上不管咋修复都没用 2 先编辑注册表 找到 HKEY_CLASSES_ROOT CTRLF搜文件扩展名 pptx docx xlsx 新建字符串 三种扩展名都一样操作 注册表编辑之后再次使用wps修复 注册组件&am…

机器人TF坐标系变换与一些可视化工具的应用

TF坐标在ROS中是一个非常重要的概念&#xff0c;因为机器人在做日常操作任务的时候&#xff0c;对于其所在位置和朝向是需要时刻知道的&#xff0c;而机器人是由很多节点组成的协同任务&#xff0c;对于每个部件&#xff0c;我们需要知道它的位姿(位置和朝向)&#xff0c;这使得…

【工具】VirtualBox虚拟机安装Windows操作系统

前面的文章中介绍了VirtualBox虚拟机的安装,VirtualBox虚拟机中如何安装操作系统,是本文的重点,下面将进行详细介绍。 使用VirtualBox虚拟机安装Windows操作系统有很多好处,主要包括以下几点: 节省资源:通过虚拟化技术,一台物理计算机可以同时运行多个虚拟机,每个虚拟…

a元素使用

a元素 超链接元素&#xff0c;href属性中指定的网址如果不是以https或者http开头的&#xff0c;那么都是一个相对网址&#xff0c;他的绝对路径目录是当前网址的绝对路径的目录部分 href – hyper(超级的) reference(引用) – 跳转地址&#xff0c;他可以跳转如下几个位置&…

electron+vue3全家桶+vite项目搭建【16.1】electron多窗口,pinia状态同步,扩展store方法,主动同步pinia的状态【推荐】

文章目录 引入实现效果如下实现步骤1.自定义pinia插件2.主进程补充同步处理 引入 demo项目地址 我们之前写了一个自动同步pinia状态的插件&#xff0c;可以参考如下文章 electronvue3全家桶vite项目搭建【16】electron多窗口&#xff0c;pinia状态无法同步更新问题解决 这里…

Vue3 用父子组件通信实现页面页签功能

一、大概流程 二、用到的Vue3知识 1、组件通信 &#xff08;1&#xff09;父给子 在vue3中父组件给子组件传值用到绑定和props 因为页签的数组要放在父页面中&#xff0c; data(){return {tabs: []}}, 所以顶部栏需要向父页面获取页签数组 先在页签页面中定义props用来接…

前端面试:【事件处理】探索事件流、委托与事件对象

嗨&#xff0c;亲爱的事件探险家&#xff01;在JavaScript的世界中&#xff0c;事件处理是与用户互动的关键。本文将带你探索事件流、事件委托、常见事件类型和事件对象&#xff0c;这些知识将帮助你成为事件处理的大师。 2. 事件流&#xff1a;事件的旅程 事件流描述了事件从…

BLE4.2 ch582 TMOS使用

需要注意的是&#xff0c;TMOS&#xff08;任务管理系统&#xff09;的时基是625us。每个Take任务最多能有15个事件&#xff1b; 创建一个TMOS任务,需要分五步&#xff1a; 1.创建任务TakeID static uint8_t LEDTaskId INVALID_TASK_ID;2.定义一个事件标志 #define LEDTas…