Vue理论面试题整理一

Vue的核心是什么

Vue是一套构建用户界面的渐进式自低向上增量开发的MVVM框架,vue的核心只关心视图层

核心思想:

数据驱动( 视图的内容随着数据的改变而改变)

组件化(增加代码的复用性,可维护性,可测试性,提高开发效率,方便重复使用,体现出高内具体耦合)

请简述Vue的单向数据流

父级prop的更新会向下流动到子组件中,每次父组件发生更新,子组件所有的prop都会刷新为最新的值

数据从父组件传递给子组件,只能单向绑定,子组件内部不能直接修改父组件传递过来的数据

请说说 Vue 中常用的修饰符

事件修饰符

  • .stop 阻止事件继续传播
  • .prevent 阻止标签默认行为
  • .capture 使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理
  • .self 只当在 event.target 是当前元素自身时触发处理函数
  • .once 事件将只会触发一次
  • .passive 告诉浏览器你不想阻止事件的默认行为

v-model的修饰符

​ .lazy 默认情况下,vmodel同步输入矿产的值和数据,可以通过这修饰符转变为在change事件再同步

.number 自动将用户的输入值转化为数值类型

.trim 自动过滤用户输入的首尾空格

键盘事件修饰符 @keyup.enter=”function”

v-on 可以绑定多个方法吗

可以 如果绑定多个事件,可以同键值对的形式 事件类型:事件名 如果绑定是多个相同的事件,直接用逗号分隔

例:<el-button v-on="{mouseenter: onEnter,mouseleave: onLeave}">鼠标进来1</el-button>

Vuex 使用流程

  • 下载vuex
  • 在src下创建store以及 index.js
  • 引入vue和vuex,使用vuex导出实例对象
  • 在main.js中引入,在.vue中使用

Vuex 流程

在vue组件里面,通过dispatch来触发actions提交修改数据的操作,然后通过actions的commit触发mutations来修改数据,mutations接收到commit的请求,就会自动通过mutate来修改state,最后由store触发每一个调用它的组件的更新

Vue中路由跳转的方式 (声明式、编程式)

用js方式进行跳转的叫编程式 this.$router.push()

用router-link进行跳转的叫声明式 router-view 路由模板展示的位置

Vue路由传参的两种方法,params 和 query 方式的区别

query用path引入,paramas用name引入 接收参数都是类似的,分别是this.$route.query.name和this.$route.params.name

例:

//params 传参
this.$router.push({
name:'home', // 注意使用params时一定不能使用path
})
//query 传参
this.$router.push({
path:'/home',
query:{ username:this.username}
})

Vue 的生命周期请简述

  1. beforeCreate(创建实例)
  2. created(创建完成)
  3. beforeMount(开始创建模板)
  4. mounted(创建完成)
  5. beforeUpdate(开始更新)
  6. updated(更新完成)
  7. beforeDestroy(开始销毁)
  8. destroyed(销毁完成)
  9. Vue生命周期的作用
  10. 给了用户在不同阶段添加自己的代码的机会

DOM 渲染在哪个生命周期阶段完成

DOM渲染在mounted周期就已经完成了

对vue中的 keepalive 的理解

概念:keep-alive 是vue的内置组件,当它动态包裹组件时,会缓存不活动组件实例

作用:在组件切换的过程中将状态保存在内存中,防止重复渲染DOM,减少加载时间提高用户体验

如何让组件中的css在当前组件生效

在style 中加上 scope

Vue中组件怎么传值

正向:父传子,父组件把要传递的数据绑定在属性上,发送子组件通过props接收

逆向:子传父,子组件通过this.$emit(自定义事件名,要发送的数据) 父组件设置一个监听事件来接收,然后拿到数据

兄弟:eventbus 中央事件总线 Vue.prototype.$bus

通过Vuex

Vue首屏加载慢的原因,怎么解决的,白屏时间怎么检测,怎么解决白屏问题

原因:第一次加载页面有很多组件的数据需要渲染

解决方法:

  • 路由懒加载 component:() => import(‘路由地址’)
  • UI框架按需加载
  • gzip压缩

v-for 与 v-if 优先级

首先不要把v-if 与 v-for用在同一个元素上,原因:v-for 比 v-if 优先

如果每一次都需要遍历这个数组,将会影响速度

v-for 比 v-if 具有跟高的优先级

Vue组件中的data为什么是函数

Data 是一个函数时,每一个组价实例都自己的作用域,每个实例互相独立不会相互影响

如果是引用类型,当多个组件共用一个数据源时,一处数据改变,所有的组件数据都会改变,所有要利用函数通过return返回的对象的拷贝,让每个实例独有自己的作用域,相互不影响

Vue路由模式下 hash 和 history 有什么区别, 简单说一下

hash是vue开发中的默认模式,地址栏url携带 #

原理是通过onhashchange()事件监听路由hash的变化 hash对应的url会被浏览器记录下来

history原理利用H5中history提供 pushState,replaceState 这两个 API

由于是HTML5新增API所以在低版本有兼容性问题,