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

Router组件主要做的是通过BrowserRouter传过来的当前值,与Route通过props传进来的path对比,然后决定是否执行props传进来的render函数,react-router-dom是react的路由,它帮助我们在项目中实现单页面应用,它提供给我们两种路由一种基于hash段实现的。而且还经常会被xxx面试官问到,什么是前端路由,它的原理的是什么,它是怎么实现,跳转不刷新页面的…如果你在用本渣以上提供给你的环境,还要配置一下,下面👇这些东西,如果不是,请忽略。啊狗啊猫之类的东西代理。
摘要由CSDN通过智能技术生成

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

而且还经常会被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

现在所有东西都准备好了,我们可以进入主题了。参考React实战视频讲解:进入学习

原生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', onLoad)

window.addEventListener('hashchange', changeView)

let routeView = ''

function onLoad() {
   

    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=
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值