首页 > 其他分享 >经常被问到的react-router实现原理详解

经常被问到的react-router实现原理详解

时间:2023-03-01 16:22:24浏览次数:63  
标签:React return js react window 详解 props router

在单页面应用如日中天发展的过程中,备受关注的少了前端路由

而且还经常会被xxx面试官问到,什么是前端路由,它的原理的是什么,它是怎么实现,跳转不刷新页面的...

一大堆为什么,问你头都大,

前言

今天主要讲的是:

  • 原生js实现hashRouter
  • 原生js实现historyRouter
  • react-router-dom的BrowserRouter
  • react-router-dom的HistoryRouter

四种路由的实现原理。

环境问题

因为等一下要用到h5新增的pushState() 方法,因为这玩(diao)意(mao)太矫情了,不支持在本地的file协议运行,不然就会报以下错误

在这里插入图片描述

只可以在http(s)协议 运行,这个坑本渣也是踩了很久,踩怀疑自己的性别。

既然用file协议 不行那就只能用webpack搭个简陋坏境了,你也可以用阿帕奇,tomcat...啊狗啊猫之类的东西代理。

本渣用的是webpack环境,也方便等下讲解react-router-dom的两个路由的原理。环境的配置,我简单的贴一下,这里不讲。

npm i webpack webpack-cli babel-loader @babel-core @babel/preset-env html-webpack-plugin webpack-dev-server -D

webpack.config.js

const path = require('path')

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {

    entry:path.resolve(__dirname,'./index.js'),

    output:{

        filename:'[name].[hash:6].js',

        path:path.resolve(__dirname,'../dist')

    },

    module:{

        rules:[
            {
                test:/\.js$/,

                exclude:/node_module/,

                use:[
                    {
                        loader:'babel-loader',
                        options:{
                            presets:['@babel/preset-env']
                        }
                    }
                ]
            }
        ]

    },

    plugins:[
        new HtmlWebpackPlugin({
            template:path.resolve(__dirname,'./public/index.html'),
            filename:'index.html'
        })
    ]

}

package.json的script添加一条命令

    "dev":"webpack-dev-server --config ./src/webpack.config.js --open"

项目目录
在这里插入图片描述

运行

npm run dev

现在所有东西都准备好了,我们可以进入主题了。

原生js实现hashRouter

html

<ul>
    <li><a href='#/home'>home</a></li>
    <li><a href='#/about'>about</a></li>
    <div id="routeView"></div>
</ul>

js

window.addEventListener('DOMContentLoaded', onl oad)

window.addEventListener('hashchange', changeView)

let routeView = ''

function onl oad() {

    routeView = document.getElementById('routeView')

    changeView()

}

function changeView() {
    switch (location.hash) {
        case '#/home':
            routeView.innerHTML = 'home'
            break;
        case '#/about':
            routeView.innerHTML = 'about'
            break;
    }

}

原生js实现hashRouter主要是监听它的hashchange事件的变化,然后拿到对应的location.hash更新对应的视图

原生js实现historyRouter

html

<ul>
    <li><a href='/home'>home</a></li>
    <li><a href='/about'>about</a></li>
    <div id="routeView"></div>
</ul>

historyRoute

window.addEventListener('DOMContentLoaded', onl oad)

window.addEventListener('popstate', changeView)

let routeView = ''

function onl oad() {

    routeView = document.getElementById('routeView')

    changeView()

    let event = document.getElementsByTagName('ul')[0]

    event.addEventListener('click', (e) => {

        if(e.target.nodeName === 'A'){
            e.preventDefault()

            history.pushState(null, "", e.target.getAttribute('href'))

            changeView()
        }

    })
}

function changeView() {
    switch (location.pathname) {
        case '/home':
            routeView.innerHTML = 'home'
            break;
        case '/about':
            routeView.innerHTML = 'about'
            break;
    }

}

能够实现history路由跳转不刷新页面得益与H5提供的pushState(),replaceState()等方法,这些方法都是也可以改变路由状态(路径),但不作页面跳转,我们可以通过location.pathname来显示对应的视图

react-router-dom

react-router-dom是react的路由,它帮助我们在项目中实现单页面应用,它提供给我们两种路由一种基于hash段实现的HashRouter,一种基于H5Api实现的BrowserRouter

下面我们来简单用一下。

如果你在用本渣以上提供给你的环境,还要配置一下,下面

标签:React,return,js,react,window,详解,props,router
From: https://www.cnblogs.com/xiatianweidao/p/17168678.html

相关文章

  • linux的cgroups详解
    引子最近在研究k8s,学习到容器的一些知识。了解到docker的核心原理:利用linuxnamespace隔离资源;利用cgroups限制资源的使用;利用chroot改变进程的根目录到指定的目录;我来......
  • 2023-03-01 'react-natvie' 不是内部或外部命令,也不是可运行的程序 这个报错是因为你
    问题描述:想要初始化一个新的rn项目,执行【react-natvieinitmyApp--version0.68.2】,报错:'react-natvie'不是内部或外部命令,也不是可运行的程序原因:没有全局安装react-n......
  • 关于React-Router6 (React 路由)
    一、概要(1)每个单页应用其实是一系列的JS文件,当用户请求网站时,网站返回一整个(或一系列)的js文件和HTML,而当用户在某个页面内点击时,你需要告诉浏览器怎么加载另一个......
  • 霍夫曼编码详解
    本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:​​information-theory​​】,需要的朋友们自取。或者公众号【AI......
  • Vue,小程序开发技术详解
    目前应用最广的三大前端框架分别是Vue、React和Angular。其中,不管是BAT大厂,还是创业公司,Vue都有广泛的应用。如今,再随着移动开发小程序的蓬勃发展,Vue也广泛应用到了......
  • 以太坊中状态树(MPT树)详解
    概述以太坊中采用的是基于账户的模式,也就是说系统中显示记录着每个账户的当前状态信息。每个账户都是由一个160位的地址组成,对应的账户中的状态包含余额(balance)、交易次......
  • ddsrouter-3.开始
    1.项目概述DDS路由器是由eProsima开发的跨平台非图形化应用程序,由FastDDS提供支持,允许创建一个通信桥,连接两个DDS网络,否则将被隔离。DDS路由器的主要用途是通信两个物理......
  • (笔记)EtherCat报文格式详解
     说明:本文是从EtherCat初学者的角度来撰写的,详细介绍的其报文格式,特别是应用层与Canopen之间的关系。特别感谢:https://zhuanlan.zhihu.com/p/406428272?utm_id=0的贡献。......
  • 2023年排名Top 5的 React 延迟加载库!
    2023年排名Top5的React延迟加载库!原创2023-02-2406:20·高级前端进阶大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,......
  • ddsrouter-简介
    DDSRouter是一个最终用户软件应用程序,支持分布式DDS网络的连接。也就是说,部署在一个地理位置并使用专用本地网络的DDS实体(例如发布者和订户)将能够通过使用eProsimaDDS......