vue面试题(一)

1=>为什么data是一个函数

每复用一次组件,就会返回一分新的data。
也就说:【每个组件实例创建】一个【私有】的数据空间。各个组件维护各自的数据。
如果单纯的写成对象形式,那么所有组件实例共用了一份data.
就会造成一个发生改变,全部都会发生改变。  
data(){
    return{ }
 }

3=> vue的生命周期 8+2 ok

我们都知道vue常用的8个生命周期,但是这几个生命周期你熟悉吗?
activated keep-alive 专属,组件被激活时调用 [ai k t v ti de], 第一次进入也会触发activated  
deactivated keep-alive 专属,组件被销毁时调用 【di ai k t v ti de】

4=> 怎样理解 Vue 的单项数据流 ok

数据总是从父组件传到子组件,
子组件没有权利修改父组件传过来的数据,[如果你强行更改,vue会有红色的警告,告诉你这个是单向的]
只能请求父组件对原始数据进行修改。

这样会防止从子组件意外改变父组件的状态,
从而导致你的应用的数据流向难以理解。

5=> v-if 和 v-for 为什么不建议一起使用 ok

vue2中先解析v-for然后在解析v-if,[会造成消耗性能]
如果遇到需要同时使用时可以嵌套一层元素  
<template></template>

6 template 的作用

template的作用是模板占位符,可帮助我们包裹元素.
但在循环过程当中,template不会被渲染到页面上

template标签不支持v-show指令,
即v-show="false"对template标签来说不起作用。
template标签支持v-if、v-else-if、v-else、v-for这些指令。

6.1=> vue3 v-for和v-if做了更改

很幸运 vue 3.x 中, v-if 总是优先于 v-for。

07==> Vue的父子组件生命周期钩子函数执行顺序 ok

加载渲染过程
父beforeCreate -> 父created -> 父beforeMount ->
->子beforeCreate -> 子created -> 子beforeMount -> 子mounted -> 父mounted
【你可以理解页面渲染,这样就好理解了】

子组件更新过程
父beforeUpdate -> 子beforeUpdate -> 子updated -> 父updated

父组件更新过程
父beforeUpdate -> 父updated

销毁过程
父beforeDestroy -> 子beforeDestroy -> 子destroyed -> 父destroyed

8. 虚拟DOM是什么?有什么优缺点?

由于在浏览器中频繁操作DOM代价是很昂贵的。会产生一定性能问题。这就是虚拟Dom的产生原因。

Vue2的Virtual DOM 借鉴了开源库 snabbdom 的实现。
Virtual DOM本质就是用一个[原生的JS对象]去[描述]一个[DOM节点],是对真实DOM的一层抽象。
上面这一句话就翻译为代码 就是
<div>
 <p>123</p>
</div>
对应的virtual DOM(伪代码):
var Vnode = {
 tag: 'div',
 children: [
  { tag: 'p', text: '123' }
 ]
};

优点:
1、保证性能下限:虽然它的性能并不是最优的;
但是比起粗暴的DOM操作,还有不错的性能,

2、无需手动操作DOM:我们不需手动去操作DOM,只需要写好代码逻辑,
框架会【根据虚拟DOM】和【数据双向绑定】,
帮我们自动更新视图,提高我们的开发效率。

3、跨平台:虚拟DOM可以进行更方便地跨平台操作,

缺点:
1、无法进行极致优化:虽然虚拟DOM + 合理的优化,足以应对大部分应用的性能需要,
但在一些【性能要求极高】的应用中虚拟DOM无法没满足。
2、首次渲染大量DOM时,由于多了一层DOM计算,会比innerHTML插入慢。

明天继续-----------------------------------------------------------------------------------------------------------------------

1=> Vue3.0 和 2.0 的【响应式原理】区别

Vue3.x 改用 Proxy[pu luo k she] 替代 Object.defineProperty[di fai n prɒ pə ti]。

因为 Proxy 可以直接监听对象和数组的变化,
而Object.defineProperty是不可以直接对【数组】进行监听
Vue2 中修改数组的索引和长度无法被监控到。
对象新增的属性无法被Object.defineProperty监听到

2=> Vuex 页面刷新数据丢失怎么解决?

在刷新页面的时候,将vuex中的只存在本地
也可以使用第三方插件。  vuex-persist (pəˈsɪ s t])插件,
它是为 Vuex 持久化储存而生的一个插件。

3 你都做过哪些 Vue 的性能优化?

语法方面:
v-if 和 v-show 区分使用场景
computed 和 watch 区分场景使用
v-for 遍历必须加 key,key最好是id值,且避免同时使用 v-if

//数据方面
对象层级不要过深,否则性能就会差。
不需要响应式的数据不要放在 data 中(可以使用 Object.freeze() 冻结数据)

// 加载-缓存
路由懒加载
第三方插件的按需加载
适当采用 keep-alive 缓存组件
防抖、节流的运用

4 Vue.mixin 的使用场景和原理

在开发的过程中我们会遇见相同或者相似的逻辑代码。
可以通过vue的 mixin 功能抽离公共的业务逻辑,
然后通过impor再组件中引入。通过mixins注册进来。
这样我们就可以使用mixin中共同的业务逻辑

<script>
import { mixinmethods} from "../mixin.js"
    export default {
        // mixins是固定的,里面传入一个数组
        mixins:[mixinmethods]
    }
</script>

如果组件中data数据与混合中的数据重复,会进行合并。使用data中的数据。
【组件中是可以直接使用混合中的数据的,自己理解】
需要注意的是:声明周期不会进行合并
如果你在混合中使用了生命周期,组件中也是用生命周期。
组件和混合中的生命周期都会被执行。

5. nextTick 使用场景和原理

场景:进行tab切换的时候,当显示A组件的时候。
A组件的input自动聚焦。这个时候获取A组件的input实例就会出现undefiend

为什么会出现undefined?
Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。

原理:
nextTick 将回调延迟到下次 DOM 更新循环之后执行

6、 keep-alive 使用场景和原理

keep-alive 是 Vue 内置的一个组件,可以实现组件缓存,当组件切换时不会对当前组件进行卸载。
常用的两个属性 include/exclude,符合条件的组件或者页面进行缓存。 [include 是页面中的name ]
include的类型可以是字符串,数组,正则。

两个生命周期 activated/deactivated,用来得知当前组件是否处理活跃状态。
keep-alive 运用了 LRU 算法,选择最近【久未使用的组件】予以淘汰。
keep-alive其实还有一个属性max, 最大允许缓存多少个,如果超出最大个数。
会将已缓存组件中最久没有被访问的实例会被销毁掉。

[exs k lu d] exclude 排除

7、Vue.set 方法原理

在两种情况下修改 Vue 是不会触发视图更新的。 
1、给响应式对象新增属性,这个时候是不会跟新视图的
2、直接更改【数组下标】来修改数组的值。

我们可以通过 Vue.set(this.userInfo, 'sex' ,'男') 
或者 this.$forceUpdate() 来解决这个问题

set 原理如下
因为是响应式数据,
我们给对象和数组本身新增了__ob__属性,代表的是 Observer【饿 b zɜ və(r)】 实例。
如对象新增不存在的属性,首先会把新的属性进行响应式跟踪。
当数据发生变化后,watcher【ˈwɑːtʃər]】 去更新视图.
【使用splice方法向数组内添加元素时】该元素会自动被变成响应式的
源码:https://blog.csdn.net/leelxp/article/details/107212555

8 assets 和static【不会打包】的区别

答:相同点:assets【a sai s 】和static两个都是存放静态资源文件,
图片,字体图标,都可以放在这两个文件下。

不相同点:
build的时候会将assets中放置的静态资源文件【会进行】打包压缩上传.
最终会放置在static中跟着index.html一同上传至服务器。

static中放置的静态资源文件就【不会】打包压缩

建议:将项目中样式文件js文件等都可以放置在assets中,
走打包这一流程。减少体积。
而项目中引入的第三方的资源文件如iconfoont.css等文件可以放置在static中,
因为这些引入的第三方文件已经经过处理,我们不再需要处理,直接上传。

巧计:听读音, assets 有压缩。

明天继续看----------------------------------------------------------------------------------------------

1 .vue的两个核心点

答:数据驱动、组件系统
数据驱动:保证数据和视图的一致性。
组件系统:页面中的所有模块可以看作全部是由[组件树]构成的。

2. vue-router 有哪几种导航钩子?

答:三种,
第一种:是全局导航钩子:
router.beforeEach(to,from,next){}
router.afterEach(to,from,next){} 
作用:跳转前进行判断拦截。 2个

第二种:组件内的钩子   
beforeRouteEnter (to, from, next) { }
beforeRouteLeave(to, from, next){ }

第三种:单独路由独享钩子
beforEnter:(to, form,next) => { 
	
}

3. $route 和 $router 的区别

答:$router是VueRouter的实例,{可以导航到不同的URL,使用$router.push方法。}
返回上一个历史用$router.go(-1) 或者 $router.back()

$route为当前router跳转对象。里面可以获取当前路由的name,path,parmas等。

4.vue初始化页面闪动问题

有些时候看到类似于{{message}}的字样,
虽然一般情况下这个时间很短暂,但是我们还是有必要让解决这个问题的。
首先在css里加上
[v-cloak] { [k ləʊ k][掩盖]
	display: none; 
}
如果没有彻底解决问题,则在根元素加上:style="{display: 'block'}"

还有一种方法:使用v-text来解决

5. Vue2中注册在router-link上事件click无效解决方法

使用@click.native。原因:router-link会阻止click事件,.native指直接监听一个原生事件。
在vue3中native被移除了

6. Vue里面router-link在电脑上有用,在安卓上没反应怎么解决?

答:Vue路由在Android机上有问题。
【通过工具查看一下该标签是否被正确解析了,如果没有使用使用一些插件来进行解决】babel问题,

7. vue-loader是什么?使用它的用途有哪些?

答:vue文件的一个加载器,将template/js/style转换成js模块

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

1.用户体验好、快,内容的改变不需要重新加载整个页面。
2.SPA 相对对服务器压力小;

缺点:
初次加载耗时多:因为要在加载页面的时候将 JavaScript、CSS 统一加载,
SEO 难度较大:由于所有的内容都在一个页面中动态替换显示,所以在 SEO 上其有着天然的弱势。

9 vue常用的修饰符 【没有理解】

.stop等同于JavaScript中的event.stopPropagation(),防止事件冒泡;
.prevent:等同于JavaScript中的event.preventDefault(),防止执行预设的行为(如果事件可取消,则取消该事件,而不停止事件的进一步传播);
.capture:与事件冒泡的方向相反,事件捕获由外到内;
.self:只会触发自己范围内的事件,不包含子元素;
.once:只会触发一次

10. Proxy 与 Object.defineProperty 优劣对比

Proxy 的优势如下:
Proxy 可以直接监听对象而非属性;
Proxy 可以直接监听数组的变化;
Proxy 有多达 13 种拦截方法,不限于 apply、ownKeys、deleteProperty、has 等等是 Object.defineProperty 不具备的;
Proxy 返回的是一个新对象,我们可以只操作新的对象达到目的,而 Object.defineProperty 只能遍历对象属性直接修改;
Proxy 作为新标准将受到浏览器厂商重点持续的性能优化,也就是传说中的新标准的性能红利;

Object.defineProperty 的优势如下:
兼容性好,支持 IE9,
而 Proxy 的存在浏览器兼容性问题,而且无法用 polyfill 磨平,
因此 Vue 的作者才声明需要等到下个大版本( 3.0 )才能用 Proxy 重写。

11 vue的自定义指令

和css样式有关的操作 放在bind函数中
bind: function (el) {},

和js行为有关的操作  可以写在inserted()这个函数中去
inserted: function (el) {  el.focus() },

updated(el) {
	//当v-model跟新的时候,就会执行这个函数  这个函数会执行多次  
},

el->表示被绑定了指令的那个元素,这个el是一个原生的js对象
运用的场景:绑定按钮权限的时候,我就使用了 自定义指令

=明天继续看==

1.v-show 与 v-if 有什么区别?ok+

v-if 是真正的条件渲染,也是惰性的;
如果在初始渲染时条件为假,则什么也不做——
直到[条件第一次变为真]时,才会开始渲染

v-show 不管初始条件是什么,元素总是会被渲染.
并且只是简单地基于 CSS 的 “display” 属性进行切换。

频繁切换使用v-show, 切换较少使用v-if

2.computed 和 watch 的区别和运用的场景?ok

computed: 是计算属性,computed 的值有缓存。
只有它[依赖的属性值]发生改变,computed 的值时才会重新计算。

watch: 更多的是「观察」的作用,类似于某些[数据的监听回调]。
每当监听的数据变化时,都会执行回调,进行后续操作。

场景:
{form表单中的input都必须有有值, 按钮才能够进行点击 我们就可以使用computed  }
当我们需要在数据变化时【执行异步】或【开销较大】的操作时,应该使用 watch

3. v-model 的原理?ok

v-model 在内部为不同的输入元素[使用不同的属性]并[抛出不同]的事件:
text 和 textarea 元素使用 value 属性和 input 事件;
checkbox 和 radio 使用 checked 属性和 change 事件;
select 字段将 value 作为 prop 并将 change 作为事件。

4. vue-router 路由模式有几种? ok

vue-router 有 3 种路由模式:hash、history、abstract,对应的源码如下所示:
hash: 使用 hash 值来作路由。支持所有浏览器。
history : 有些浏览器不支持
abstract : [ æ bˈstræ k t] 支持所有 JavaScript 运行环境,如 Node.js 服务器端。
如果发现没有浏览器的 API,路由【会自动强制进入】这个模式.

6. 虚拟 DOM 实现原理?

虚拟 DOM 的实现原理主要包括以下 3 部分:
1.用一个[原生的JS对象]去[描述]一个[DOM节点],是对真实DOM的一层抽象。
2.diff 算法 — 比较两棵虚拟 DOM 树的差异;【dif算法比较两颗树直接的差异】
3.pach 【帕其】算法 — 将两【个虚拟DOM对象的差异】应用到【真正的 DOM 树】。

7、Vue 中的 key 有什么作用? ok

key 是 Vue中vnode的唯一标记,通过这个key,我们的diff操作可以更准确、更快速。

2.更准确表现在sameNode函数 a.key === b.key 对比中可以避免就地复用的情况。所以会更加准确。
(我的理解:通过 sameNode函数对比key值,避免了就地复用的情况,所以会更加的准确)

3.更快速:利用key的唯一性生成map对象,来获取对应节点,比遍历方式更快。

8. key的实际运用场景

1.处理勾选时候的bug。 比如列表中有 【A,B,C】
我们勾选B,向列表中添加D,列表是[D,A,B,C]此时却勾选了A

2.key值应该是唯一的。最后使用id值。
为什么使用id值,而不是index

本文的地址 :https://juejin.cn/post/6844903918753808398#heading-22
地址来源:https://zhuanlan.zhihu.com/p/92407628
本文的源地址:https://www.cnblogs.com/wenshaochang123/p/14888494.html
本文的源地址:https://www.jianshu.com/p/38f38f61b557

继续=================================================================

1.Vue是什么?(了解就可以)

1.是一套用于构建用户界面的渐进式框架,自底向上逐层应用。
2.vue核心只关注视图层,不仅容易上手,而且方便与第三方库整合。
3.当与现代化的工具以及各种支持类库结合使用时,完全能够为复杂的单页应用提供驱动。

2.Vue的优点 (了解)

1.开发者:只关注视图,简单易学,
2.双向数据绑定,操作数据简单
3.组件化,构建单页面有优势
4.视图数据分离,使用数据更方便
5.虚拟DOM+diff算法,提高页面的渲染速度

3.watch的使用

watch: {
    firstName(newName, oldName) {
      // newName 是新值,oldName旧值
    },
    immediate: true,
} 
immediate: 立即监视, deep : 深度监视 

4.常用的事件修饰符

.stop ==> event.stopPropagation() 阻止事件冒泡
.prevent ==> event.preventDefault() 取消默认事件,不停止传播
.capture ==> 事件捕获
.self ==> 只触发自己范围内的事件, 不包含子元素
.once ==> 只会触发一次

5.你对slot的理解

slot是 vue 内容分发机制,插槽是子组件的一个模板标签。
这个标签由父组件决定,有默认插槽,具名插槽和作用域插槽。
默认:匿名插槽,直接在组件送写slot。一个组件只能有一个匿名
具名:带有名字的插槽,slot name='xxx'可以有多个。
作用域: 可以有名字也可以无,不同点,在子组件渲染时,
可以将子组件内部的数据传递给父组件,父组件根据子组件的数据决定如何渲染

6.Vue模版编译原理

解析阶段:对 template 字符串解析,将标签,指令,属性转为抽象语法树 AST
优化阶段:遍历 AST 找其中的静态节点进行标记,方便在重新渲染的时候进行 diff 比较时 ,跳过一些静态节点
生成阶段:将 AST 转为 render函数字符串

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

作者:明月人倚楼
出处:https://www.cnblogs.com/IwishIcould/

想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!

万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!

想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

支付宝
微信
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
原文地址:https://www.cnblogs.com/IwishIcould/p/15659118.html