原生JS实现组件切换(不刷新页面)

        这是通过原生Es6实现的组件切换,代码很简单,原理和各种框架原理大致相同。

创建文件


├── component:存放组件
│   ├── home1.js:组件1
│   ├── home2.js:组件2
├── index.html
├── index.js

初始化html文件

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><style>.home1 {background-color: #e33a3a;width: 200px;height: 200px;}.home2 {background-color: #6ce11e;width: 200px;height: 200px;}</style></head><body><div id="app"></div><a href="#/home1">组件1</a><a href="#/home2">组件2</a><!-- type="module",必须带这个,因为后面会使用部分的ES6(模块化) --><script src="./index.js" type="module"></script></body>
</html>

初始化hom1和home2

//home1.jsexport function home1Page() {document.querySelector("#app").innerHTML = homePageTemplate;
}
const homePageTemplate = `
<div class="home1"><div>组件1</div>
</div>`;//home2.jsexport function home2Page() {document.querySelector("#app").innerHTML = componentPageTemplate;
}
const componentPageTemplate = `
<div class="home2"><div>组件2</div>
</div>`;

创建index.js

index.js我们一步一步刨析

1、创建路由表

首页先创建一个路由表,在不同的路由下执行不同的方法。

import { home1Page } from "./component/home1.js";
import { home2Page } from "./component/home2.js";
//路由表
const routers = [{name: "home1",path: "/home1",component: home1Page},{name: "home2",path: "/home2",component: home2Page,}
];
2、监听hash
// 监听页面 load和hashchange 事件,事件触发后对代理对象赋值//hash变化
window.addEventListener("hashchange", () => {hashProxy.hash = window.location.hash;
});
//页面初始化
window.addEventListener("load", () => {hashProxy.hash = window.location.hash;
})// 数据响应式处理
const hashProxy = reactive({hash: ""},effective
)// obj是要变成响应式的对象,effective是一个回调函数,在对象属性发生变化时会被调用
function reactive(obj, effective) {return new Proxy(obj, {get(obj, key) {return Reflect.get(obj, key);},set(obj, key, value) {let set = Reflect.set(obj, key, value);effective();return set;},});
}//数据响应式执行函数
let effective = () => {consoel.log("hash变化了");changeComponent()
};
3、数据变化调用方法
//组件渲染方法
function changeComponent() {//将路径带入方法中得到optionslet options = getRouteroptions(hashProxy.hash);//过滤路由表,得到对应组件的方法const [{ component }] = routers.filter((router) => router.name == options.name);//调用组件对应的方法,实现页面切换component();
}function getRouteroptions(hash) {const options = {//路由配置选项name: "",params: "",query: ""}//hash不存在时if (!hash || hash == "#home1") {options.name = "home1";} else {//提取name params query信息//     0    1      2//<a href='#/name/:params?query1=value1?query2=value2'></a>try {const routerArr = hash.slice(1).split("/");options.name = routerArr[1];// const paramsArr = routerArr[2].split("?");// options.params = paramsArr[0].slice(1);// options.query = paramsArr.slice(1);} catch (error) {options.name = "404";}}return options
}

至此功能就实现了

 

index.js完整代码

import { home1Page } from "./component/home1.js";
import { home2Page } from "./component/home2.js";
//路由表
const routers = [{name: "home1",path: "/home1",component: home1Page},{name: "home2",path: "/home2",component: home2Page,}
];// 监听页面 load和hashchange 事件,事件触发后对代理对象赋值
window.addEventListener("hashchange", () => {hashProxy.hash = window.location.hash;
});window.addEventListener("load", () => {hashProxy.hash = window.location.hash;
})function changeComponent() {let options = getRouteroptions(hashProxy.hash);const [{ component }] = routers.filter((router) => router.name == options.name);component();
}function reactive(obj, effective) {return new Proxy(obj, {get(obj, key) {return Reflect.get(obj, key);},set(obj, key, value) {let set = Reflect.set(obj, key, value);effective();return set;},});
}//数据响应式执行函数
let effective = () => changeComponent();// 数据响应式处理
const hashProxy = reactive({hash: ""},effective
)function getRouteroptions(hash) {const options = {//路由配置选项name: "",params: "",query: ""}if (!hash || hash == "#home1") {options.name = "home1";} else {//提取name params query信息//     0    1      2//<a href='#/name/:params?query1=value1?query2=value2'></a>try {const routerArr = hash.slice(1).split("/");options.name = routerArr[1];// const paramsArr = routerArr[2].split("?");// options.params = paramsArr[0].slice(1);// options.query = paramsArr.slice(1);} catch (error) {options.name = "404";}}return options
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286414.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git的使用思维导图

源文件在github主页&#xff1a;study_collection/cpp学习/git at main stu-yzZ/study_collection (github.com)

全网好听的BGM都在这里下载,赶紧收藏好了

无论是自媒体创作者还是从事视频剪辑工作的朋友&#xff0c;对于BGM的选择都很重要&#xff0c;一首适配的BGM能大大提升你作品的质量&#xff0c;还能让作品更优秀。哪里才能找到好听又免费的BGM&#xff1f;下面推荐几个我多年收藏的6个音效、音频素材网站&#xff0c;赶紧收…

jdk多版本切换环境变量管理(jdk1.8和jdk17)

jdk多版本切换环境变量管理&#xff08;jdk1.8和jdk17&#xff09; 看了很多网上的博客&#xff0c;根本都不行&#xff0c;我总结出来规律如下&#xff1a; 首先环境变量要配置成这个样子&#xff1a;这些博客都会教你们配 接着配什么classpath&#xff0c;看其他博客就行 还…

鸿蒙开发之简单登录页面

Entry Component struct Index {State loading:booleanfalse;build() {Row() {Column({ space: 5 }) {Image($r("app.media.app_icon")).width(100).height(100).borderRadius(10).margin({top: 60})Text("登录界面").fontSize(40).fontWeight(FontWeight.…

Jmeter基础和概念(超详细整理)

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a…

javascript--深拷贝,浅拷贝区别

浅拷贝和深拷贝都是创建一份数据的拷贝。 js分为原始类型和引用类型&#xff0c;对于原始类型的拷贝&#xff0c;并没有深浅拷贝的区别&#xff0c;只有拷贝引用类型的时候存在深浅拷贝的区别的问题。 浅拷贝只进行一层复制&#xff0c;引用类型还是共享内存地址。 深拷贝是无…

原知因,正成为中产群体“精准抗衰”新选择

惧怕衰老&#xff0c;渴望长寿&#xff0c;是全人类的共同属性。而在现代生命科学的加持下&#xff0c;科学家们的勇气也前所未有的可畏&#xff0c;人类长寿基因发现者Nir Barzilai就是其中最具代表性的一位。作为人类史上首个抗衰老临床研究TAME的负责人&#xff0c;这位大佬…

金和OA jc6 clobfield接口存在SQL注入漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 金和OA协同办公管理系统j6软件是一种综合性的协同办公解决方案&#xff0c;旨在提高企业内部的协作效率和工作效率。它提供了一系列功能和工具&#xff0c;帮助组织进行任务管理、日程安排、文件共享、团队协作和…

银行测试:第三方支付平台业务流,功能/性能/安全测试方法

1、第三方支付平台的功能和结构特点 在信用方面&#xff0c;第三方支付平台作为中介&#xff0c;在网上交易的商家和消费者之间作一个信用的中转&#xff0c;通过改造支付流程来约束双方的行为&#xff0c;从而在一定程度上缓解彼此对双方信用的猜疑&#xff0c;增加对网上购物…

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding GPT-4V情感:多模态情感理解的zero-shot基准 1.摘要 最近&#xff0c;GPT-4视觉系统(GPT-4V)在各种多模态任务中表现出非凡的性能。然而&#xff0c;它在情感识别方面的功效仍然是个问题。本文定…

Spring学习?这一篇文章就够,史上最全!

文章目录 前言一、IOC概述及底层原理1.概述和原理 二、思路分析三、IOC操作bean管理&#xff08;基于xml&#xff0c;使用的是IDEA2022.3.3&#xff0c;maven仓库&#xff09;1.xml实现bean管理&#xff08;1&#xff09;创建对象&#xff08;2&#xff09;注入属性&#xff08…

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…