vue面试题(二)

154 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

26 路由的懒加载

正常加载:

import List from '@/components/list.vue'
const router = new VueRouter({
  routes: [
    { path: '/list', 
    component: List }
  ]
})

懒加载方式1:使用箭头函数+import的方式,这也是官方生成的方式。

const router = new VueRouter({
  routes: [
    { 
      path: '/list',
      component: () => import('@/components/list.vue') 
    }
  ]
})

懒加载方式2:箭头函数+require

const router = new Router({
  routes: [
   {
     path: '/list',
     component: resolve => require(['@/components/list'], resolve)
   }
  ]
})

27 scss 是什么?有哪几大特性?

css的预编译。

特性:可以使用变量,例如($变量名=值)

28 is这个特性你用过吗?主要在哪个方面?

  1. 动态组件
<component :is="componentName"></component>

componentName可以是在本页面已经注册过的组件,或者是全局组件。通过控制componentName可以达到动态切换组件的效果。

有些 HTML 元素,诸如 <ul>、<ol>、<table>和<select>,对于哪些元素可以

出现在其内部是有严格限制的。

而有些 HTML 元素,诸如 <li>、<tr> 和 <option>,只能出现在其它某些特

定的元素内部。

<ul>

<card-list></card-list>

</ul>

所以上面<card-list></card-list>会被作为无效的内容提升到外部,并导致最

终渲染结果出错。应该这么写:

<ul>

<li is="cardList"></li>

</ul>

29 在vue生命周期、hook或者其他option里面为什么不使用箭头函数?

因为箭头函数没有定义this上下文,而是绑定到其父函数的上下文中。所以在vue中使用箭头函数,那么箭头函数的this并不会指向vue实例。

30 nextTick

如果需要在刷新DOM后对数据修改,就要用到nextTick。

原理:vue框架通过异步队列控制DOM更新和nextTick回调函数的执行顺序。nextTick源码里面有许多isNative()判断。

31 如何对Vue首屏加载实现优化?

  1. Vue路由懒加载
  2. Vue组件尽量不要全局引入
  3. 把不常改变的的库放在index.html中,通过CDN引入
  4. 首页单独做服务端渲染
  5. 使用更轻量级的工具库
  6. 开启gzip压缩

32 Vue中怎么重置data?

使用Object.assign(),将所有可枚举的属性的值,从一个或者多个源对象复制到目标对象。且返回目标对象。

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target);
// expected output: Object { a: 1, b: 4, c: 5 }

console.log(returnedTarget);
// expected output: Object { a: 1, b: 4, c: 5 }
使 用 Object.assign() , vm.$data 可 以 获 取 当 前 状 态 下 的 data ,

vm.$options.data(this) 可 以 获 取 到 组 件 初 始 化 状 态 下 的 data , 复 制

Object.assign(this.$data, this.$options.data(this))// 注意加 this,不然取不到 data()

33 Vue 中操作 data 中数组的方法中哪些可以触发视图更新?不可以的话有什么办法?

可以触发视图更新的:push,pop,unshift,shif,reverse,sort,split。

不可以的话,可以使用"this.$set()"

34 Vue单向数据流

数据从父级流向子级,只能单向绑定。

子组件不可以直接修改父组件中的数据,如果想修改,可以通过$emit派发一个自定义事件,父组件接收到后,由父组件修改。

这样是为了防止子组件意外修改父组件中的数据,导致数据流向难以理解,且状态难以管理。

35 style加上scoped的原理?

在Vue组件中,为了使模块私有化,不对全局样式造成污染,可以在style标签上添加一个scoped属性。当这个Vue项目的所有组件都加上scoped之后,相当于实现了样式的私有化。

原理:这种效果通过PostCSS转译实现,给div标签增加一个 data-v-唯一id 的属性

转译后:
<div data-v-fed36922>Vue.js scoped</div>.scoped[data-v-fed36922]{font-size:14px;}

36 请说出vue-cli项目中src文件夹中每个文件夹/文件的用法。

  1. assets 存储静态资源
  2. router 定义路由相关配置
  3. util 存放工具。例如:request.js,对axios请求进行二次封装
  4. store 定义vuex相关配置
  5. components 存放可重用组件
  6. view 存放路由组件
  7. app.vue 主组件
  8. main.js 入口文件

37 使用vue时造成页面卡顿,需要怎么解决?

针对于首次加载卡顿的问题,需要用到路由懒加载,简单来说就是按需加载。

像vue这种单页面应用,如果不使用懒加载,那么webpack打包后,文件就会变的很大,进入首页时,加载时间就会变长且造成白屏。

对于页面首屏,最好使用SSR,也就是服务器端渲染的方式,在服务器上渲染页面,浏览器直接展示返回的HTML。

38 在Vue中使用插件的步骤

  • 采用ES6的import...from...,或者CommonJS的require()方法引入插件。
  • 之后使用Vue.use(plugin)使用插件。

39 vue2兼容IE的哪个版本?

不支持IE8及以下,部分兼容IE9,完全兼容10及以上。

因为vue2的响应式原理是基于vue2的Object.defineProperty(),所以不支持IE8及以下。

40 Vue渲染模板时,怎么保留模板中的HTML注释?

在组件中将comments选项设置为true

<template comments> ... <template>

41 对vue的template编译的理解?

  • 先将模板通过编译器转化成AST(抽象语法树)
  • 将AST转化为字符串的过程会得到render函数
  • 执行render函数,返回值就是virtual Node