哈喽,大家好!欢迎来到“每日十问”系列!在这个系列中,我们将探讨常见的前端面试题,今天,我们将从Vue篇开始。话不多说,请开始食用!
1.v-model实现双向绑定的原理是什么?
v-model是v-on和v-bind的语法糖v-on用于事件绑定,给当前组件绑定一个input事件。v-bind用于属性绑定,给当前组件绑定一个value属性。
v-model双向绑定的实现:
- 在父组件内给子组件添加
v-model,相当于给组件添加了个value属性,传递的值就是绑定的值。和绑定了一个此绑定值的input事件。- 子组件中使用
prop属性接受这个value值,名字必须是value。- 子组件内部更改
value值的时候,必须通过$emit()事件派发个input事件,并携带最新的值。v-model绑定的input事件会自动监听这个input事件,把接收到的最近新值赋值给v-model绑定的变量。
2.v-show和v-if的区别?
v-show:通过元素的display来控制显示和隐藏v-if:组件是真正的渲染和销毁,而不是显示和隐藏- 频繁切换显示状态时候我们就用
v-show,否则就用v-if
3.组件中的data为什么一定是函数?
- vue中组件是用来复用的,为了防止data复用,将其定义为函数。
- 当我们将组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,拥有自己的作用域,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。
- 当我们组件的date单纯的写成对象形式,这些实例用的是同一个构造函数,由于JavaScript的特性所导致,所有的组件实例共用了一个data,就会造成一个变了全都会变的结果。
4.ajax请求应该放在哪个生命周期
我们先来看一下create和mounted这两个周期有什么区别:
-
created生命周期钩子
- 特点:在组件实例创建完成后立即调用,此时组件的响应式数据已经初始化。
- 适用场景:适用于在组件初始化时需要获取数据的情况。在created钩子中可以发起Ajax请求,获取初始化数据,并将结果保存到组件的数据中。
- 优点:较早地发起请求,可以更快地获取数据并更新组件状态。
- 缺点:在异步渲染开启的情况下,created可能会被中途打断,导致请求可能被多次重复调用,这明显不合适。
-
mounted生命周期钩子
- 特点:在组件被挂载到DOM后调用,此时组件的模板已经渲染到页面中。
- 适用场景:适用于需要在组件挂载后执行操作的情况,例如获取元素的尺寸或绑定事件处理程序。
- 优点:由于mounted在第二阶段,所以绝对不会多次重复调用,这是ajax合适的位置。此时DOM已经渲染出来,可以进行与DOM相关的操作。
- 缺点:相对于created钩子,会稍微晚一些发起请求。
-
watch
- 特点:如果Ajax请求的发起依赖于某个响应式数据的变化,可以使用watch来监听该数据,并在变化时发起请求。
- 适用场景:适用于需要根据数据变化实时更新的情况。这样可以实现响应式地发起请求,当数据变化时自动更新相关的请求结果。
此外,在选择生命周期钩子函数放置ajax请求时,还需要考虑以下因素:
- 性能考虑:虽然created比mounted更早调用,但实际上两者的时间差距非常小,对性能的提升并不明显。
- 服务端渲染:在服务端渲染的情况下,mounted方法不被支持,因此需要统一将ajax请求放在created中。
一般情况下,推荐将ajax请求放在mounted生命周期钩子中,以确保请求的稳定执行和避免重复调用。同时,根据具体的应用场景和需求,可以选择在created或watch选项中发起请求。在组件销毁前,记得取消未完成的Ajax请求,以避免潜在的内存泄漏问题。
5.ajax请求时GET和POST方式的区别
GET请求:
参数在URL后面,安全性不高,传输数据比较小,但是速度快;一般用于获取,删除
POST请求:
参数会放在请求体中,安全性相对高一些,传输数据大,但相对速度慢些;一般是用于修改或添加
6.说说nextTick的使用和原理
在Vue中,DOM更新是异步的。这意味着当数据发生变化时,Vue不会立即更新DOM,而是将更新操作放入一个异步队列中,等待当前事件循环的所有同步操作完成之后,再集中进行DOM更新。
而在某些情况下,我们可能需要在数据变化后立即获取最新的DOM状态,比如希望获取列表更新后的高度等。这时就需要使用nextTick方法。
nextTick是Vue提供的一个工具方法,用于等待下一次DOM更新刷新。它返回一个Promise对象,当DOM更新完成后,该Promise会被resolve。因此,我们可以在nextTick的回调函数中获取最新的DOM状态。
例如:
this.message = 'updated'
this.$nextTick(() => {
// DOM已经更新完成
console.log(this.$el.textContent) // 'updated'
})
需要注意的是,nextTick不支持DOM更新前的回调,如果需要在DOM更新前执行某些操作,可以使用Vue.nextTick方法。
7.watch和computed的区别以及选择
-
computed支持缓存,不支持异步,当有异步操作的时候,无法发起监听的作用,根据依赖的响应式数据动态计算而来的属性,它具有缓存和实时更新的特点,适用于需要进行复杂计算的场景。 -
watch支持异步,监听数据的变化,并在特定数据发生变化时执行自定义的回调函数,适用于需要执行异步操作或复杂逻辑的场景
8.Vue中key的作用是什么?
- 在Vue中,当使用
v-for循环渲染列表时,需要为每个列表添加一个唯一的key属性。 - key的作用是帮助Vue识别每个节点的身份,从而实现高效的列表更新和渲染。
- 当列表数据发生变化时,Vue会根据Key值来判断哪些节点发生了什么变化,从而只更新变化的部分,提高渲染性能。
- 如果列表数据没有唯一标识,可以使用数组的索引作为key值,但这样会导致渲染性能下降,因为每次数据变化都需要重新渲染整个列表
9.Vue中的mixins有什么作用?
mixins是一种用于复用组件功能的方式,可以将多个组件的公共方法、数据等抽离出来,形成一个新的对象,然后在其他组件中通过mixins选项引入该对象,实现功能的复用。mixins可以实现组件之间的代码复用,避免重复编写相同的逻辑。- 但是,mixins也有一些缺点,比如命名冲突、无法检测到组件依赖关系等,因此在使用mixins时要谨慎。
10. Vue中的keep-alive有什么作用?
keep-alive是一个抽象组件,用于缓存组件状态,避免重复渲染。- 当组件被包含在
keep-alive内时,组件的状态会被缓存起来,当再次切换到该组件时,不会重新渲染,而是直接从缓存中读取状态。 - 这样可以提高性能,减少不必要的渲染操作。
- 但是,
keep-alive也会带来一些问题,比如内存泄漏、缓存过多等问题,需要根据具体情况进行权衡。
每天锁定“每日十问”系列,让我们在Vue的世界中一起进步!如果你对这些问题的答案好奇或有更多要分享的,留言告诉我,让我们一起讨论吧!