VUE面试题
- 1.vue最大特点是什么或者说vue核心是什么
- 2.vue自定义指令如何实现的和适用场景?
- 3.对单向数据流的理解
- 4.vue开发环境和线上环境如何切换
- 5.对axios拦截器的理解
- 6.vue第三方ui样式库如何实现样式穿透的(ui库和less/sass穿透问题)
- 7.为什么要用scoped
- 8.在 vue 中使用插件的步骤
- 9.Vue3.0 你知道有哪些改进
- 10.eventBus详细使用
- 11. Vue 中 v-html 会导致哪些问题?
- 12.Class 与 Style 如何动态绑定?
- 13.直接给一个数组项赋值,Vue 能检测到变化吗?
- 14.Vue Router的路由守卫
- 15.Vue Router的hash和history模式
- 16.Vue中如何进行依赖收集?
- 17.谈一谈对Vue组件化的理解
- 18.vue如何实现按需加载配合webpack设置
- 19.params和query的区别
- 20.v-on可以监听多个方法吗?
![](https://i-blog.csdnimg.cn/blog_migrate/d253054d32537bc7f24148432fbff120.png)
1.vue最大特点是什么或者说vue核心是什么
vue最大特点就是“组件化“和”数据驱动“
组件化就是可以将页面和页面中可复用的元素都看做成组件,写页面的过程,就是写组件,然后页面是由这些组件“拼接“起来的组件树
数据驱动就是让我们只关注数据层,只要数据变化,页面(即视图层)会自动更新,至于如何操作dom,完全交由vue去完成,只关注数据,数据变了,页面自动同步变化了,很方便
2.vue自定义指令如何实现的和适用场景?
vue除有了v-for,v-if等自带vue指令外,但不能满足所有的开发需求,有时需要自定义指令,自定义指令创建有全局自定义指令和局部自定义指令
全局自定义指令:Vue.directive(‘指令名’,{ inserted(el) { } })
局部自定义指令:directives:{ }
3.对单向数据流的理解
答:单向数据流主要是vue 组件间传递数据是单向的,即数据总是由父组件传递给子组件,子组件在其内部维护自己的数据,但它无权修改父组件传递给它的数据,当开发者尝试这样做的时候,vue 将会报错。这样做是为了组件间更好的维护。
在开发中可能有多个子组件依赖于父组件的某个数据,假如子组件可以修改父组件数据的话,一个子组件变化会引发所有依赖这个数据的子组件发生变化,所以 vue 不推荐子组件修改父组件的数据
4.vue开发环境和线上环境如何切换
主要通过检测
process.env.NODE_ENV===”production”和process.env.NODE_ENV===”development”
环境,来设置线上和线下环境地址,从而实现线上和线下环境地址的切换
5.对axios拦截器的理解
axios拦截器可以让我们在项目中对后端http请求和响应自动拦截处理,减少请求和响应的代码量,提升开发效率同时也方便项目后期维护
6.vue第三方ui样式库如何实现样式穿透的(ui库和less/sass穿透问题)
>>> /deep/
7.为什么要用scoped
在style标签上使用scoped属性主要是实现样式的私有化,防止对全局样式造成污染。
8.在 vue 中使用插件的步骤
采用 es6 的 import…from
9.Vue3.0 你知道有哪些改进
更好的支持了 TS
设计了一套强大的组合式 API,复用性更强
vue3 采用 es6 的 Proxy 代理对象 代替了 vue2 的 Object.defineProperty() 实现数据的响应式
重写了虚拟 DOM, 速度更快了
10.eventBus详细使用
enventBus(事件总线)就是借助 Vue 实例中的 $on()
与 $emit()
,来实现数据传递
新建一个 bus.js
文件,里面 new
一个 Vue()
导出
需要通信的组件导入 bus.js
bus.$emit()
触发消息,发布出去
bus.$on()
订阅消息,监听到同名消息就调用回调
11. Vue 中 v-html 会导致哪些问题?
可能会受到 xss 攻击
会替换掉标签内部的子元素
12.Class 与 Style 如何动态绑定?
Class 可以通过对象语法和数组语法进行动态绑定:
对象语法:
<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>
data: {
isActive: true,
hasError: false
}
数组语法:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
Style 也可以通过对象语法和数组语法进行动态绑定:
对象语法:
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
activeColor: 'red',
fontSize: 30
}
数组语法:
<div v-bind:style="[styleColor, styleSize]"></div>
data: {
styleColor: {
color: 'red'
},
styleSize:{
fontSize:'23px'
}
}
13.直接给一个数组项赋值,Vue 能检测到变化吗?
由于 JavaScript 的限制,Vue 不能检测到以下数组的变动:
当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength
为了解决第一个问题,Vue 提供了以下操作方法:
// Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// vm.$set,Vue.set的一个别名
vm.$set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
为了解决第二个问题,Vue 提供了以下操作方法:
// Array.prototype.splice
vm.items.splice(newLength)
14.Vue Router的路由守卫
router.beforeEach、router.beforeResolve、router.afterEach......
路由守卫接受三个参数:
to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。
15.Vue Router的hash和history模式
对于vue这类渐进式前端开发框架,为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。
为了达到这一目的,浏览器当前提供了以下两种支持:
hash
—— 即地址栏 URL 中的 #
符号(此 hash 不是密码学里的散列运算)。比如这个 URL:http://www.abcdfg.com/#/hellio hash
的值为 #/hello
。
它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。
history —— 利用了 HTML5 History Interface
中新增的 pushState()
和 replaceState()
方法。(需要特定浏览器支持)这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go
的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。
16.Vue中如何进行依赖收集?
每个属性都拥有自己的dep属性,存放他所依赖的watcher
,当属性变化后会通知自己对应的watcher
去更新
默认在初始化时会调用render函数,此时会触发属性依赖收集 dep.depend
当属性发生修改时会触发watcher更新 dep.notify()
17.谈一谈对Vue组件化的理解
组件化开发能大幅提高应用开发效率、测试性、复用性等;
常用的组件化技术:属性、自定义事件、插槽等
降低更新范围,只重新渲染变化的组件
组件的特点:高内聚、低耦合、单向数据流
18.vue如何实现按需加载配合webpack设置
webpack中提供了require.ensure()来实现按需加载。以前引入路由是通过import 这样的方式引入,改为const定义的方式进行引入。
页面不按需加载引入方式:import home from '../../common/home.vue'
页面按需加载引入方式:
const home = r => require.ensure( [], () => r (require('../../common/home.vue')))
19.params和query的区别
两者都是为了传递参数;
params通过name引入路由传参,query通过path路由传参;
params是路由的一部分,必须要在路由后面添加参数名,query是拼接在url后面的参数
20.v-on可以监听多个方法吗?
可以