zoukankan      html  css  js  c++  java
  • vue面试题【九】

    1. Vue.js介绍

    Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API;

    Vue.js是一个构建数据驱动的Web界面的库。

    Vue.js是一套构建用户界面的 渐进式框架。与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计。Vue的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合。另一方面,Vue 完全有能力驱动采用单文件组件和 Vue生态系统支持的库开发的复杂单页应用。数据驱动+组件化的前端开发。

    简而言之:Vue.js是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API实现响应的数据绑定和组合的视图组件。核心是一个响应的数据绑定系统。

    2、使用Vue的好处

    vue两大特点:响应式编程、组件化

    vue的优势:轻量级框架、简单易学、双向数据绑定、组件化、视图、数据和结构的分离、虚拟DOM、运行速度快

    3、MVVM定义

    MVVM是Model-View-ViewModel的简写。即模型-视图-视图模型。【模型】指的是后端传递的数据。【视图】指的是所看到的页面。【视图模型】mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。总结:在MVVM的框架下视图和模型是不能直接通信的。它们通过ViewModel来通信,ViewModel通常要实现一个observer观察者,当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定。并且MVVM中的View 和 ViewModel可以互相通信

    4、Vue的生命周期

    beforeCreate(创建前) 在数据观测和初始化事件还未开始

    created(创建后) 完成数据观测,属性和方法的运算,初始化事件,$el属性还没有显示出来

    beforeMount(载入前) 在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。

    mounted(载入后) 在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。

    beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。

    updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

    beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。

    destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

    5、Vue的响应式原理

    当一个Vue实例创建时,vue会遍历data选项的属性,用 Object.defineProperty 将它们转为 getter/setter并且在内部追踪相关依赖,在属性被访问和修改时通知变化。 每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。

    6、第一次页面加载会触发哪几个钩子?

    触发 下面这几个beforeCreate, created, beforeMount, mounted ,并在mounted的时候DOM渲染完成

    7、vue中data必须是一个函数

    对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。

    8、vue中做数据渲染的时候如何保证将数据原样输出?

    v-text:将数据输出到元素内部,如果输出的数据有HTML代码,会作为普通文本输出

    v-html:将数据输出到元素内部,如果输出的数据有HTML代码,会被渲染

    {{}}:插值表达式,可以直接获取Vue实例中定义的数据或函数,使用插值表达式的时候,值可能闪烁;而使用v-html、v-text不会闪烁,有值就显示,没值就隐藏

    9、active-class是哪个组件的属性?

    vue-router模块的router-link组件。

    10、vue-router有哪几种导航钩子?

    三种。

    一种是全局导航钩子:router.beforeEach(to,from,next),作用:跳转前进行判断拦截。

    第二种:组件内的钩子;

    第三种:单独路由独享组件

    11、routeroute和router的区别

    routepathparamshashqueryfullPathmatchednameroute是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而router是“路由实例”对象包括了路由的跳转方法,钩子函数等

    12、vue几种常用的指令

    v-for 、 v-if 、v-bind、v-on、v-show、v-else

    13、v-if 和 v-show 区别

    v-if按照条件是否渲染,v-show是display的block或none

    14、vue常用的修饰符?

    .prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用

    15、vue-loader是什么?使用它的用途有哪些?

    解析.vue文件的一个加载器,跟template/js/style转换成js模块。

    用途:js可以写es6、style样式可以scss或less、template可以加jade等

    16、computed、watch、methods的区别

    computed计算属性是用来声明式的描述一个值依赖了其它的值。当你在模板里把数据绑定到一个计算属性上时,Vue 会在其依赖的任何值导致该计算属性改变时更新 DOM。这个功能非常强大,它可以让你的代码更加声明式、数据驱动并且易于维护。

    watch监听的是你定义的变量,当你定义的变量的值发生变化时,调用对应的方法。就好在div写一个表达式name,data里写入num和lastname,firstname,在watch里当num的值发生变化时,就会调用num的方法,方法里面的形参对应的是num的新值和旧值,而计算属性computed,计算的是Name依赖的值,它不能计算在data中已经定义过的变量。

    methods方法,函数,绑定事件调用;不会使用缓存

    17、什么是js的冒泡?Vue中如何阻止冒泡事件?

    js冒泡概念:当父元素内多级子元素绑定了同一个事件,js会依次从内往外或者从外往内(?)执行每个元素的该事件,从而引发冒泡

    js解决冒泡:event.stopPropagation()

    vue解决冒泡: 事件.stop,例如:@click.stop="" ,@mouseover.stop=""

    18、vue 组件通信

    1.父组件与子组件传值

    父组件传给子组件:子组件通过props方法接受数据;

    子组件传给父组件:$emit方法传递参数

    2.非父子组件间的数据传递,兄弟组件传值

    eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。也可使用vuex

    19、的作用是什么?

    包裹动态组件时,会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。 大白话: 比如有一个列表和一个详情,那么用户就会经常执行打开详情=>返回列表=>打开详情…这样的话列表和详情都是一个频率很高的页面,那么就可以对列表组件使用进行缓存,这样用户每次返回列表的时候,都能从缓存中快速渲染,而不是重新渲染

    20、$nextTick是什么?

    vue实现响应式并不是数据发生变化后dom立即变化,而是按照一定的策略来进行dom更新。

    $nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM

    21、Vue子组件调用父组件的方法

    第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法

    第二种方法是在子组件里用$emit向父组件触发一个事件,父组件监听这个事件就行了。

    22、Promise对象是什么?

    1.Promise是异步编程的一种解决方案,它是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。promise对象是一个构造函数,用来生成Promise实例;

    2.promise的两个特点 对象状态不受外界影响 && 一旦状态改变,就不会再变,任何时候都可以得到结果(pending状态–>fulfilled || pending–>rejected)

    23、axios的特点有哪些?

    1、axios是一个基于promise的HTTP库,支持promise的所有API;

    2、它可以拦截请求和响应;

    3、它可以转换请求数据和响应数据,并对响应回来的内容自动转换为json类型的数据;

    4、它安全性更高,客户端支持防御XSRF;

    24、vue中的 ref 是什么?

    ref 被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例。

    25、vue如何兼容ie

    babel-polyfill插件

    26、页面刷新vuex被清空解决办法?

    1.localStorage 存储到本地再回去

    2.重新获取接口获取数据

    27、Vue与Angular以及React的区别?

    1.与AngularJS的区别

    相同点:

    都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。

    不同点:

    AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观;在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢;Vue.js使用基于依赖追踪的观察并且使用异步队列更新,所有的数据都是独立触发的。

    2.与React的区别

    相同点:

    React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用;中心思想相同:一切都是组件,组件实例之间可以嵌套;都提供合理的钩子函数,可以让开发者定制化地去处理需求;都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载;在组件开发中都支持mixins的特性。

    不同点:

    React采用的Virtual DOM会对渲染出来的结果做脏检查;Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作Virtual DOM。

    28、localstorage和sessionstorage是什么?区别是什么?

    localstorage和sessionstorage一样都是用来存储客户端临时信息的对象,他们均只能存储字符串类型对象

    localstorage生命周期是永久的,这意味着除非用户在浏览器提供的UI上清除localstorage信息,否则这些信息将永远存在。

    sessionstorage生命周期为当前窗口或标签,一旦窗口或标签被永久关闭了,那么所有通过sessionstorage存储的数据也将被清空。

    不同浏览器无法共享localstorage或sessionstorage中的信息。相同浏览器的不同页面可以共享相同的localstorage(页面属于相同的域名和端口),但是不同页面或标签间无法共享sessionstorage。这里需要注意的是,页面及标签仅指顶级窗口,如果一个标签页包含多个iframe标签他们属于同源页面,那么他们之间是可以共享sessionstorage的。

    29、为什么要进行前后端分离?前后端分离的优势在哪里?劣势在哪里?

    优点:前端专门负责前端页面和特效的编写,后端专门负责后端业务逻辑的处理,前端追求的是页面美观、页面流畅、页面兼容等。后端追求的是三高(高并发、高可用、高性能)让他们各自负责各自的领域,让专业的人负责处理专业的事情,提高开发效率

    缺点:1 、当接口发生改变的时候,前后端都需要改变

           2、 当发生异常的时候,前后端需要联调--联调是非常浪费时间的
    

    30、vue中key值的作用?

    多层渲染的时候很容易出现的问题,key值需要提供一个唯一的key值(常用ID),以便它能跟踪每个节点的身份,从而重用和重新排序现有元素
    v-for渲染的列表的结构采用“就地复用”的策略,也就说当数据重新排列数据时,会复用已在页面渲染好的元素,不会移动 DOM 元素来匹配数据项的顺序,这种模式是高效的,改变现有位置的结构的数据即可;

    31、Vue 组件中 data 为什么必须是函数?

    对象为引用类型,当重用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。

    32、vue中编写可复用的组件

    全局引用和局部引用,使用component方法

    1. 全局引用用于全局公共使用的组件
    2. 局部使用,使用与所有模块需要重复用到的组件,如按钮,输入框,上传图片,数据验证,等等

    需要引用的地方为父组件、可服用的组件未子组件
    1.父组件向子组件传值用props
    2.传递的数据为单项数据流

    组件关系可分为父子组件通信、兄弟组件通信、跨级组件通信

    33、vue如何监听键盘事件中的按键?

    <input @keyup.enter=“function”> 直接方法.就可以了

    .delete	delete(删除)/BackSpace(退格)
    .tab	Tab
    .enter	Enter(回车)
    .esc	Esc(退出)
    .space	Space(空格键)
    .left	Left(左箭头)
    .up	Up(上箭头)
    .right	Right(右箭头)
    .down	Down(下箭头)
    .ctrl	Ctrl
    .alt	Alt
    .shift	Shift
    .meta	(window系统下是window键,mac下是command键)
    

    34、vue中对于对象的更改检测

    let a='篮球'
    let b={}
    b={
    a:a
    }
    

    或者用Object.assign() 浅拷贝 将基本类型值进行拷贝

    let obj={ 'hobby': '单车' }
    this.testObj = Object.assign({}, this.testObj, obj)
    console.log(this.testObj)
    

    35、解决非工程化项目初始化页面闪动问题

    vue页面在加载的时候闪烁花括号{}},v-cloak指令和css规则如[v-cloak]{display:none}一起用时,这个指令可以隐藏未编译的Mustache标签直到实例准备完毕。

    /*css样式*/
    [v-cloak] {
          display: none;
        }
    
    <!--html代码-->
    <div id="app" v-cloak>
        <ul>
          <li v-for="item in tabs">{{item.text}}</li>
        </ul>
      </div>
    

    36、v-for产生的列表,实现active的切换

    v-for生成序列

    <ul>
          <li v-for="(info,index) in list" :key="info.id" @click="select(index)" v-bind:class="{'active':info.active}">{{info.name}}</li>
    </ul>
    

    data数据

    list:[
            {
              name:'a',
              id:1,
              active:false
            },
            {
              name:'b',
              id:2,
              active:false
            },
            {
              name:'c',
              id:3,
              active:false
            },
            {
              name:'d',
              id:4,
              active:false
            },
          ]
    

    点击事件

    select(d){
          this.list.map(s=>s.active=false);
          this.list[d].active=true;
        },
    

    CSS样式

    <style scoped>
    li.active{
      background-color: red;
    }
    

    37、十个常用的自定义过滤器

    38、vue的计算属性

    39、vue提供的几种脚手架模板

    40、vue父组件向子组件通过props传递数据

    41、vue-cli开发环境使用全局常量

    42、vue-cli生产环境使用全局常量

    43、vue弹窗后如何禁止滚动条滚动?

    44、计算属性的缓存和方法调用的区别

    45、vue-cli中自定义指令的使用

    46、父组件异步获取动态数据传递给子组件

    vuex 状态管理高频试题

    47、如何在组件中去使用vuex的值和方法?

    47、什么是vuex?

    axios、fetch、ajax等请求高频试题

    48、axios、fetch与ajax有什么区别?

    49、JS的同源策略和跨域问题

    50、如何解决跨域问题?

    51、axios有哪些特点?

    前端 UI 样式高频试题

    52、组件样式属性 scoped 问题及解决方法

    53、vue常用的UI组件库

    54、 vue组件适配移动端【经典】

    55、移动端适配常用媒体查询源码

    56、垂直居中对齐

    57、vue-cli中如何使用背景图片?

    58、 使用表单禁用时移动端样式问题

    59、多种类型文本超出隐藏问题

    60、vue-cli工程引入全局less变量

    vue中常用功能实现与详解

    61、vue中如何实现tab切换功能?

    62、利用标签实现某个组件缓存功能

    63、vue中实现切换页面时为左滑出效果

    64、vue无痕刷新

    65、多种情景的数组去重

    66、vue保留滚动条位置

    67、vue组件中使用定时器

    68、组件slot使用示例

    69、使用递归组件实现级联选择器

    70、使用递归组件实现树形控件

    几种常见的自定义指令详解

    71、实现一个表单自动聚焦的自定义指令

    72、实现一个可从外部关闭的下拉菜单

    73、实现一个实时时间转换指令v-time

    74、两种类型的循环单选选择、取消功能

    vue各种情况的组件间通信

    75、关于vue组件间通信问题的回答

    76、万金油:vue中央事件总线的使用

    77、props:最基础的父子组件间传递数据

    78、v-model语法糖:子组件向父组件传递数据

    79、 .sync 修饰符:进行父子组件间相互传递数据

    80、$attrs属性:父孙组件间传递数据

    81、$on属性:子组件调用父组件方法

    82、$listeners属性:孙组件调用父组件的方法

    83、$refs属性:

    84、 $parent属性:

    85、$children属性:

    86、混合开发:vue工程与app交互

    87、vue开发命令的执行过程【拓展】

    vue-cli工程打包后.js文件详解

    88、vue打包命令是什么?

    89、vue打包后会生成哪些文件?

    90、配置 vue 打包生成文件的路径

    91、 vue如何优化首屏加载速度?

    MVVM设计模式高频试题

    92、MVC、MVP与MVVM模式

    93、MVC、MVP与MVVM的区别

    94、常见的实现MVVM几种方式

    95、Object.defineProperty()方法

    vue-cli中的配置详解

    96、webpack的特点

    源码剖析

    97、发布一个 npm 资源包

    98、vue的服务器端渲染

    99、资料分享

    前端监控

    100、页面埋点

    101、性能监控

    102、异常监控

    一句话就能回答的面试题

    1.css只在当前组件起作用

    答:在style标签中写入scoped即可 例如:

    2.v-if 和 v-show 区别

    答:v-if按照条件是否渲染,v-show是display的block或none;

    3.routeroute和router的区别

    答:routepathparamshashqueryfullPathmatchednameroute是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。而router是“路由实例”对象包括了路由的跳转方法,钩子函数等。

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

    答:数据驱动、组件系统

    5.vue几种常用的指令

    答:v-for 、 v-if 、v-bind、v-on、v-show、v-else

    6.vue常用的修饰符?

    答:.prevent: 提交事件不再重载页面;.stop: 阻止单击事件冒泡;.self: 当事件发生在该元素本身而不是子元素的时候会触发;.capture: 事件侦听,事件发生的时候会调用

    7.v-on 可以绑定多个方法吗?怎么绑定?

    答:可以,如<input type=“text” :value=“name” @input=“onInput” @focus=“onFocus” @blur=“onBlur” />

    8.vue中 key 值的作用?

    答:当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。key的作用主要是为了高效的更新虚拟DOM。

    9.什么是vue的计算属性?

    答:在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③计算属性内部this指向vm实例;④在template调用时,直接写计算属性名即可;⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算。

    10.vue等单页面应用及其优缺点

    答:优点:Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好。
    缺点:不支持低版本的浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务端来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退。

    11.怎么定义 vue-router 的动态路由? 怎么获取传过来的值

    答:在 router 目录下的 index.js 文件中,对 path 属性加上 /:id,使用 router 对象的 params.id 获取。

  • 相关阅读:
    [Swift]LeetCode374. 猜数字大小 | Guess Number Higher or Lower
    [Swift]LeetCode371. 两整数之和 | Sum of Two Integers
    [Swift]LeetCode367. 有效的完全平方数 | Valid Perfect Square
    [Swift]LeetCode350. 两个数组的交集 II | Intersection of Two Arrays II
    [Swift]LeetCode349. 两个数组的交集 | Intersection of Two Arrays
    [Swift实际操作]七、常见概念-(9)使用定时组件Timer执行定时任务
    [Swift实际操作]七、常见概念-(8)日历Calendar和时区TimerZone
    浅谈广告交易系统
    浅谈广告交易系统
    6种排序算法的简洁实现:冒泡、选择、插入、归并、快速、堆
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12526168.html
Copyright © 2011-2022 走看看