Vue 常见面试题(三)25. axios 是什么?怎么使用?描述使用它实现登录功能的流程?答案:axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 node.js,可以发送异步 HTTP 请求(如 GET、POST 等)到服务器。
使用方法:
- 安装:通过 npm 安装 axios,命令为 npm install axios -S。
- 引入:在 JavaScript 文件中使用 import axios from 'axios' 引入。
- 发送请求:使用 axios.get() 或 axios.post() 方法发送请求。
- 处理响应:在 .then() 函数中处理成功响应,在 .catch() 函数中处理错误。
实现登录功能的流程:
- 用户输入:用户在登录页面输入用户名和密码。
- 发送请求:使用 axios.post('/login', { username, password }) 发送登录请求到服务器。
- 服务器验证:服务器验证用户名和密码,返回验证结果。
- 处理响应:
如果验证成功,服务器通常会返回一个包含用户信息的 token。
客户端将 token 存储在本地(如 localStorage),用于后续请求的身份验证。
跳转到主页或显示登录成功信息。
- 处理错误:如果验证失败,显示错误信息,如用户名或密码错误。
跨域设置:如果请求是跨域的,需要在 vue.config.js 配置文件中设置代理。
26. keep-alive 是什么?答案:keep-alive 是 Vue 内置的一个组件,用于包裹动态组件时,缓存不活动的组件实例,而不是销毁它们。这可以使被包含的组件保留状态,或避免重新渲染,从而提高性能。
27. 监听器 watch 的 6 个用法是什么?答案:
- 常见用法:直接监听某个数据属性的变化。
- 绑定方法(字符串):通过方法名(字符串形式)来指定监听器。
- deep + handler:深度监听对象内部属性的变化,但性能一般。
- immediate:监听器创建时立即执行一次,然后监听数据变化。
- 绑定多个 handler:虽然不常见,但技术上可以通过多次调用 Vue.watch() 来实现。
- 监听对象属性(性能比 deep 好):直接监听对象的某个具体属性,而不是整个对象。
28. 在 Vue 中怎么获取 DOM 节点?答案:在元素上使用 ref 属性,如 ref="domName",然后在 Vue 实例中通过 this.$refs.domName 来访问该 DOM 节点。
29. Vue 为什么要求组件模板只能有一个根结点?答案:Vue 组件最终是要被各种 loader 打包解析的,必须为 loader 指定一个入口。此外,模板最终会被编译成虚拟 DOM(vDOM),必须有一个根结点来递归遍历其子节点,渲染成一个“树”。
30. $nextTick 是什么?作用是什么?答案:$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调的方法。在修改数据之后使用它,可以在回调中获取更新后的 DOM。
31. 如何给 Vue 定义全局方法?答案:
- 挂载到 Vue 的原型上:Vue.prototype.methodName = function(){}。
- 使用 mixin:创建一个包含全局方法的 mixin,然后通过 Vue.use(mixin) 将其应用到 Vue 实例中。
32. 接口请求一般放在哪个生命周期里?答案:接口请求一般放在 created 生命周期钩子中,因为此时组件实例已经被创建,可以进行数据请求。
33. 描述一下封装 Vue 组件的过程答案:组件可以提升整个项目的开发效率,通过把页面抽象成多个相对独立的模块,解决传统项目开发中的效率低、难维护、复用性差等问题。
封装过程:
- 使用 Vue.extend 方法创建一个组件构造器。
- 使用 Vue.component 方法注册组件,指定组件名和构造器。
- 子组件需要数据,可以在 props 中接受父组件传递的数据。
- 子组件修改好数据后,想把数据传递给父组件,可以采用 $emit 方法触发自定义事件。
34. 你用 npm 怎么安装、发布一个插件的?答案:
- 安装插件:使用 npm install 插件名 --save 命令安装新插件。
- 发布插件:
使用 npm adduser 登录 npm,添加用户名、密码和邮箱(需要先在 npm 官网注册好账号)。
使用 npm publish 发布插件。
在发布前,可以使用 npm config set registry
https://registry.npmjs.org/
修改 npm 仓库地址为官方仓库(如果之前修改过镜像)。如果需要卸载已发布的插件,可以使用 npm unpublish [包名] --force 命令。
35. 你用 Vue 怎么处理本地开发跨域问题?答案:在 vue.config.js 配置文件中的 devServer 下配置 proxy 本地代理,将前端请求代理到后端服务器,从而解决跨域问题。
36. Vue CLI 项目中目录 src 中的文件夹分别是什么?用来做什么?答案:
- assets:用来放置一些静态资源,如图片、字体图标等。
- components:用来放置 Vue 组件,这些组件可以在其他组件或页面中复用。
- router:用来放置一些路由相关的配置,如定义路由规则、设置路由守卫等。
- App.vue:根组件,是整个 Vue 应用的入口组件。
- main.js:入口文件,用于初始化 Vue 实例,挂载根组件,并引入全局资源(如路由、插件等)。
37. v-model 的原理是什么?答案:v-model 只是一个语法糖,其内部实现原理就是使用 v-bind 绑定值,并使用 input 事件监听值的改变。当输入框的值发生变化时,会触发 input 事件,从而更新绑定的数据。
38. 使用 Vue 后怎么针对搜索引擎做 SEO 优化?答案:
- SSR(服务端渲染):使用 Nuxt.js 等框架实现服务端渲染,使搜索引擎能够抓取到完整的 HTML 内容。
- 预渲染:使用 prerender-spa-plugin 等插件对 Vue 应用进行预渲染,生成静态 HTML 文件。
39. Vue 怎么扩展组件?答案:
- Vue.mixin:全局混入,可以影响所有组件的行为。
- Vue.extend:创建一个可复用的组件构造器,用于生成具有特定选项的新组件。
- Slot:插槽机制,允许父组件向子组件传递模板内容。
40. Vue 模板编译原理是什么?答案:Vue 的编译过程就是将 template 转化为 render 函数的过程。会经历以下阶段:
- 生成 AST 树:解析模板,生成 AST(抽象语法树),用 JavaScript 对象的形式来描述整个模板。
- 优化:深度遍历 AST 树,按照相关条件对树节点进行标记。这些被标记的节点(静态节点)在后续的比对中可以被跳过,从而优化性能。
- codegen:将优化后的 AST 树转换为可执行的代码,即 render 函数。
在这个过程中,Vue 使用大量的正则表达式对模板进行解析,遇到标签、文本等都会执行对应的钩子进行相关处理。Vue 的数据是响应式的,但模板中并不是所有的数据都是响应式的。通过编译过程中的优化,可以进一步提高 Vue 应用的性能。