vue基础面试题(day01)

简介: vue基础面试题(day01)

v-show和v-if指令的共同点和不同点?

当条件改变的时候v-if是通过DOM节点的添加和删除来控制节点的显示隐藏的,v-show是通过css样式控制节点的显示隐藏的。

v-if的切换成本比较高,v-show渲染成本比较高,所以当切换频繁的时候使用v-show,如果初次渲染数据较多的时候,使用v-if。

vue组件中data为什么必须是一个函数?

Vue 中的 data 必须是个函数,因为当data是函数时,组件实例化的时候这个函数将会被调用,返回一个对象,计算机会给这个对象分配一个内存地址,实例化几次就分配几个内存地址,他们的地址都不一样,所以每个组件中的数据不会相互干扰,改变其中一个组件的状态,其它组件不变。

简单来说,就是为了保证组件的独立性和可复用性,如果data是个函数的话,每复用一次组件就会返回新的data,类似于给每个组件实例创建一个私有的数据空间,保护各自的数据互不影响。

一个组件被复用多次的话,也就会创建多个实例。本质上,这些实例用的都是同一个构造函数。如果data是对象的话,对象属于引用类型,会影响到所有的实例。所以为了保证组件不同的实例之间data不冲突,data必须是一个函数。

而 new Vue 的实例,是不会被复用的,因此不存在引用对象的问题。

$nextTick的使用?

vue的$nextTick其本质是对js执行原理EventLoop的一种应用。

$nextTick的核心是利用promise,mutationObserver、setImmediate、setTimeout的原生

javascript方法来模拟对应的微/宏任务的实现,本质是为了利用JavaScript的这些异步回调任务队列来实现vue框架中自己的异步回调队列。

nextTick是典型的将底层的javascript执行原理应用到具体案例中的示例,引入异步更新队列机制的原因:

  • 如果是同步更新,则多次对一个或者多个属性赋值,会频繁触发dom的渲染,可以减少一些无用的渲染。
  • 同时由于virtualDom的引入,每一次状态发生变化之后,状态变化的信号会发送给组件,组件内部使用virtualDom进行计算得出需要更新的具体的dom节点,然后对dom进行更新操作,每次更新状态后的渲染过程需要更多的计算,而这种无用功也将浪费更多的性能,所以异步渲染变得更加至关重要。
  • vue采用了数据驱动的思想,但是在一些情况下,仍然需要操作dom。有时候,可能遇到这样的情况,dom1的数据发生了变化,而dom2需要从dom1中获取数据,那这时候就会发现dom2的试图并没有更新,这时就需要用到nextTick了。

vue中双向数据绑定是如何实现的?

vue2.0

vue2.0的双向数据绑定是通过数据劫持,结合发布订阅的方式来实现的,也就是说数据和视图同步,数据发生变化,视图也会发生变化,视图变化,数据也会随之发生改变。vue2的双向数据绑定核心是object.definedproperty()方法。给vue中的数据绑定get和set方法,当获取数据的时候,调用get()方法,当修改数据的时候调用set()方法。通过watcher监听器去更新视图,完成数据的双向绑定。

主要分为以下几个步骤:
  1.需要observer的数据对象进行递归遍历,包括子属性对象的属性,都应该加上setter和getter,
  这样的话,给这个对象的某个值赋值就会触发setter,那么就能监听到数据的变化了。
  2.compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令
  对应的节点绑定更新函数,添加监听函数的订阅者,一旦数据发生变化,收到通知,更新视图。
  3**.watcher**订阅者是observer和compile之间通信的桥梁,主要做的事情是:在自身实例化时,
  往属性订阅器(dep)里面添加自己;自身必须有一个update()方法;待属性变动dep.notice()通知时,
  能调用自身的update()方法,并触发compile中绑定的回调,则功成身退。
  4.MVVM作为数据绑定的入口,整合observer,compile和watcher三者,通过observer来监听
  自己的model数据变化,通过compile来解析编译模板指令,最终利用watcher搭起observer和compile
  之间的通信的桥梁,达到数据变化——>视图更新——>视图交互变化——>数据module变更的双向绑定效果。

vue3.0

Object.defineProperty 的问题:在Vue中,Object.defineProperty无法监控到数组下标的变化,导致直接通过数组的下标给数组设置值,不能实时响应。目前只针对以上方法做了hack处理,所以数组属性是检测不到的,有局限性Object.defineProperty只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。Vue里,是通过递归以及遍历data对象来实现对数据的监控的,如果属性值也是对象那么需要深度遍历,显然如果能劫持一个完整的对象,不管是对操作性还是性能都会有一个很大的提升。

Proxy的两个优点:可以劫持整个对象,并返回一个新对象,有13种劫持。

vue2和vue3中的v-if和v-for的优先级?

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 true值的时候被渲染。

v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组或者对象,而 item 则是被迭代的数组元素的别名。

在 v-for 的时候,建议设置key值,并且保证每个key值是独一无二的,这便于diff算法进行优化。

在vue中,永远不要把v-if和v-for同时用在同一个元素上,会带来性能方面的浪费。

vue 2.x:当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级

vue 3.x:当 v-if 与 v-for 一起使用时,v-if 具有比 v-for 更高的优先级。

vue中常用的修饰符?

事件修饰符:

stop(阻止事件冒泡)

prevent(阻止默认行为)

self(只触发本身)

once(只触发一次)

captrue(事件捕获,与事件冒泡的方向相反,事件捕获由外向内。)

表单修饰符:

lazy(当光标离开标签之后,才会赋值给value)

trim(过滤掉两边的空格)

number(自动将用户输入的值转化为数值类型。)

键盘修饰符:

普通键(enter、tab、delete、space、esc、up…)

系统修饰键(ctrl、alt、meta、shift…)

配合@keyup.键盘名称即可使用。

自定义指令的详解?

我们了解的vue指令有: v-model,v-show,v-for等,除了这些指令,我们也可以实现自己的自定义指令。在vue中代码的抽取和复用主要是通过组件,如果我们想要对DOM元素进行底层操作,可以通过自定义组件来完成。

自定义指令的分类

自定义局部指令:组件中通过 directives 选项,只能在当前组件中使用;

自定义全局指令: app的 directive 方法,可以在任意组件中被使用;

指令的生命周期

一个自定义指令定义的对象, Vue提供了如下的几个钩子函数

created:元素已创建, 在绑定元素的 attribute 或事件监听器被应用之前调用;

beforeMount:当指令第一次绑定到元素并且在挂载父组件之前调用;

mounted:在绑定元素的父组件被挂载后调用;

beforeUpdate:在更新包含组件的 VNode 之前调用, 绑定元素的内部或后代元素更新也会执行;

updated:在包含组件的 VNode 及其子组件的 VNode 更新后调用;

beforeUnmount:在卸载绑定元素的父组件之前调用;

unmounted:当指令与元素解除绑定且父组件已卸载时,只调用一次;

使用场景

普通dom元素进行底层操作的时候,可以使用自定义指令。

自定义指令是用来操作dom的,尽管vue推崇数据驱动视图的理念,但并不是所有的情况都适合数据驱动,自定义指令就是一种有效的补充和扩展,不仅可用于定义任何的dom操作,并且是可复用的。

使用案例:

初级应用:
  鼠标聚焦
  下拉菜单
  相对时间转换
  滚动动画
高级应用:
  自定义指令实现图片懒加载
  自定义指令集成第三方插件

对vue中的slot插槽的理解?

slot又名插槽,是vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出口。插槽slot是子组件的一个模板标签元素,而在一个标签元素是否显示,以及怎么显示是父组件决定的。slot又分为三类,默认插槽,具名插槽,作用域插槽。

默认插槽:又称匿名插槽,当slot没有指定name属性值的时候,一个组件内只能有一个匿名插槽。

具名插槽:带有具体名字的插槽,也就是带有name属性的slot,一个组件可以出现多个具名插槽。

作用域插槽:默认插槽,剧名插槽的一个变体,可以是匿名插槽,也可以是具名插槽,该插槽的不同点在子组件渲染作用域插槽时,可以将子组件内部的数据传递给父组件,让父组件根据子组件传递过来的数据决定如何渲染该插槽。

vue初始化页面闪动问题的理解?

当网速较慢,vue.js文件还没有加载完时,在页面上会显示{{message}}的字样,知道vue创建实例,编译模板时,dom才会被替换,所以这个过程屏幕是闪动的。

所以解决这个问题,需要在style样式中设置【v-cloak】{display:none}。在一般情况下,v-clock是一个解决初始化慢导致页面闪动的最佳实践,对于简单的项目很实用。

但是在具有工程化的项目里,比如使用了webpack和vue-router的项目中,html结构只是一个空的div元素,剩余的内容都是由路由去挂载不同的组件完成的,所以不需要v-cloak。

vue更新数组时触发视图更新的方法?

vue.set():响应式新增与修改数据 。

用法:target:要更改的数据源(可以是对象或者数组)
key:要更改的具体数据
value :重新赋的值

Vue.delete():删除对象或数组中的元素,通过key或数组索引,可以触发试图更新。

Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

push()    向数组的末尾添加一个或多个元素,并返回新的长度。
pop()     删除最后一个元素,把数组长度减 1,并且返回它删除的元素的值。 
shift()     把数组的第一个元素从其中删除,并返回第一个元素的值。
unshift()   向数组的开头添加一个或更多元素,并返回新的长度。 
splice()    向/从数组中添加/删除项目,然后返回被删除的项目。 该方法会改变原始数组。 
sort()    对数组的元素进行排序。
reverse()   颠倒数组中元素的顺序。
Vue包含一组观察数组变异的方法,使用它们改变数组也会触发视图更新不变异的方法。

不变异的方法:

filter() :过滤数组,会产生一个新的数组。
concat() :该方法用于连接两个或多个数组。不会改变现有的数组,返回一个新的数组。
slice(start,end)截取数组 。


相关文章
|
5月前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
5月前
|
JavaScript
【Vue面试题十五】、说说你对slot的理解?slot使用场景有哪些?
这篇文章深入探讨了Vue中的`slot`概念,包括它的定义、使用场景和分类(默认插槽、具名插槽和作用域插槽),并通过代码示例展示了如何在组件中使用插槽来实现内容的分发和自定义。同时,文章还对插槽的工作原理进行了分析,解释了`renderSlot`函数和`$scopedSlots`对象的角色。
【Vue面试题十五】、说说你对slot的理解?slot使用场景有哪些?
|
5月前
|
JavaScript 前端开发
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
5月前
|
JavaScript 前端开发 数据处理
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
这篇文章讨论了Vue中实现权限管理的策略,包括接口权限、路由权限、菜单权限和按钮权限的控制方法,并提供了不同的实现方案及代码示例,以确保用户只能访问被授权的资源。
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
|
5月前
|
JavaScript 前端开发
【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?
文章讨论了Vue项目目录结构的设计原则和实践,强调了项目结构清晰的重要性,提出了包括语义一致性、单一入口/出口、就近原则、公共文件的绝对路径引用等原则,并展示了单页面和多页面Vue项目的目录结构示例。
|
4月前
|
缓存 JavaScript 前端开发
vue面试题
vue面试题
174 64
|
3月前
|
JavaScript 前端开发
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
48 0
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
|
5月前
|
JavaScript 安全 前端开发
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
这篇文章介绍了Vue项目中解决跨域问题的方法,包括使用CORS设置HTTP头、通过Proxy代理服务器进行请求转发,以及在vue.config.js中配置代理对象的策略。
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
|
5月前
|
JavaScript 前端开发 编译器
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
这篇文章介绍了Vue 3相对于Vue 2的改进和新增特性,包括性能提升、体积减小、更易维护、更好的TypeScript支持、新的Composition API、新增的Teleport和createRenderer功能,以及Vue 3中的非兼容性变更和API的移除或重命名。
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
|
5月前
|
JavaScript 前端开发 API
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?
这篇文章讨论了Vue项目中错误的处理方式,包括后端接口错误和代码逻辑错误的处理策略。文章详细介绍了如何使用axios的拦截器处理后端接口错误,以及Vue提供的全局错误处理函数`errorHandler`和生命周期钩子`errorCaptured`来处理代码中的逻辑错误。此外,还分析了Vue错误处理的源码,解释了`handleError`、`globalHandleError`、`invokeWithErrorHandling`和`logError`函数的作用和处理流程。
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?

热门文章

最新文章