vue面试题 内含详细讲解(涵盖入门到精通,自测 Vue 掌握程度(1)

因为组件是用来复用的,且 JS 里对象是引用关系,如果组件中 data 是一个对象,那么这样作用域没有隔离,子组件中的 data 属性值会相互影响,如果组件中 data 选项是一个函数,那么每个实例可以维护一份被返回对象的独立的拷贝,组件实例之间的 data 属性值不会互相影响;而 new Vue 的实例,是不会被复用的,因此不存在引用对象的问题。

14、v-model 的原理?

============================================================================

我们在 vue 项目中主要使用 v-model 指令在表单 input、textarea、select 等元素上创建双向数据绑定,我们知道 v-model 本质上不过是语法糖,v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:

  • text 和 textarea 元素使用 value 属性和 input 事件;

  • checkbox 和 radio 使用 checked 属性和 change 事件;

  • select 字段将 value 作为 prop 并将 change 作为事件。

以 input 表单元素为例:

相当于

<input v-bind:value=“something” v-on:input="something =

$event.target.value">

复制代码如果在自定义组件中,v-model 默认会利用名为 value 的 prop 和名为 input 的事件,如下所示:

父组件:

子组件:

{{value}}

props:{

value: String

},

methods: {

test1(){

this.$emit(‘input’, ‘小红’)

},

},

15、Vue 组件间通信有哪几种方式?

================================================================================

VVue 组件间通信只要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信,

(1)props / $emit 适用 父子组件通信

这种方法是 Vue 组件的基础,相信大部分同学耳闻能详,所以此处就不举例展开介绍。

(2)ref 与 $parent / $children 适用 父子组件通信

  • ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例

  • $parent / $children:访问父 / 子实例

(3)EventBus ($emit / $on) 适用于 父子、隔代、兄弟组件通信

这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件。

(4) a t t r s / attrs/ attrs/listeners 适用于 隔代组件通信

  • a t t r s : 包 含 了 父 作 用 域 中 不 被 p r o p 所 识 别 ( 且 获 取 ) 的 特 性 绑 定 ( c l a s s 和 s t y l e 除 外 ) 。 当 一 个 组 件 没 有 声 明 任 何 p r o p 时 , 这 里 会 包 含 所 有 父 作 用 域 的 绑 定 ( c l a s s 和 s t y l e 除 外 ) , 并 且 可 以 通 过 v − b i n d = " attrs:包含了父作用域中不被 prop 所识别 (且获取) 的特性绑定 ( class 和 style 除外 )。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 ( class 和 style 除外 ),并且可以通过 v-bind=" attrs:包含了父作用域中不被prop所识别(且获取)的特性绑定(class和style除外)。当一个组件没有声明任何prop时,这里会包含所有父作用域的绑定(class和style除外),并且可以通过v−bind=“attrs” 传入内部组件。通常配合 inheritAttrs 选项一起使用。

  • l i s t e n e r s : 包 含 了 父 作 用 域 中 的 ( 不 含 . n a t i v e 修 饰 器 的 ) v − o n 事 件 监 听 器 。 它 可 以 通 过 v − o n = " listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on=" listeners:包含了父作用域中的(不含.native修饰器的)v−on事件监听器。它可以通过v−on=“listeners” 传入内部组件

(5)provide / inject 适用于 隔代组件通信

祖先组件中通过 provider 来提供变量,然后在子孙组件中通过 inject 来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。

(6)Vuex 适用于 父子、隔代、兄弟组件通信

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。

  • Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  • 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化

16.vuex

====================================================================

Vuex 是一个专为Vue.js应用程序开发的状态模式。每一个Vuex的应用的核心就是store(仓库)。store 基本上就是一个容器,它包含着你的应用中大部分的状态

(1)Vuex 的状态存储是响应式的。当Vue 组件从store 中读取状态的时候,若store 中的状态发送变化,那么相应的组件也会相应地得到更高效地更新。

(2) 改变store中的状态唯一途径就是显示地提交(commit) mutation 。这样使得我们可以方便得跟踪每一个状态的变化

包括以下几个模块:

  • state: 定义应用模块状态数据结构,可设置初始状态

  • Getter: 允许组件store 中获取数据,mapgetters 辅助函数仅仅是将store 中的 getter 映射到局部计算属性

  • Mutation : 是唯一更改 store 中状态地方法,且必须是同步函数

  • Action: 用于提交 mutation, 而不是直接变更状态,可以包含任意异步操作

  • Module: 允许将单一地store 拆分为多个 store 且同时存在单一状态树中

17.使用过vue SSR ? 说下SSR

==================================================================================

1)服务端渲染的优点:

  • 更好的 SEO: 因为 SPA 页面的内容是通过 Ajax 获取,而搜索引擎爬取工具并不会等待 Ajax 异步完成后再抓取页面内容,所以在 SPA 中是抓取不到页面通过 Ajax 获取到的内容;而 SSR 是直接由服务端返回已经渲染好的页面(数据已经包含在页面中),所以搜索引擎爬取工具可以抓取渲染好的页面;

  • 更快的内容到达时间(首屏加载更快): SPA 会等待所有 Vue 编译后的 js 文件都下载完成后,才开始进行页面的渲染,文件下载等需要一定的时间等,所以首屏渲染需要一定的时间;SSR 直接由服务端渲染好页面直接返回显示,无需等待下载 js 文件及再去渲染等,所以 SSR 有更快的内容到达时间;

(2) 服务端渲染的缺点:

  • 更多的开发条件限制: 例如服务端渲染只支持 beforCreate 和 created 两个钩子函数,这会导致一些外部扩展库需要特殊处理,才能在服务端渲染应用程序中运行;并且与可以部署在任何静态文件服务器上的完全静态单页面应用程序 SPA 不同,服务端渲染应用程序,需要处于 Node.js server 运行环境;

  • 更多的服务器负载:在 Node.js 中渲染完整的应用程序,显然会比仅仅提供静态文件的 server 更加大量占用CPU 资源 (CPU-intensive - CPU 密集),因此如果你预料在高流量环境 ( high traffic ) 下使用,请准备相应的服务器负载,并明智地采用缓存策略。

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

=====================================================================================

vue-router 有 3 种路由模式:hash、history、abstract,对应的源码如下所示:

switch (mode) {

case ‘history’:

this.history = new HTML5History(this, options.base)

break

case ‘hash’:

this.history = new HashHistory(this, options.base, this.fallback)

break

case ‘abstract’:

this.history = new AbstractHistory(this, options.base)

break

default:

if (process.env.NODE_ENV !== ‘production’) {

assert(false, invalid mode: ${mode})

}

}

复制代码其中,3 种路由模式的说明如下:

  • hash: 使用 URL hash 值来作路由。支持所有浏览器,包括不支持 HTML5 History Api 的浏览器;

  • history : 依赖 HTML5 History API 和服务器配置。具体可以查看 HTML5 History 模式;

  • abstract : 支持所有 JavaScript 运行环境,如 Node.js 服务器端。如果发现没有浏览器的 API,路由会自动强制进入这个模式.、

19. 能说下 vue-router中 常用的 hash 和 history 路由模式实现原理?

==============================================================================================================

(1) hash 模式的实现原理

早期的前端路由的实现是基于location实现的, location.hash 的值就是 url 中

https://www.word.com#search // 这个location.hash 值为#search

hash 路由的几个特征:

  • url 中hash 值是客户端的一种状态,当服务器发出请求时,hash 部分不会发送

  • hash 值得改变, 都会在浏览器得访问历史中存储一个记录。

  • 可以通过a 标签,设置href 属性,当用户点击这个标签时,url 得hash 值就会发生改变;

  • 使用js 来对location.hash 进行赋值,改变url 得 hash 值

  • 可以通过通过hashchange 事件来监听hash 得变化,从而对页面进行跳转或者渲染

(2) history 模式得实现以及原理

html5 提供了 history Api 来实现url 得变化, 主要有两个:

history.pushState () 和 history.repalceState() .这两个api 可以在不进行刷新得情况下, 操作浏览器历史记录, 唯一不同得时,前者时新增一个历史记录, 后者是替换当前历史记录,如下:

window.history.pushState(null, null, path);

window.history.replaceState(null, null, path);

history 路由模式实现得几个特征:

  • pushState 和 replaceState 两个api 来操作实现url 的变化;

  • 可以使用popstate 事件监听url 得变化, 从而对页面进行跳转

  • history.pushState() 或 historyState() 不会触发 postate 事件, 这时需要手动触发

20.什么是MVVM ?

=========================================================================

  • Model : 指数据模型,各种业务逻辑和数据操控,对于前端来说就是后端提供api

  • view: 实施图层,用户界面。(由html 和 css 来构建)

  • ViewModel: 由前端开发人员组织生成得维护视图数据层。 前端开发者对从后端获取得Model数据进行转换处理,做二次封装,,以生成符合vuew 层使用预期得视图数据模型。

MVVM 框架实现了双向数据绑定,这样vm得内容实时展现在view层,mvvm 把数据交换做好了,开发者只需要处理维护ViewModel,更新视图就会自动得到相应更新。

案例:

(1) View 层

{{message}}

Click me

(2) ViewModel 层

var app = new Vue({

el: ‘#app’,

data: { // 用于描述视图状态

message: ‘Hello Vue!’,

},

methods: { // 用于描述视图行为

showMessage(){

let vm = this;

alert(vm.message);

}

},

created(){

let vm = this;

// Ajax 获取 Model 层的数据

ajax({

url: ‘/your/server/data/api’,

success(res){

vm.message = res;

}

});

}

})

(3) Model层

{

“url”: “/your/server/data/api”,

“res”: {

“success”: true,

“name”: “IoveC”,

“domain”: “www.cnblogs.com”

}

}

21.Vue 是如何实现双向数据绑定的?

=================================================================================

什么是双向数据绑定?

vue双向数据绑定是指: 数据变化更新视图,试图变化更新数据,

在这里插入图片描述

其中,View 变化更新Data ,可以通过事件监听的方式来实现,所以Vue 的数据双向绑定的工作主要是如何根据Data 变化更新View 。

vue 主要通过一下 4 个 步骤来实现数据双向绑定:

实现一个监听器 Observer: 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() 对属性都加上 setter 和 getter。这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到了数据变化。

实现一个解析器 Compile: 解析 Vue 模板指令,将模板中的变量都替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,调用更新函数进行数据更新。

实现一个订阅者 Watcher: Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁 ,主要的任务是订阅 Observer 中的属性值变化的消息,当收到属性值变化的消息时,触发解析器 Compile 中对应的更新函数。

实现一个订阅器 Dep: 订阅器采用 发布-订阅 设计模式,用来收集订阅者 Watcher,对监听器 Observer 和 订阅者 Watcher 进行统一管理。

22 vue 框架如何实现对象和数组的监听?

===================================================================================

vue如何实现双向数据绑定, 通过 Object.defineProperty() 对数据进行劫持,但是 object.defineProperty() 只能对属性进行劫持,不能对整个对象进行劫持,同样无法对数组进行劫持

Vue 能检测到对象和数组(部分方法的操作)的变化,那它是怎么实现的呢?我们查看相关代码如下:

/**

  • Observe a list of Array items.

*/

observeArray (items: Array) {

for (let i = 0, l = items.length; i < l; i++) {

observe(items[i]) // observe 功能为监测数据的变化

}

}

/**

  • 对属性进行递归遍历

*/

let childOb = !shallow && observe(val) // observe 功能为监测数据的变化

23 .Proxy 与 object.defineProperty 优劣对比

===================================================================================================

Proxy 的又是如下:

  • Proxy 可以直接监听对象而非属性

  • proxy 可以直接监听数组的变化

  • proxy 有多达 13 种拦截方法,不限于apply ownKeys deleteProperty has

  • proxy 返回的是一个新对象而 ,object.defineProperty 只能遍历对象属性直接修改

  • proxy 作为新标准受到浏览器重点持续性的性能优化

object.defineProperty 的劣势如下:

  • 兼容性好,支持IE9,而 proxy 的 内存浏览器兼容性问题,而且无法用polyfill 磨平

24. Vue 作用vm.$set() 解决对象新增属性不能影响的问题?

==================================================================================================

受现代js限制,Vue无法检测到对象属性的添加或删除。 由于Vue 会在初始化实例时对属性执行getter/ setter 转化,所以属性必须在data对象上存在才能让Vue 将它转化为响应式的。但是 Vue 提供了 Vue.set (object, propertyName, value) / vm.$set (object, propertyName, value) 来实现为对象添加响应式属性

vm.$set 的实现原理是:

  • 如果目标是数组,直接用数组的 splice 方法触发响应式

  • 如果目标是对象,会先判断属性是否存在,对象是否是响应式,最终,最终如果要对属性进行响应式处理,则是通过调用 defineReactive 方法进行响应式处理( defineReactive 方法就是 Vue 在初始化对象时,给对象属性采用 Object.defineProperty 动态添加 getter 和 setter 的功能所调用的方法)

虚拟dom 的优缺点?

========================================================================

优点:

  • 可以下限: 框架的虚拟 DOM 需要适配任何上层 API 可能产生的操作,它的一些 DOM 操作的实现必须是普适的,所以它的性能并不是最优的;但是比起粗暴的 DOM 操作性能要好很多,因此框架的虚拟 DOM 至少可以保证在你不需要手动优化的情况下,依然可以提供还不错的性能,即保证性能的下限;

  • 无需手动操作dom: 不再手动去操作dom ,只需要写好 View- Model 的代码逻辑,框架会根据虚拟dom 和 双向数据绑定,帮我们可以预期的方式更新视图,极大提高开发效率

  • 跨平台: 虚拟dom 本质上是js对象,而dom与平台强相关,相比之下虚拟dom 可以进行更方便的跨平台操作,例如: 服务器渲染,weex开发等等

缺点:

  • 无法进行极致优化:在一些性能极高的应用下虚拟dom无法进行针对性的极致优化

26. 虚拟dom 实现原理?

=============================================================================

  • 用js 对象模拟真实dom树,对真实dom进行抽象

  • diff 算法 一比较两颗dom树的差异

  • pach 算法 一 将两个dom 对象 的差异 应用到真正的dom 树

27.Vue 中的 key 有什么作用?

=================================================================================

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

更准确:因为带 key 就不是就地复用了,在 sameNode 函数 a.key === b.key 对比中可以避免就地复用的情况。所以会更加准确。

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

28. 你有对 Vue 项目进行哪些优化?

===================================================================================

(1)代码层面的优化

v-if 和 v-show 区分使用场景

computed 和 watch 区分使用场景

v-for 遍历必须为 item 添加 key,且避免同时使用 v-if

长列表性能优化

事件的销毁

图片资源懒加载

路由懒加载

第三方插件的按需引入

优化无限列表性能

服务端渲染 SSR or 预渲染

(2)Webpack 层面的优化

Webpack 对图片进行压缩

减少 ES6 转为 ES5 的冗余代码

提取公共代码

模板预编译

提取组件的 CSS

优化 SourceMap

构建结果输出分析

Vue 项目的编译优化

(3)基础的 Web 技术的优化

开启 gzip 压缩

浏览器缓存

CDN 的使用

使用 Chrome Performance 查找性能瓶颈

29.对于即将到来的 vue3.0 特性你有什么了解的吗?

==========================================================================================

Vue 3.0 正走在发布的路上,Vue 3.0 的目标是让 Vue 核心变得更小、更快、更强大,因此 Vue 3.0 增加以下这些新特性:

1)监测机制的改变

3.0 将带来基于代理 Proxy 的 observer 实现,提供全语言覆盖的反应性跟踪。这消除了 Vue 2 当中基于 Object.defineProperty 的实现所存在的很多限制:

  • 只能监测属性,不能监测对象

  • 检测属性的添加和删除;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

自学几个月前端,为什么感觉什么都没学到??


这种现象在很多的初学者和自学前端的同学中是比较的常见的。

因为自学走的弯路是比较的多的,会踩很多的坑,学习的过程中是比较的迷茫的。

最重要的是,在学习的过程中,不知道每个部分该学哪些知识点,学到什么程度才算好,学了能做什么。

很多自学的朋友往往都是自己去找资料学习的,资料上有的或许就学到了,资料上没有的或许就没有学到。

这就会给人一个错误的信息就是,我把资料上的学完了,估计也-就差不多的了。

但是真的是这样的吗?非也,因为很多人找的资料就是很基础的。学完了也就是掌握一点基础的东西。分享给你一份前端分析路线,你可以参考。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-eGWA2eeR-1710700553037)]

自学几个月前端,为什么感觉什么都没学到??


这种现象在很多的初学者和自学前端的同学中是比较的常见的。

因为自学走的弯路是比较的多的,会踩很多的坑,学习的过程中是比较的迷茫的。

最重要的是,在学习的过程中,不知道每个部分该学哪些知识点,学到什么程度才算好,学了能做什么。

很多自学的朋友往往都是自己去找资料学习的,资料上有的或许就学到了,资料上没有的或许就没有学到。

这就会给人一个错误的信息就是,我把资料上的学完了,估计也-就差不多的了。

但是真的是这样的吗?非也,因为很多人找的资料就是很基础的。学完了也就是掌握一点基础的东西。分享给你一份前端分析路线,你可以参考。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

所以学习编程一定要注重实践操作,练习敲代码的时间一定要多余看视频的时间。

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值