← 返回目录

前端路由

第 133 / 154 卷日期:

父组件 this.$router.push({

name: 'B', params: {

XXX: '妈呀' }

})

子组件读取 this.num = this.$route.params.XXX//妈呀

方式D:这种不需要在路由配置好根据路由的名称,通过query来传递

路由配置不需要配置,但是子组件的name必须与父组件传递的路由一致{

父组件 this.$router.push({

path: '/child', query: {

XXX: '妈呀' }

})

子组件读取 this.num = this.$route.query.XXX

总的来说使用方式C和D最为多,毕竟不需要对路由配置做修改

前端路由

把不同路由对应不同内容或页面的任务交给前端来做,之前通过服务端根据 url 的不同返回不同的页面实现

前端路由实质上就是检测 URL 的变动,截获 URL 地址,通过解析、匹配路由规定实现 UI 更新

单页面应用中的路由分为hash和history模式

hash模式

监听浏览器地址hash值变化,执行事件

hash会在浏览器URL后增加 # 号

一个完整的的 URL 包含:协定、域名、端口、虚拟目录、文件名、参数、锚

比如 https://www.google.com/#abc中的hash值为abc 特点:hash的变化不会刷新页面,也不会发送给服务器

但hash的变化会被浏览器记录下来,来指导浏览器中的前进和后退

window.location.hash变化触发窗口onhashchange事件,监听hash变化

触发路由时视图容器更新——多数前端框架哈希路由的实现原理

只修改hash部分,不发请求 a标签可设置页面hash,浏览器自动设置hash

window.location.hash='abc';

let {hash}=window.location window.addEventListener('hashchange',function(){

//监听hash变化 })

特点

兼容性好

路径在#后面,不好看

history模式

H5新特性,允许直接修改前端路由,更新URL但不重新发请求,history可自定义地址

window.history属性指向 History 对象,表示当前窗口的浏览历史,保存了当前窗口访问过的所有页面网址

由于安全原因,浏览器不允许脚本读取这些地址,但允许在地址间导航

// 后退到前一个网址 history.back()

// 等同于 history.go(-1)

浏览器工具栏的“前进”和“后退”按钮,就是对 History 对象进行操作 History 对象主要有两个属性

History.length:当前窗口访问过的网址数量(包括当前网页)

History.state:History 堆栈最上层的状态值(详见下文)

// 当前窗口访问过多少个网页 window.history.length

// History 对象的当前状态 // 通常是 undefined

window.history.state

history.back()、history.forward()、history.go()

用于在历史之中移动

History.back():移动到上一个网址,等于点击浏览器后退键。对于第一个访问的网址,该方法无效 History.forward():移动到下一个网址,等于点击浏览器前进键。对于最后一个访问的网址,该方法无效

history.pushState()

在历史中添加一条记录,不会导致页面刷新

window.history.pushState(state, title, url)

state:对象,触发popstate事件将该对象传递到新页面。不需要可以填null title:新页面标题。但现在所有浏览器都忽视这个参数,所以可以填空串

url:新网址,必须与当前页面在同域。地址栏将显示这个网址

假定当前网址是example.com/1.html,使用pushState()在浏览记录(History 对象)中添加一个新记录

var stateObj = { foo: 'bar' };

history.pushState(stateObj, 'page 2', '2.html');

添加新记录后,浏览器地址栏显示example.com/2.html,但不会跳转到2.html,也不会检查2.html是否存在,它只是成为浏览历史的最新记录。这时,在地址栏输入一个新的地址(如访问google.com),然后点击倒退按

钮,页面的 URL 将显示2.html;再点击一次倒退,URL 将显示1.html

pushState()不触发页面刷新,只导致 History 对象变化,地址栏有反应使用该方法后,可以用History.state读出状态对象

var stateObj = { foo: 'bar' };

history.pushState(stateObj, 'page 2', '2.html');

history.state // {foo: "bar"}

如果pushState的 URL 参数设置了一个新的锚点值(即hash),不会触发hashchange事件。反过来,如果 URL 的锚点值变了,会在 History 对象创建一条浏览记录

如果pushState()方法设置了一个跨域网址,报错

// 报错 // 当前网址为 http://example.com

history.pushState(null, '', 'https://twitter.com/hello');

pushState想要插入一个跨域的网址,导致报错。防止恶意代码让用户以为他们是在另一个网站上,因为这个方法不会导致页面跳转

history.replaceState()

修改 History 当前记录,其他与pushState()一模一样

history.pushState({page: 1}, 'title 1', '?page=1')

history.replaceState({page: 3}, 'title 3', '?page=3');

// URL 显示为 http://example.com/example.html?page=3

history.back()

// URL 显示为 http://example.com/example.html?page=1

history.back()

// URL 显示为 http://example.com/example.html

history.go(2)

// URL 显示为 http://example.com/example.html?page=3

popstate事件

当同一个文档的浏览历史变化触发popstate 注意

仅调用pushState() / replaceState(),不会触发只有点击浏览器倒退/前进,或调用History.back()、History.forward()、History.go()才会触发

只针对同一个文档,如果浏览历史切换,导致加载不同文档,不会触发

popstate指定回调函数

window.onpopstate = function (event) { console.log('location: ' + document.location);

console.log('state: ' + JSON.stringify(event.state));

};

// 或者 window.addEventListener('popstate', function (event) {

console.log('location: ' + document.location);

console.log('state: ' + JSON.stringify(event.state));

});

回调函数参数event事件对象,它的state指向当前状态对象,这个state也可以通过history对象读取

var currentState = history.state;

页面第一次加载不会触发popstate事件

特点

路径正规

兼容性不比hash,需服务端支持

全站分卷索引 · 154 卷
  1. 1代码随想录知识星球精华(最强八股文)第五版(前端篇))
  2. 2html语义化
  3. 3src 和 href 的区别
  4. 4link 与 @import 的区别
  5. 5iframe
  6. 6CSS
  7. 7伪元素和伪类
  8. 8block,inline,inline-block
  9. 9重排、重绘和合成
  10. 10盒子模型
  11. 11margin 合并
  12. 12margin和padding 的值为百分比时
  13. 13浮动
  14. 14定位
  15. 15CSS选择器
  16. 16CSS选择器优先级
  17. 17选择器权重Specificity
  18. 18CSS属性继承
  19. 19不可/可继承属性
  20. 20display: none与 visibility: hidden的区别
  21. 21background-size
  22. 22client、offset&scroll
  23. 23CSS3新特性
  24. 24flex布局
  25. 25常见布局
  26. 26三栏布局
  27. 27垂直居中
  28. 28水平垂直居中
  29. 29CSS画三角形
  30. 30使chrome支持12px以下文字
  31. 31响应式布局
  32. 32媒体查询
  33. 33过渡与动画
  34. 34JavaScript 动画 和 CSS动画
  35. 35SCSS
  36. 36CSS性能优化
  37. 37有哪些数据类型
  38. 38判断数据类型
  39. 39类型转换
  40. 40parseInt&parseFloat
  41. 41浮点数求和步骤
  42. 42十进制小数转二进制
  43. 430.1+0.2 为什么不等于 0.3
  44. 44undefined 和 undeclared 的区别
  45. 45JavaScript NaN 属性
  46. 46isFinite()&isNaN()
  47. 47数组
  48. 48对原数组有影响
  49. 49对原数组无影响
  50. 50数组去重
  51. 51数组拍平
  52. 52ES6新增的数组方法
  53. 53判断是否存在某个值
  54. 54arguments为啥不是数组
  55. 55对象
  56. 56遍历对象的方法
  57. 57判断对象是否具有属性
  58. 58for in 和 for of 的区别
  59. 59继承方式
  60. 60instanceof
  61. 61深浅拷贝
  62. 62freeze属性
  63. 63函数
  64. 64函数柯里化
  65. 65函数的 length
  66. 66箭头函数和普通函数区别
  67. 67构造函数
  68. 68执行上下文
  69. 69作用域
  70. 70作用域和作用域链
  71. 71闭包和内存泄漏
  72. 72this
  73. 73关于 this 的指向问题
  74. 74改变this指向的方法(bind / call / apply)
  75. 75字符串
  76. 76DOM和事件
  77. 77哪些事件支持冒泡
  78. 78阻止冒泡
  79. 79HTMLCollection、NodeList
  80. 80dom.onclick 和 dom.addEventListener的区别
  81. 81e.target和e.currentTarget
  82. 82页面生命周期
  83. 83异步
  84. 84内存管理GC
  85. 85其它
  86. 86JavaScript 中日期时间格式转换
  87. 87input和object实现双向绑定
  88. 88JSON.stringify()
  89. 89escape、encodeURI&encodeURIComponent
  90. 90移动端滚动穿透和溢出
  91. 91ES6
  92. 92Map字典
  93. 93... 与rest
  94. 94proxy
  95. 95模块化
  96. 96Ajax、Fetch和Axios
  97. 97Webpack
  98. 98浏览器:事件循环
  99. 99浏览器内核
  100. 100浏览器同源策略
  101. 101输入URL回车后发生了什么
  102. 102HTTP
  103. 103HTTP 2.0
  104. 104浏览器存储
  105. 105鉴权
  106. 106Webstorage
  107. 107浏览器执行机制
  108. 108AST 抽象语法树
  109. 109性能优化
  110. 110CSS
  111. 111网络相关
  112. 112使用HTTP2.0
  113. 113图片
  114. 114CDN图片
  115. 115其他文件优化
  116. 116降低APP首页开屏渲染时间
  117. 117页面白屏
  118. 118HTTPS中间人攻击
  119. 119Web Worker
  120. 120Service Worker
  121. 121微前端
  122. 122Vue
  123. 123v-show 和 v-if 的区别
  124. 124双向数据绑定的原理
  125. 125Vue中的插槽使用
  126. 126Vue中的key
  127. 127Vue过滤器
  128. 128Vue中Scoped原理
  129. 129Vue中$nextTick的使用
  130. 130Vue中实现组件通信的方式
  131. 131Vue-router
  132. 132Vue路由传参
  133. 133前端路由
  134. 134Vuex
  135. 135虚拟DOM
  136. 136DIFF 算法
  137. 137Vue3和Vue2有哪些区别
  138. 138说一说你对React的理解
  139. 139React事件机制
  140. 140说一说你对react refs的理解
  141. 141react中key的作用
  142. 142组件开发
  143. 143有状态组件和无状态组件
  144. 144函数式组件和类组件的区别
  145. 145PureComponent&Component
  146. 146常见 Hooks
  147. 147状态管理
  148. 148redux toolkit
  149. 149React18新特性
  150. 150client中的createRoot取代以前的ReactDOM.render
  151. 151Suspense
  152. 152新的Hooks
  153. 153VDom一定更快吗
  154. 154Fiber