30道Vue高频面试题

1.vue的生命周期及作用,适合用在那个地方?

在vue生命周期的不同阶段通过对应的钩子函数来实现组件数据管理和DOM渲染两大重要功能。

        创建阶段:
        beforecreate:实例已经初始化,但不能获取DOM节点。(没有data,没有el)
        created:实例已经创建,仍然不能获取DOM节点。(有data,没有el)
        载入阶段:
        beforemount:模板编译完成,但还没挂载到界面上。(有data,有el)
        mounted:编译好的模板已挂载到页面中(数据和DOM都已经渲染出来)。
        更新阶段:
        beforeupdate:数据发生变化立即调用,此时data中数据是最新的,但页面上数据仍然是旧的(检测到数据更新时,但DOM更新前执行)。
        updated:更新结束后执行,此时data中的值和页面上的值都是最新的。
        销毁阶段:
        beforedestroy:当要销毁vue实例时,在销毁之前执行。
        destroy:在销毁vue实例时执行。

适合用在那些场景        

   beforecreate:可以加Loading事件。
    create:初始化完成时的事件写在这里,异步请求也适宜在这里调用(请求不宜过多,避免白屏时间太长)。可以在这里结束loading事件,还做一些初始化,或实现函数的自执行。
此时未挂载DOM,若在此阶段进行DOM操作一定要放在Vue.nextTick()的回调函数中。
    mounted:此时完成挂载DOM和渲染,需要操作DOM的方法可以放在这里,也可在这发起后端请求,拿回数据,配合路由钩子做一些事情。
    beforeupdate:可在更新前访问现有的DOM,如手动移出添加的事件监听器。
    updated:组件DOM已完成更新,可执行依赖的DOM操作。
注意:不要在此函数中操作数据(修改属性),会陷入死循环。
    activated:在使用vue-router时有时需要使用来缓存组件状态,这个时候created钩子就不会被重复调用了。
如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。
          deactivated:组件被移除时使用。
    beforedestroy:销毁前,可以做一些删除提示,如:您确定删除xx吗?
    destroy:销毁后,这时组件已经没有了,无法操作里面的任何东西了。

2.vue组件间通信六种方式

        组件之间的传值通信
        组件之间通讯分为三种: 父传子、子传父、兄弟组件之间的通讯;

(1)props/$emit

  • 父传子:子组件在props中创建一个属性,用以接收父组件传过来的值
  • 子传父:父组件向子组件传递事件方法,子组件通过$emit触发事件,回调给父组件

(2)$eimt/$on

  • 这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级。
    具体实现方式
  var Event=new Vue();
   Event.$emit(事件名,数据);
   Event.$on(事件名,data => {});
// 假设兄弟组件有三个,分别是A、B、C组件,C组件如何获取A或者B组件的数据
// 组件A、B通过Event.$emit(事件名,数据)将数据传递,组件C通过 Event.$on(事件名,data => {})接受组件A、B传递的数据

(3)Vuex + localstorage

  • vuex 是 vue 的状态管理器,存储的数据是响应式的。但是并不会保存起来,刷新之后就回到了初始状态,具体做法应该在vuex里数据改变的时候把数据拷贝一份保存到localStorage里面,刷新之后,如果localStorage里有保存的数据,取出来再替换store里的state。(vuex 就是一个仓库,仓库里放了很多对象。在state中存放数据源,当组件要更改state中的数据时,必须通过mutation进行,mutation储存的是改变state中数据的操作方法,之后通过actions储存的操作去触发mutation中的方法,由组件中的$store.dispatch('action 名称', data1)来触发。然后由commit()来触发mutation的调用 , 间接更新 state。)
  • 这里需要注意的是:由于vuex里,我们保存的状态,都是数组,而localStorage只支持字符串,所以需要用JSON转换。

(4)$attrs/$listeners

  • $attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute 绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。
  • $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用

(5)$parent / $children与 ref

  • ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例
  • $parent / $children:访问父 / 子实例
  • 需要注意的是:这两种都是直接得到组件实例,使用后可以直接调用组件的方法或访问数据。
  • $parent :访问父实例,如果当前实例有的话。
  • $children:当前实例的直接子组件。需要注意 $children并不保证顺序,也不是响应式的。如果你发现自己正在尝试使用 $children来进行数据绑定,考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源。
  • 这两种方法的弊端是,无法在跨级或兄弟间通信。
// component-a 子组件
export default {
 data () {
   return {
     title: 'Vue.js'
   }
 },
 methods: {
   sayHello () {
     window.alert('Hello');
   }
 }
}
/***********************************/
// 父组件

(6)provide/inject



作者:Angel_6c4e
链接:https://www.jianshu.com/p/7c3dc76178bf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • provide/inject:vue2.2.0 新增API,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
  • 总而言之:祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。
  • provide / inject API主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
  • // A.vue
    export default {
     provide: {
       name: 'nora'
     }
    }
    /**************************************/
    // B.vue
    export default {
     inject: ['name'],
     mounted () {
       console.log(this.name);  // nora
     }
    }

  • 需要注意的是:provide 和 inject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的----vue官方文档
    provi

你可能感兴趣的:(vue.js,javascript,html)