vue 学习笔记

162 阅读3分钟

小问题记录

1 使用 v-for 遍历 object

v-for 遍历对象的时候,第一个参数是 value ,而不是 {key: value}

1 vue-router 的两种模式:hash 和 history

1.1 vue-router 是什么

是 vue.js 官方的路由管理器,功能如下:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为 核心在于:改变的路由的同时,不会向后端发送请求

1.2 hash 和 history 的特点及区别

1.2.1 特点

  1. hash:
    使用 URL 的 hash 来模拟一个完成的 url。
    比如这个 URL:www.abc.com/#/hello ,hash 的值为 #/hello。
    它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。# 是用来指导浏览器动作的,对服务器端完全无用,单单改变 # 之后的内容,浏览器只会滚动带对应的位置而不会重新加载网页。
  2. history:利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。 (需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。

Window.history是一个只读属性,用来获取History 对象的引用,History 对象提供了操作浏览器会话历史(浏览器地址栏中访问的页面,以及当前页面中通过框架加载的页面)的接口。HTML5引入了 history.pushState() 和 history.replaceState() 方法,它们分别可以添加和修改历史记录条目。

1.2.2 区别

使用 history.pushState() 相比 hash 有以下好处:

  1. 新设置的 URL 可以是同源下的任意 URL,而 hash 只能修改 # 之后的部分
  2. 可以设置与之前一模一样的 URL,会触发添加记录到栈中,而 hash 不会触发此行为
  3. 可以通过 objectState 参数添加任意类型的数据到栈中,而 hash 只可添加短字符串
  4. 可额外设置 title 供后续使用

而 hash 的好处在于:

  1. 由于只有 hash 之前的内容才会被包含在请求中,因此,对后端来说即使没有做到路由全覆盖,也不会出现 404 的问题,而 history 则需要后端配置。
    可参考 vue-router 官方解释:router.vuejs.org/zh/guide/es…

1.2.3 导航守卫

  • 全局前置守卫:router.beforeEach()
  • 全局解析守卫:router.resolve()
  • 全局后置钩子:router.afterEach()
  • 组件内的守卫:
    • beforeRouteEnter():在渲染该组件对应路由被 comfirm 嗲用,不能获取组件 this 实例(组件实例还未创建)
    • beforeRouteUpdate():当前路由改变前,但该组件被复用时调用,可访问 this
    • beforeRouteLeave():导航离开该组件的对应路由时调用,可访问 this

完整的导航解析流程:

  1. 导航被触发。
  2. 在失活的组件里调用离开守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
  5. 在路由配置里调用 beforeEnter。
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter。
  8. 调用全局的 beforeResolve 守卫 (2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。