如何制作自己的原生JavaScript路由

这里为大家详细讲解一下如何制作自己的原生JavaScript路由。

什么是JavaScript路由

JavaScript路由是一种通过JavaScript对页面URL进行控制的技术,它可以实现局部刷新,无需完全刷新页面即可展示新的内容,并且可以通过状态管理实现前端路由系统。

如何制作自己的JavaScript路由

步骤如下:

1. 创建HTML页面

我们以一个简单的单页面应用为例,创建一个HTML页面作为路由的载体。在HTML页面中,我们可以根据自己的需求定义不同的页头、页脚、导航栏等元素。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Router App</title>
</head>
<body>
    <nav>
        <a href="#/">Home</a>
        <a href="#/about">About</a>
        <a href="#/contact">Contact</a>
    </nav>
    <div id="content">
        <h1>Welcome Home!</h1>
        <p>Content will load here...</p>
    </div>
</body>
</html>

2. 实现路由逻辑

为了实现JavaScript路由,我们需要监听window对象的hashchange事件。当URL中的哈希值发生变化时,我们就可以通过自定义的路由规则来决定显示哪个页面。比如我们可以定义一个名为router的函数,来控制路由:

function router() {
    let hash = window.location.hash.substr(1);
    if (hash === "") {
        document.getElementById("content").innerHTML = "<h1>Welcome Home!</h1><p>Content will load here...</p>";
    } else if (hash === "about") {
        document.getElementById("content").innerHTML = "<h1>About Us</h1><p>We are a team of developers...</p>";
    } else if (hash === "contact") {
        document.getElementById("content").innerHTML = "<h1>Contact Us</h1><p>You can send us an email...</p>";
    } else {
        document.getElementById("content").innerHTML = "<h1>Page Not Found</h1><p>The page you requested was not found...</p>";
    }
}

window.addEventListener("hashchange", router);
router();

这个函数的作用是根据不同的哈希值,决定页面显示的内容。在这个示例中,我们根据哈希值的不同,来显示不同的静态页面。

3. 处理路由参数

如果我们想要传递一些参数,比如说我们想让/about页面根据用户不同的参数来动态显示不同的内容,那应该怎么处理呢?

一个常见的方法是在哈希值中使用动态参数,例如#about/:id。这里的id就是参数,我们可以用正则表达式来提取它,然后根据这个参数来显示不同的内容。

function extractParams(template, request) {
    const params = {}; 
    const res = template.exec(request);
    if (res) {
        for (let i = 1; res[i]; i++) {
            params[res[i].split('=')[0]] = res[i].split('=')[1];
        }
    }
    return params;
}

function router() {
    let hash = window.location.hash.substr(1);
    let params = extractParams(/about\/(\w+)/.exec(hash), hash);
    if (hash === "") {
        document.getElementById("content").innerHTML = "<h1>Welcome Home!</h1><p>Content will load here...</p>";
    } else if (hash === "about") {
        if (params && params.id) {
            document.getElementById("content").innerHTML = "<h1>About Us</h1><p>Showing content for user " + params.id + "</p>";
        } else {
            document.getElementById("content").innerHTML = "<h1>About Us</h1><p>We are a team of developers...</p>";
        }
    } else if (hash === "contact") {
        document.getElementById("content").innerHTML = "<h1>Contact Us</h1><p>You can send us an email...</p>";
    } else {
        document.getElementById("content").innerHTML = "<h1>Page Not Found</h1><p>The page you requested was not found...</p>";
    }
}

window.addEventListener("hashchange", router);
router();

在这个示例中,我们定义了一个extractParams函数,用于提取哈希值中的参数。然后在router函数中,我们根据提取到的参数来动态显示不同的内容。

示例

以上是制作自己的JavaScript路由的具体过程,下面我为大家提供两个适用示例。

1. 基本的SPA应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Router App</title>
</head>
<body>
    <nav>
        <a href="#/">Home</a>
        <a href="#/about">About</a>
        <a href="#/contact">Contact</a>
    </nav>
    <div id="content">
        <h1>Welcome Home!</h1>
        <p>Content will load here...</p>
    </div>
    <script>
        function router() {
            let hash = window.location.hash.substr(1);
            if (hash === "") {
                document.getElementById("content").innerHTML = "<h1>Welcome Home!</h1><p>Content will load here...</p>";
            } else if (hash === "about") {
                document.getElementById("content").innerHTML = "<h1>About Us</h1><p>We are a team of developers...</p>";
            } else if (hash === "contact") {
                document.getElementById("content").innerHTML = "<h1>Contact Us</h1><p>You can send us an email...</p>";
            } else {
                document.getElementById("content").innerHTML = "<h1>Page Not Found</h1><p>The page you requested was not found...</p>";
            }
        }

        window.addEventListener("hashchange", router);
        router();
    </script>
</body>
</html>

2. 处理动态路由参数的应用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Router App</title>
</head>
<body>
    <nav>
        <a href="#/">Home</a>
        <a href="#/about">About</a>
        <a href="#/about/123456">About User #123456</a>
        <a href="#/contact">Contact</a>
    </nav>
    <div id="content">
        <h1>Welcome Home!</h1>
        <p>Content will load here...</p>
    </div>
    <script>
        function extractParams(template, request) {
            const params = {}; 
            const res = template.exec(request);
            if (res) {
                for (let i = 1; res[i]; i++) {
                    params[res[i].split('=')[0]] = res[i].split('=')[1];
                }
            }
            return params;
        }

        function router() {
            let hash = window.location.hash.substr(1);
            let params = extractParams(/about\/(\w+)/.exec(hash), hash);
            if (hash === "") {
                document.getElementById("content").innerHTML = "<h1>Welcome Home!</h1><p>Content will load here...</p>";
            } else if (hash === "about") {
                if (params && params.id) {
                    document.getElementById("content").innerHTML = "<h1>About Us</h1><p>Showing content for user " + params.id + "</p>";
                } else {
                    document.getElementById("content").innerHTML = "<h1>About Us</h1><p>We are a team of developers...</p>";
                }
            } else if (hash === "contact") {
                document.getElementById("content").innerHTML = "<h1>Contact Us</h1><p>You can send us an email...</p>";
            } else {
                document.getElementById("content").innerHTML = "<h1>Page Not Found</h1><p>The page you requested was not found...</p>";
            }
        }

        window.addEventListener("hashchange", router);
        router();
    </script>
</body>
</html>

以上就是制作自己的JavaScript路由的完整攻略,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何制作自己的原生JavaScript路由 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • 解决拦截器对ajax请求的拦截实例详解

    解决拦截器对ajax请求的拦截实例详解 在使用拦截器的过程中,我们可能会发现拦截器会对ajax请求进行拦截,导致请求无法正常发送。解决这个问题,我们可以在拦截器中对ajax请求进行特殊处理,使其顺利通过。 首先,我们可以在请求前判断当前请求是否是ajax请求,如果是,则向请求头中添加一个特殊参数,如下所示: import axios from ‘axios’…

    JavaScript 2023年6月11日
    00
  • Vue nextTick的原理解析

    Vue.js中的nextTick方法是一个非常有用又有些神秘的工具。其背后的原理和使用方式值得我们深入探究和理解,使我们能够更好地使用Vue.js,写出更加优秀的代码。 什么是nextTick? 在Vue.js中,当我们修改了一个数据后,DOM并不会立刻更新。相反,Vue.js会在内部异步的更新DOM。这种异步更新意味着我们不能马上获取到更新后的DOM,这对…

    JavaScript 2023年6月11日
    00
  • vscode中vue-cli项目es-lint的配置方法

    下面是详细讲解“vscode中vue-cli项目es-lint的配置方法”的完整攻略: 1. 安装ESLint 首先请确保你的vscode里已经安装了 ESLint 插件,如果没有安装可以在插件市场中搜索并进行安装。ESLint 是 Javascript 的语法规范,可以用于代码的静态检查,还可以进行代码风格的约束。ESLint还支持vue、react等框架…

    JavaScript 2023年6月11日
    00
  • JavaScript 中的输出数据多种方式

    JavaScript 中的输出数据多种方式,下面介绍几种常用方式: console.log() console.log() 是在浏览器控制台输出信息的最常用方式之一,可以输出字符串、数字、布尔值等,也可以输出对象或数组。示例如下: console.log(‘Hello, World!’); // 输出字符串 console.log(123); // 输出数字…

    JavaScript 2023年5月28日
    00
  • axios拦截器、ElementUI组件的使用方法

    axios拦截器使用方法 1. 安装Axios Axios是一个基于Promise的HTTP库,可以在浏览器和Node.js中使用。安装Axios,请在命令行输入以下命令: npm install axios 2. 添加拦截器 可以使用Axios的拦截器来在请求或响应被处理前拦截它们。 以下是一个示例,向请求头中添加Authorization: import…

    JavaScript 2023年6月10日
    00
  • 异步动态加载js与css文件的js代码

    异步动态加载JS与CSS文件的JS代码是一个常见的优化Web性能的技巧,可以提升用户的访问体验,减少网站的加载时间。 以下是实现异步动态加载JS与CSS文件的JS代码的完整攻略: 第一步:创建一个函数 首先,需要创建一个函数来加载JS与CSS文件。这个函数应该包含两个参数,第一个参数是文件的路径,第二个参数是文件的类型(即JS或CSS)。 function …

    JavaScript 2023年5月27日
    00
  • 详解堆的javascript实现方法

    详解堆的javascript实现方法 堆的定义 堆是一种特殊的树形数据结构,其每一个节点都有一个值,通常所表达的语义是“子节点的值都不小于(或都不大于)父节点的值”。堆可以用数组或者树形表示。堆的某个节点与其子节点之间还有一定的大小关系,因此堆又分为最大堆和最小堆。 堆的属性 最大堆:对于所有节点i的值均不小于它的子节点的值,根节点为最大值; 最小堆:对于所…

    JavaScript 2023年6月10日
    00
  • JS实现将数字金额转换为大写人民币汉字的方法

    下面是JS实现将数字金额转换为大写人民币汉字的方法的完整攻略。 1. 需求分析 首先,我们需要明确我们的需求是将数字金额转换为大写人民币汉字格式,例如将12345.67转换为“壹万贰仟叁佰肆拾伍元陆角柒分”。 2. 算法思路 实现将数字金额转换为大写人民币汉字,需要用到数值分段、数值转换、单位处理等一系列算法。其核心思路为:将待转换的数值从小数点处分割出来,…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部