vue
模板编译
模板渲染过程
路由
路由拦截
主要是利用 vue-router 提供的钩子函数 beforeEach() 对路由进行判断 - 导航守卫 - 全局前置守卫
router.beforeEach((to, from, next) => { |
to: Route: 即将要进入的目标
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
next(‘/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
vue 路由传参
_vue/vue?id=路由参数
- vue 路由传参方式,说明区别和应用场景
编程式导航
params 和 query
params 要用 name 来引入,query 要用 path 来引入
query 类似于 ajax 中 get 传参,params 类似于 post
const userId = '123' |
首屏加载优化和算法
vue-loader
解析和转换 .vue 文件,提取出其中的逻辑代码 script、样式代码 style、以及 HTML 模版 template,再分别把它们交给对应的 Loader 去处理
Computed和Watch
Computed 有缓存: 基于它们的响应式依赖进行缓存,只有跟计算属性相关的数据发生了改变,计算属性才会重新计算
Watch没有缓存性 deep: true 深度监听,这样便会对对象中的每一项进行监听。优化的话可以使用字符串形式监听
vue3 新特性
基于 Proxy 的观察者机制
重写虚拟 Dom
更好的支持 ts
新工具 vite
做过哪些 webpack 配置
配置 proxy 跨域
配置 externals
配置别名
添加打包分析插件 BundleAnalyzerPlugin
chainWebpack
const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV); |
index.html 修改
<!-- 使用CDN的CSS文件 --> |
vue 自定义指令
全局
Vue.directive('color', { |
组件内
directives:{ |
vuex 的五个状态
state
mutations
:提供修改数据的方法
getters
:可以认为是 store 的计算属性
actions
:Action 提交的是 mutation,可以包含异步
modules
:将 store 分割成模块
vuex 异步
const mutations = { |
Hash 和 History 路由的区别和优缺点?
- hash 路由模式的实现主要是基于下面几个特性:
URL 中 hash 值只是客户端的一种状态,也就是说当向服务器端发出请求时,hash 部分不会被发送(hash 值改变,浏览器不会重新发起请求)
hash 值改变,会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制 hash 的切换
可以通过 a 标签,或对 loaction.hash 进行赋值,来改变 URL 的 hash 值
可以使用 hashchange 事件来监听 hash 值的变化,从而对页面进行跳转(渲染)
- history 路由模式的实现主要基于存在下面几个特性:
pushState 和 repalceState 两个 API 来操作实现 URL 的变化,且不会重新发起请求
使用 popstate 事件来监听 url 的变化,从而对页面进行跳转(渲染)
history.pushState() 或 history.replaceState() 不会触发 popstate 事件,这时我们需要手动触发页面跳转(渲染)。
- hash模式优缺点
优点
只需要前端配置路由表, 不需要后端的参与
兼容性好, 浏览器都能支持
hash值改变不会向后端发送请求, 完全属于前端路由
缺点
hash值前面需要加#
, 不符合url规范, 也不美观
- history 模式的优缺点:
优点:
符合url地址规范, 不需要#
, 使用起来比较美观
缺点:
需要服务端配合重定向,否则一刷新页面就404了
兼容性比较差, 利用了 HTML5 History对象中新增的 pushState() 和 replaceState() 方法, 需要浏览器的支持
https://cn.vuejs.org/v2/guide/components-custom-events.html#将原生事件绑定到组件