vue面试题大全

vue生命周期相关的面试题

1.vue生命周期都有哪些?

image.png

  beforeCreate:function () {
            /*实例创建之前调用,表示Vue刚刚出生,data/methods都没有初始化,不能访问data和methods*/
        },
        created:function () {
            /*实例创建之后调用,data和methods已经初始化好了,此时还没有开始编译模板
            */
        },
        //这个阶段完成后,vue会开始编译模板,根据data中的数据生成html,但是还没有渲染到页面上,仅存在于内存中
        beforeMount:function () {
            /*页面挂载之前调用,完成了模板的编译,用编译好的模板替换el属性指向的dom对象中的内容,但是还没有挂载到页面上*/
        },
        mounted:function () {
            /*页面挂载之后调用,此时可以操作dom元素*/
        },
        beforeUpdate:function(){
            /*数据更新之前调用,此时data中的值是最新的,页面上的数据依然是旧的。
            *
            * */
        },
        //这个阶段执行完后,虚拟dom会根据最新的数据生成最新的模板,然后替换之前的内容。
        updated:function () {
            /*数据更新完成之后调用,此时data中的数据和页面上的数据都是最新的
           * */
        },
         beforeDestroy:function(){
            /*实例销毁之前调用,一些实例的属性和方法还是可以使用。
            * */
        },
        destroyed:function () {
            /*
            * 实例销毁之后调用,此时所有的属性和方法都不能使用。
            * */
}

2.进入页面会执行哪些生命周期函数
beforeCreate、created、beforeMounted、mounted

3.在哪里可以访问el和data
beforeCreate中不可以访问
created中有data没有el
beforeMounte中有data没有el
mouted中都有,包括之后的生命周期钩子函数都有

4、如果加入了keep-alive会增加两个生命周期函数
activated和deactivated
进入页面的时候触发activated,离开页面触发 deactivated
5.如果加入keep-alive组件,第一次进入页面会触发哪些生命周期
beforeCreate、created、beforeMounted、mounted、activated
6、如果加入了keep-alive组件后,第二次或第n次进入页面会触发哪些生命周期?
只触发一个生命周期:activated(因为该页面已经被缓存起来了)

谈谈你对keep-alive组件的了解

1.是什么
vue自带的一个组件,用来缓存组件,提升性能,keep-alive可以在组件切换时,保存其包裹组件的状态,使其不被销毁。
2、参数
include:表示只有匹配的组件才会被缓存;
exclude:表示匹配到的组件不会被缓存;
3、生命周期
有两个生命周期函数,同上
4.使用场景
-列表页面跳转详情页的时候,用户通过点击跳转,那么详情页每次都要去请求数据,如果用户每次点击的都是同一个,那么详情页就没必要去重新请求,直接缓存起来就行了,如果点击的不是同一个再重新发起请求;
-在router-view上使用可以缓存路由组件;

v-if和v-show的区别

1.相同点
都可以控制元素的显示隐藏
2.区别
v-if通过创建/销毁dom元素来控制元素的显示隐藏,v-show通过css属性的display:none来控制元素的显示隐藏
3.场景
频繁切换使用v-show,会节省性能,反之使用v-if

说一下vue组件中的name的作用

1、当项目使用keep-alive时,可搭配组件name进行缓存过滤
当我们使用keep-alive缓存组件时,被缓存组件中的mounted函数只会执行一次,第二次进入页面不会重新触发,有两种解决方法,一种是使用activated(),在里面进行mounted中的操作;另一种就是在keep-alive中增加一个过滤,如下所示:

<div id="app"> 
 <keep-alive exclude="Home">
  <router-view/>
 </keep-alive>
</div>

exclude属性就是要忽略匹配到的组件。
2、DOM做递归组件时;
当组件需要自己调用自己的时候

//父组件List.vue
<template>
  <div class="list">
    <Tree :list="list"/>
  </div>
</template>

<script>
import Tree from './Tree.vue';

export default {
  name: "List",
  components: {Tree},
  data() {
    return {
      list: [
        {
          title: "A",
          children: [
            {
              title: "A-A",
              children: [
                {
                  title: "A-A-A",
                },
              ],
            },
            {
              title: "A-B",
            },
          ],
        },
        {
          title: "B",
        },
        {
          title: "C",
        },
        {
          title: "D",
        },
      ],
    };
  },
};
</script>

//子组件Tree.vue

<template>
  <div class="tree">
    <div v-for="(item, index) of list" :key="index">
      <div>
        <span class="item-title-icon"></span>
        {{ item.title }}
      </div>
      <div v-if="item.children">
        <Tree :list="item.children" />  //递归组件是指组件自身调用自身
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "Tree",
  components: {},
  props: ["list"],
};
</script>


3、使用vue-tools时;
vue-devtools调试工具里显示的组件名称是由vue中组件name决定的


vue-tool.png

v-if和v-for的优先级

v-for的优先级比v-if的优先级高,这是在源码中规定好的,并且v-for和v-if不可以同时使用,同时使用会很浪费性能,比如明知判断条件是false的情况下,还需要去遍历一下数据,所以通常我们会把v-if放在v-for的外面。

nextTick的原理是什么

是用来获取更新后的dom内容,并且该方法是异步的

created() {
    console.log(111)
  },
  methods: {
    btn(){
      console.log(333)
      this.$nextTick(()=>{
        console.log(222)
      })
    },
  },
image.png

作用是将回调函数延迟到下次dom更新循环之后执行因为vue更新数据是异步的,修改data中的数据,视图不会立刻更新,vue会将你对data的修改放到一个watch队列中,当同一事件循环中的所有数据更新完以后,再进行试图更新,所以会产生延迟。
最常见的使用场景就是,在created中获取dom元素的时候需要使用$nextTick获取

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

组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,相当于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。而单纯的写成对象形式,就使得所有组件实例共用了一份data,就会造成一个变了全都会变的结果。

怎么理解vue中的单向数据流?

当父组件给子组件传递数据的时候,子组件只允许对数据进行读取,不允许修改数据,因为当子组件修改了父组件传过来的数据时,其他引用父组件数据的组件也会被修改,从而导致报错,然而也不知道是当前组件报错还是父组件报错还是修改父组件信息的子组件的错误;

如果要修改可以通过this.$emit方法派发自定义事件,在父组件中修改;

vue路由有几种模式?

hash模式和history模式,默认是hash模式
区别如下:
1、表现形式不同,hash使用#表示,history用/表示;
2、hash值不会发送到服务端,history会发送到服务端 ,如果没有匹配到对应的路由,需要配置对应的页面;
3、获取方式不同,hash值可以通过location.path获取,history通过location.pathname获取;
4、hash可以通过window.onhashchange监听hash值的改变 ,history
可以通过onpopstate监听变化;

谈一谈对数据双向绑定的原理?

实现一个简单的数据双向绑定,说一下基本的思路

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>实现一个简单的双向数据绑定</title>
</head>
<body>
    //在输入框中输入内容会同步到p标签中
    <input type="text" id="ipt" value="">
    <p class="pp"></p>
</body>
<script>
    const ipt=document.querySelector('#ipt'),
          pp=document.querySelector('.pp');
    let obj={
        name:''
    };
    Object.defineProperty(obj,'name',{
        get(){
            console.log('get')
        },
        set(newVal){
            pp.innerHTML=newVal;
        }
    })
    ipt.addEventListener('keyup',function(e){
        obj.name=e.target.value;
    })

</script>
</html>

vue的渲染流程

组建中的template标签会编译为render函数,通过render函数创建出dom元素,然后转化为虚拟dom最终转化为真实dom

虚拟dom是什么?在vue中做了什么?是如何提升渲染效率的?

1、虚拟dom是一个js对象,用对象属性来描述节点,是一层对真实dom的抽象

<ul class="ul">
    <li></li>
</ul>
//转化为虚拟dom
{
  ele:'ul'  //目标元素 必需
  attr:'ul'  //属性
  children:[]  //子元素
}

2、因为dom的执行速度远不如js执行速度快,因此将真实的dom抽象成js对象,然后通过算法计算出真正需要更新的节点,从而减少了大量的dom操作。
3、将直接操作dom转换成了两个js对象中去比较,找出差异项,做局部更新,提高了执行效率。

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容