vue总序

161 阅读4分钟

1,生命周期

1-1,什么是生命周期?

从创建到销毁的过程,就是指实例从创建,初始化数据,编译模板,挂载DOM, 更新,销毁的一系列过程

## 1-2,生命周期的几个步骤
beforeCreate created
beforeMount mounted
beforeUpdate updated
beforeDestroy destroyed

## 1-3,生命周期的作用
vue可以在不同阶段处理做不同的逻辑处理,准确地控制数据流和其对DOM的影响

## 1-4,第一次页面加载会触发几个钩子?
beforeCreate created beforeMount mounted

## 1-5,生命周期的几个作用(适合哪些场景)
beforeCreat 创建前,可以加一个loadering事件, 在加载实例时触发
created 创建后,可以将loadering事件取消,可以做接口数据请求
mounted  挂载后可以获取到dom节点
nextTick 更新数据后立即操作dom

## 1-6,dom渲染在哪个生命周期就已经完成了?
mounted

7,v-show  和v-if的区别

v-show是css样式的更改,给dom加dislay:block|none; v-if 表示是否显示隐藏dom节点

8,开发中的常用指令

v-model //双向绑定,是一个语法糖,相当于 :value="message" @input = "'emit,emit',event.target.value=message" v-if v-else-if v-else v-show v-on v-bind v-clock v-once v-for v-text v-html

9,绑定class的数组用法

:class="[class1,class2]" :class="{ 'color1': class1, 'color1': class2}" :style={ color: color,fontSize: fontSize+'px'}

10, mvvm

m 是数据模型层 v是视图层 vm 是数据视图模型层,将数据和模型连接起来。

11,computed和watch的区别和运用用场景

computed是计算属性,具有缓存性 watch 观察的作用,类似于数据的监听回调,没有缓存,页面重新渲染时值不变化也会执行。 当要进行数值计算,而且依赖于其它数据,那么这个交给computed 如果需要再数据变化时做一些事情,使用watch来观察数据变化。 运用场景: 当我们需要进行数值计算,并且依赖于其它数据时,应该使用computed, 因为可以利用computed的缓存特性,避免每次获取值时,都需要重新计算; 当我们需要在数据变化时执行一步或开销较大的操作时,应该使用watch,使用watch选项允许我们执行异步操作,限制我们执行该操作的频率,并且我们得到最终结果前,设置中间状态, 这些都是计算属性无法做到的。

12,vue组件的scoped属性的作用。

表示样式只能在当前组件下有效。

13,vue是渐进式框架的理解

vue的核心是视图模板引擎, 前端只需要关注视图层。

14,vue.js的两个核心是什么?

数据驱动,组件系统

15,vue常用修饰符

表单修饰符 .lazy v-model在每次input事件触发后将输入框的值与数据进行同步,可以添加lazy修饰符 .number .trim 自动过滤首尾空白字符

事件修饰符 @click.stop 阻止冒泡 @click.prevent 阻止默认   @submit.prevent 提交事件不再重载页面 @click.stop.prevent 串联 @click.self 只能触发当前自身 @click.once只能触发一次

按键修饰符 .enter .tab .13等 <input @keyup.enter="submit">

16, v-on可以监听多个方法吗?

可以的 //一个元素绑定多个事件的 <button @click="a(),b()">//一个事件绑定多个函数的来个那种写法

17vue事件中如何使用event对象

<button @click="getdata($event)">

18, 比如你想让一个dom元素显示,然后下一步去获取这个元素的offsetWidth,最后你获取到的会是0,因为数据改变show变成true, 元素并不会立即显示,所以获取不到宽度,正确的做法是先把元素show出来,然后在$nextTick去执行获取宽度的操作。

getdata(){     this.show = true; //这里获取不到宽度     this.nextTick(()=>{   //这里是数据更新后立即操作dom         let w = this.refs.submenu.offsetWidth;     }) }

19, vue组件中为什么必须是data函数?

对象是引用的,组件可能会被多个实例同时使用,这样就会造成数据受到影响,用函数可以避免数据混论

20, 说说你对SPA单页面的理解,它的优缺点分别是什么?

spa仅在web页面初始化时加载相应的html,js,css,一旦页面加载完成,spa不会因为用户的操作而进行页面的重新加载或跳转 取而代之的时利用路由机制实现页面之前的变换,ui与用户的交互,避免页面的重新加载

优点:

  • 用户体验好,快,内容改变不需要要重新加载整个页面,避免了不必要的跳转和重复渲染。
  • spa相对服务器压力小
  • 前后端分离,构架清晰,前端进行交互逻辑,后端负责数据处理。

缺点:

  • 初次加载耗时多,为实现单页面web应用功能及时显示效果,需要在加载页面的时候将js,css统一加载,部分页面按需加载
  • 前进后退路由管理,由于单页应用在一个页面中显示所有的内容,所以不能使用浏览器的前进后退功能,所有页面的切换需要 建立堆栈管理
  • seo难度较大,由于所有的内容都在一个页面中动态替换显示,所以seo上有着天然的弱势。

21,怎样理解vue的单向数据流?

所有的prop都使得其父子prop之间形成一个单向下行绑定,父级prop的更新会向下流动到子组件,但返过来则不行,这样会防止 子组件意外改变父组件的状态。从而导致你应用的数据流难以理解。 额外的,每次父级组件发生变更时,子组件中所有的prop都将会刷新为最新的值,这意味着你不应该在一个子组件内部改变prop 如果这样做了,vue会在浏览器控制台中发出警告,子组件想修改时,只能通过$emit派发一个自定义事件,父组件接收到后, 由父组件修改。

22,直接给一个数组赋值,vue能检测到变化吗?

不能。 需要使用vue的方法: 全局:Vue.set(listdata,'age','18') 局部: this.$set(listdata,'age','18');

23,你有看过vue推荐的风格指南吗?列举出你知道的几条

1、使用v-for时记得加key,可以快速定位到需要更新的demo节点,提高效率 2、避免v-if和v-for用在一起 3、优先通过vuex管理全局状态,而不是通过this.$root或一个全局事件总栈 4、组件数据,data必须是一个函数 5、为组件样式设置作用区scoped 6、细致的prop定义 7、指令缩写v-bind用: v-on用@ 8、组件中只包含简单的表达式,复杂的应该放在计算属性或者方法中

24,vue如何优化首页的加载速度?

异步路由,异步加载,分屏加载,按需加载,延时加载图片等

25,vue打包成最终的文件有哪些?

vendor.js , app.js, app.css 默认的一个html文件,如果有设置到单独提取css的话,还有xxx.css

26,vue首页白屏是什么问题引起的?如何解决呢?

首页加载慢,1可以采用js分包、懒加载。2可以利用SSR同构渲染。代码图片资源压缩

27,说说你对单向数据流和双向数据流的理解

父传子的props就是单向数据流 v-model就是双向数据流

28,移动端ui你用的是哪个ui库?有遇到过什么问题吗?

vant,mint等等吧

29,为什么vue使用异步更新组件?

避免不必要的计算和dom操作

30,如何实现一个虚拟DOM?说说你的思路

虚拟Dom在vue底层实现中是一个类,每次_render的时候都会实例化Vnode为一个虚拟dom对象。也就是说本质上是用一个js对象来描述dom节点。

31,SPA单页面的实现方式有哪些?

hash | history

32, 使用vue开发过程你是怎么做接口管理的?

在request.js中对axios请求统一处理,然后在api文件夹中引入request.js后再使用,封装后的方法进行请求

33, 你有封装过axios吗?主要是封装哪方面的?axios是什么?怎样使用它?怎么解决跨域的问题?

用Promise在封装一次axios,并统一baseURL,超时时间,请求拦截,响应拦截处理,统一管理接口,批量导出。 axios跨域:定义baseURL、配置proxyTable

34, 组件和插件有什么区别?

组件 (Component) 是用来构成你的 App 的业务模块,它的目标是 App.vue。 插件 (Plugin) 是用来增强你的技术栈的功能模块,它的目标是 Vue 本身。

35 什么时候使用keep-alive元素?

当由于数据属性或其他某种响应状态而动态切换组件时,每次将它们切换到渲染状态时,都会被重新渲染。尽管你可能需要这种行为,但在某些情况下重新渲染可能是不合适的。例如在创建时从 API 调用中引入数据的组件。你可能不希望每次动态切换这个组件进行渲染时都调用此 API。这时你可以将组件包含在 keep-alive 元素中。keep-alive 元素缓存该组件并从那里获取它,而不是每次都重新渲染它。

36  在 Vue 实例中编写生命周期 hook 或其他 option/propertie 时,为什么不使用箭头函数?

箭头函数自己没有定义 this 上下文,而是绑定到其父函数的上下文中。当你在 Vue 程序中使用箭头函数(=>)时,this 关键字病不会绑定到 Vue 实例,因此会引发错误。所以强烈建议改用标准函数声明。

#37 在大型 Vue 程序中管理状态的推荐方法是什么?为什么? 当程序在功能和代码方面不断增长时,状态管理会变得困难,并且使用无穷无尽的下游网络 prop 和上游事件当然不是明智的决定。在这种情况下,有必要将状态管理转移到中央管理系统。 Vue 生态系统中提供了 Vuex,它是官方的状态管理库,也是推荐用于集中存储状态的模式。

Vuex 允许维护中央状态。组件将 Vuex 用作响应性数据存储,并在状态更新时进行更新。多个或者不相关的组件可以依赖于相同的中央存储。

在这种情况下,Vue 充当纯 View 层。要修改状态,视图层(例如按钮或交互式组件)需要发出 Vuex Action,然后执行所需的任务。为了更新或修改状态,Vuex 提供了 Mutations。 这个工作流程的目的是留下可用的操作痕迹。

#38 什么是异步组件? 当大型程序使用大量组件时,从服务器上同时加载所有组件可能是没有意义的。在这种情况下,Vue 允许我们在需要时定义从服务器异步加载的组件。在声明或注册组件时,Vue 接受提供 Promise 的工厂函数。然后可以在调用该组件时对其进行“解析”。

通过仅加载基本组件并把异步组件的加载推迟到未来的调用时间,可以节省带宽和程序加载时间。

这是一个异步组件的简单示例。 new Vue({ components: { ‘tweet-box’: () => import(‘./components/async/TweetBox’) } });

#39 什么时候调用 “updated” 生命周期 hook ? 在更新响应性数据并重新渲染虚拟 DOM 之后,将调用更新的 hook。它可以用于执行与 DOM 相关的操作,但是(默认情况下)不能保证子组件会被渲染,尽管也可以通过在更新函数中使用 this.$nextTick 来确保。

#40 什么是虚拟 DOM? 文档对象模型或 DOM 定义了一个接口,该接口允许 JavaScript 之类的语言访问和操作 HTML 文档。元素由树中的节点表示,并且接口允许我们操纵它们。但是此接口需要付出代价,大量非常频繁的 DOM 操作会使页面速度变慢。

Vue 通过在内存中实现文档结构的虚拟表示来解决此问题,其中虚拟节点(VNode)表示 DOM 树中的节点。当需要操纵时,可以在虚拟 DOM的 内存中执行计算和操作,而不是在真实 DOM 上进行操纵。这自然会更快,并且允许虚拟 DOM 算法计算出最优化的方式来更新实际 DOM 结构。

一旦计算出,就将其应用于实际的 DOM 树,这就提高了性能,这就是为什么基于虚拟 DOM 的框架(例如 Vue 和 React)如此突出的原因

#41  什么是 Vue 插件? Vue 插件允许开发人员构建全局级别的功能并将其添加到 Vue。用于向程序添加可以全局访问的方法和属性、资源,选项,mixin 以及其他自定义 API。 VueFire 是 Vue 插件的一个例子,该插件添加了 Firebase 特定的方法并将其绑定到整个程序。之后 firebase 函数可在程序结构中的任何位置的 this 上下文中使用。

#42. 什么是渲染函数?举个例子。 Vue 允许我们以多种方式构建模板,其中最常见的方式是只把 HTML 与特殊指令和 mustache 标签一起用于响应功能。但是你也可以通过 JavaScript 使用特殊的函数类(称为渲染函数)来构建模板。这些函数与编译器非常接近,这意味着它们比其他模板类型更高效、快捷。由于你使用 JavaScript 编写渲染函数,因此可以在需要的地方自由使用该语言直接添加自定义函数。

对于标准 HTML 模板的高级方案非常有用。 new Vue({ el: '#app', data: { fruits: ['Apples', 'Oranges', 'Kiwi'] }, template: <div> <h1>Fruit Basket</h1> <ol> <li v-for="fruit in fruits">{{ fruit }}</li> </ol> </div> });

#43###  在开发过程中,如果你的 Vue 程序和后端 API 服务器未在同一主机上运行,该如何代理 API 请求。假设使用 Vue-CLI 3 进行设置? 假设我们有一个运行在 localhost:4040 上的 Node.js 后端服务器。为了确保代理并可以从组件中访问它,可以配置 vue.config.js 文件并包含 devServer 部分,如下所示:

在 vue.config.js 文件中: module.exports: { devServer: { proxy: { '/api': { target: ‘http://localhost:4040/api’, changeOrigin: true } } } }

#43 什么是 mixin? Mixins 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果你希望在多个组件之间重用一组组件选项,例如生命周期 hook、方法等,则可以将其编写为 mixin,并在组件中简单地引用它。然后将 mixin 的内容合并到组件中。如果你要在 mixin 中定义生命周期 hook,那么它在执行时将优先于组件自己的 hook

#44  什么是vue-loader? Vue-loader 是 Webpack 的加载器模块,它使我们可以用 .vue 文件格式编写单文件组件。单文件组件文件有三个部分,即模板、脚本和样式。 vue-loader 模块允许 webpack 使用单独的加载器模块(例如 SASS 或 SCSS 加载器)提取和处理每个部分。该设置使我们可以使用 .vue 文件无缝编写程序。

vue-loader 模块还允许把静态资源视为模块依赖性,并允许使用 webpack 加载器进行处理。而且还允许在开发过程中进行热重装。