前端H5路由跳转(一)

一、路由跳转了解

        前端路由跳转是一种在不重新加载页面的情况下,通过改变URL来切换时图的技术。它允许开发人员在不向服务器发送请求的情况下,通过修改URL来改变页面的显示内容,从而实现单页面应用(SPA)的效果。前端路由机制使得SPA能够模拟多页面应用的效果,提高了用户体验和应用的相应速度。

二、前端路由跳转基本原理

        1、目前前端流行的框架里都推介单页面应用SPA开发模式,在路由切换时替换DOM Tree中最小修改的部分DOM,来减少原先因为多页面应用的页面跳转带来的巨量性能损耗。它们都有各自典型路由解决方案,@angular/route、react- route,@react-navigation/native等。

        2、一般来说,这些路由插件总是提供两种不同方式的路由方式:Hash模式History模式,有时也会提供非浏览器环境下的路由方式Abstract,在vue-route中时使用了外观模式将几种不同的路由方式提供了一个一致的高层借口,让我们可以更解耦的再不同路由方式中切换。

        3、Hash模式和History模式除了外观上的不同之处,还一个区别是:Hash模式的状态保存需要另外传递,而HTML5 History原生提供了自定义状态传递的能力,我们可以直接利用其来传递信息。

三、Hash模式

1、Hash原理

        Hash模式通过URL中的hash(#)来实现路由。当URL的#后面发生变化时,浏览器不会像服务器发送请求,而是触发hashchange事件,从而实现页面的跳转和数据加载。

        HTML页面中通过锚点定位原理课进行无刷新跳转,触发后URL地址中会多出# + ‘XXX’的部分,同时在全局的window对象上触发hashchange事件,这样在页面锚点哈希改变为某个预设值的时候,通过代码触发对应页面DOM变化,就可以实现基本的路由了。由于hash值变化不会导致浏览器向服务器发出请求,而且hash改变会触发hashchange事件,浏览器的进后退也能对其进行控制,所以人们在HTML5的history出现之前,基本都是使用hash来实现前端路由的。

2、hash相关的API

        location.href():返回完成的URL;

        location.hash():返回URL的锚部分;

        location.pathname():返回URL路径名;

        hashchange事件:当location.hash发生改变时,将触发这个事件

四、History模式

1、history模式原理

        history模式利用HTML5中的History API(pushState、replaceState和popstate)来实现URL跳转而无需重新加载页面。通过调用History API,可以修改浏览器历史记录中的URL,并且不像hash模式那样会在URL中出现#。现代的前端框架,如React Route v4、Vue Route等,都是用history模式作为默认的实现方式。

2、history模式相关的API

        history.go(n):路由跳转,比如n为2时往前移动2个页面,n为-2时向后移动2个页面,n为0是刷新当前页面

        history.back():路由后退,相当于history.go(-1)

        history.forward():路由前进,相当于history.go(1)

        history.pushState():添加一条路由历史记录

        history.replaceState():替换当前页面在路由历史记录的信息

        popstate事件:当活动的历史记录发生变化,就会触发popstate事件,在点击浏览器的前进后退按钮或着调用上面前三个方法的时候也会触发

五、如何监听两种路由模式的变化

对于hash模式,可以监听hashchange事件来捕获到hash的改变,从而实现前端路由
对于history模式,我们可以监听popstate事件来监听forward,back,go方法触发的路由变化,对于History.pushState()和History.replaceState(),一种方法是重写两个方法,在方法里面主动触发popState事件,另外一种,也是重写两个方法,在方法中创建一个新的全局事件,具体如下:

var _wr = function(type) {
   var orig = history[type];
   return function() {
       var rv = orig.apply(this, arguments);
      var e = new Event(type);
       e.arguments = arguments;
       window.dispatchEvent(e);
       return rv;
   };
};
 history.pushState = _wr('pushState');
 history.replaceState = _wr('replaceState');

然后全局监听两个方法

window.addEventListener('replaceState', function(e) {
  console.log('THEY DID IT AGAIN! replaceState 111111');
});
window.addEventListener('pushState', function(e) {
  console.log('THEY DID IT AGAIN! pushState 2222222');
});

这样就可以监听到pushState和replaceState行为。

### Vue.js H5 开发框架使用指南 Vue.js种流行的渐进式 JavaScript 框架,适用于构建用户界面和单页应用 (SPA)[^1]。以下是关于如何使用 Vue.js 进行 H5 应用开发的些关键点: #### 、环境准备 为了顺利进行 Vue.jsH5 开发,需先完成必要的工具安装: - **Visual Studio Code**:推荐作为主要编辑器,支持丰富的插件扩展功能[^3]。 - **Node.js 和 npm/yarn**:确保已安装最新稳定版本的 Node.js 及其包管理工具,以便管理和运行依赖项。 - **Git 工具**:如果需要从远程仓库拉取项目源码,则应配置好 Git 客户端。 #### 二、创建新项目 可以利用官方脚手架 `@vue/cli` 创建个新的 Vue 项目结构: ```bash npm install -g @vue/cli vue create my-h5-app ``` 上述命令会引导开发者选择适合移动端场景的功能模块组合,比如是否集成 Vuex 状态管理模式以及 vue-router 路由导航组件等特性。 #### 三、基础语法概览 ##### 组件化编程模型 Vue 推崇基于组件的设计理念,允许将页面拆分为多个独立可重用的小部件。每个 `.vue` 文件通常包含三个部分:<template>定义HTML模板;<script>声明逻辑行为;还有<style scoped>指定样式作用域。 ##### 数据绑定机制 通过双大括号 {{}} 插值表达式实现简单的文本渲染效果,或者借助 v-bind 指令动态调整属性值。例如设置按钮文字颜色变化如下所示: ```html <button :style="{color:isActive?'red':'blue'}">点击变红</button> data(){ return { isActive:false } } methods:{ toggleColor(){ this.isActive=!this.isActive; } } ``` ##### 条件与列表渲染 v-if/v-show 控制元素显示隐藏状态,而 v-for 则用来遍历数组生成系列子节点实例: ```html <ul> <li v-for="(item,index) in items" :key="index">{{ item.name }}</li> </ul> ``` #### 四、路由管理 当应用程序复杂度增加时,引入 vue-router 对不同视图间跳转加以规范化处理就显得尤为重要了。它允许我们根据 URL 参数加载对应的内容区块,并保持良好的用户体验连续性。 #### 五、状态同步 对于共享数据的需求场景下,Vuex 提供了个集中式的存储解决方案。它可以跨多层嵌套组件访问公共变量并触发相应更新操作序列。 --- ### 示例代码片段展示 下面给出段简单演示登录表单验证流程的例子: ```javascript // main.js 初始化入口文件 import Vue from 'vue' import App from './App.vue' new Vue({ el:'#app', render:h=>h(App), }) ``` ```html <!-- Login.vue --> <template> <div class="login-form"> <form @submit.prevent="handleSubmit"> <input type="text" placeholder="请输入用户名" v-model.trim="username"/> <p v-if="errors.username">{{ errors.username }}</p> <input type="password" placeholder="密码" v-model.lazy="password"/> <p v-if="errors.password">{{ errors.password }}</p> <button type="submit">提交</button> </form> </div> </template> <script> export default { name:"LoginForm", data() { return{ username:"", password:"", errors:{}, }; }, methods:{ handleSubmit(){ let isValid=true; const errs={}; if(!this.username){ errs["username"]="用户名不能为空"; isValid=false; } if(this.password.length<6){ errs["password"]="密码长度至少为六位数"; isValid=false; } this.errors=errs; if(isValid){ console.log(`成功提交:${JSON.stringify({username:this.username,password:this.password})}`); } }, }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值