最近在牛客网练习的vue相关习题及答案整理,方便大家刷题
Vue相关的题目与答案:
1. 关于Vue组件化说法错误的是
A. 所谓组件化,就是把页面拆分成多个组件 (component),每个组件依赖的 CSS、JavaScript、模板、图片等资源放在一起开发和维护
B. 组件是资源独立的,组件在系统内部可复用,但是组件和组件之间不可以嵌套
C. vue的组件之间可以进行通信
D. 组件化能提高开发效率,方便重复使用,简化调试步骤,提升项目可维护性,便于多人协同开发
正确答案:B
解析:组件是资源独立的,组件在系统内部可复用,但是组件和组件之间可以嵌套
2. 下列关于客户端渲染和服务器端渲染的描述错误的是
A.服务器端渲染有利于SEO,且首页加载快
B.客户端渲染节省后端资源,但可能会加载慢出现白屏
C.服务器端渲染耗费流量,局部页面的变化也需要重新请求完整的页面
D.客户端和服务器端在首屏渲染上网络请求次数是一样的
正确答案:D
解析:客户端首屏渲染时首先拿到空的html模板,之后继续发起数据请求。而服务器端渲染只需要请求一次,服务器会将请求的数据放在html模板中一起返回。
3. 下列关于Vue的描述错误的是
A.当给某个组件修改某个值时,该组件不会立即重新渲染
B. Vue内部使用原生Promise.then、MutationObserver和setImmediate实现异步 队列,不会采用setTimeout(fn, 0)
C. $nextTick()返回一个Promise对象
D. $nextTick()可以配合async/await使用
正确答案:B
解析:Vue 在内部对异步队列尝试使用原生的 Promise.then、MutationObserver 和 setImmediate,如果执行环境不支持,则会采用 setTimeout(fn, 0) 代替。
4. 现有以下代码,下面说法错误的是( )
<div v-show='flag'>使用v-show控制</div>
<div v-if='flag'>使用v-if控制</div>
A. 当flag是true时,两个div都能显示出来
B. 当flag是false时,第一个div进行了渲染
C. 当flag是false时,第一个div设置了display: none
D.当flag是false时,第二个div设置了visible: hidden
正确答案:D
解析:当v-if的值是false的时候,该元素不进行渲染
5. Vue 中通过给元素添加哪个属性绑定DOM元素()
A.ref
B.refs
C.$ref
D.$refs
正确答案:A
解析:vue中可以使用ref绑定相应的元素 ref=“name”
然后使用 this.$refs.name 获取到该元素,并且可以直接调用子组件中定义的方法;
6. 下列关于scoped的描述错误的是( )
A.scoped原理是在标签上添加data-v属性,然后使用属性选择器实现样式局部化
B. 使用scoped,父组件的样式会渗透到子组件内部的元素
C. 使用scoped不会造成全局污染
D. ">"可以实现样式穿透
正确答案:B
解析:使用scoped后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的scoped css和子组件的scoped css的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。
7. 下列哪个选项不是单页面应用程序(SPA)的优点( )
A.不需要重新加载整个页面,运行流畅
B. 高效的前后端分离模式
C. 有利于SEO
D.减轻服务器压力
正确答案:C
解析:单页面应用程序中首页的数据需要通过在服务器异步获取,在这之前首页仅仅是一个模板,不利于seo。
知识点补充:
SPA的优点:
· 无刷新切换内容,提高用户体验。
· 符合前后端分离的开发思想,通过ajax异步请求数据接口获取数据,后台只需要负责数据,不用考虑渲染。前端使用vue等MVVM框架渲染数据非常合适。
· 减轻服务器压力,展示逻辑和数据渲染在前端完成,服务器任务更明确,压力减轻。
· 后端数据接口可复用,设计JSON格式数据可以在PC、移动端通用。
SPA的缺点:
- 不利于SEO(搜索引擎优化),应用数据是通过请求接口动态渲染,不利于SEO。
- 首页加载慢,SPA下大部分的资源需要在首页加载,造成首页白屏等问题。
8. 以下选项中不可以进行路由跳转的是( )
A. this.$router.jump()
B. route-link
C. this.$router.push()
D.this.$router.replace()
正确答案:A
解析:Vue路由的跳转方式有route-link、this.$router.push()、this.$router.replace()、this.$router.go()等,但是没有this.$router.jump()
9. 下面说法错误的是( )
A.watch监听对象必须设置deep: true
B. 数组直接通过索引修改属性值,能触发watch方法
C. watch内部可以写异步方法
D. immediate: true可以开启首次赋值监听
正确答案:B
解析:数组直接通过索引修改属性值不能触发watch
10. 现有以下代码, 打印的结果是( )
new Vue({
data: { a: 'first', b: 'second' },
created: function () { console.log(this.a) },
mounted(){ console.log(this.b) }
})
A.'first'
B.'first' 'second'
C. undefined undefined
D. 空
正确答案: A
解析:mounted是vue中的一个钩子函数,一般在初始化页面完成后,再对dom节点进行相关操作。但是题例中没有执行dom挂载,所以mounted不会执行
11. 下列关于Vue模块化开发的描述错误的是( )
A. 代码复用性高
B. 便于维护
C. 增加代码之间的耦合度
D. 避免命名冲突
正确答案: C
解析:模块化开发就是将大的文件拆分为许多独立的小文件,按需在不同的组件中导入,降低了代码耦合度,提高了代码复用性。
12. 关于路由说法错误的是( )
A.使用脚手架创建项目时,需要选择安装vue-router
B.在嵌套路由中,需要VueRouter的参数中使用children配置
C. vue-router不可以实现重定向
D. vue-router可以通过配置实现路由懒加载
正确答案: C
解析:vue-router 里可以使用 redirect 实现理由重定向,
如 {path:"/",redirect:"/home"}
将页面重定向到 home页面
13. 现有以下代码,打印的结果是( )
new Vue({
data: { a: 1, b: 2 },
watch: {
a: {
handler: function(value){
console.log(value)
}
}
}
})
A. 1
B. 打印语句不执行
C. undefined
D. null
正确答案: B
解析:使用watch `handler`属性有一个特点,就是当值第一次绑定时,watch不会执行监听函数,只有值发生改变时才会执行。
如果需要在最初绑定值的时候也执行函数,则就需要用到immediate属性,添加 immediate: true属性
1 2 3 4 5 6 7 8 | watch: { a: { handler: function(value){ console.log(value) }, immediate: true } } |
14. 关于路由模式说法错误的是( )
A.vue-router有两种模式,history和hash模式
B.hash模式是通过onchange事件,监听url的修改
C.history通过H5提供的API history.pushState 和 history.pushState实现跳转且不刷新页面
D.history模式需要后端进行配合
正确答案: B
解析:hash模式是通过onhashchange事件,监听url的修改
15.以下选项中属于Vuex中的属性的是( )
A.state
B.Mutations
C.actions
D.setters
正确答案: A B C
Vuex属性包含state、mutations、actions、getters、modules
16. 以下不是vue内置指令的是( )
A. v-html
B.v-on
C.v-for
D.v-hidden
正确答案: D
没有v-hidden指令
17. 关于Vue双向数据绑定说法错误的是( )
A.Vue实现双向数据绑定是采用数据劫持和发布者-订阅者模式
B.Object.defineProperty(obj,key,val)可以监听数组变化,不需要做特殊处理
C.Vue2.0 数据劫持是利用ES5的Object.defineProperty(obj,key,val)方法来劫持每个属性的getter和setter
D.用户更新了View,Model的数据也自动被更新了,这种情况就是双向数据绑定
正确答案: B
Object.defineProperty(obj,key,val)不可以监听数组变化,需要做特殊处理,所以Vue3.0使用Proxy实现数据监听
18. 关于v-model的修饰符说法错误的是( )
A.lazy修饰符让内容在“change”事件时而非“input”事件时更新
B.v-model添加number修饰符,可以自动将用户的输入值转为数值类型
C.可以给v-model添加trim修饰符,自动过滤用户输入的首尾空白字符
D.v-model添加number修饰符,如果这个值无法被parseFloat()解析,则会返回null
正确答案: D
v-model添加number修饰符,如果这个值无法被parseFloat()解析,则会返回原始的值。
19. 下列关于Vue2和Vue3的描述错误的是( )
A.Vue3中Template支持多个根标签,Vue2不支持
B.Vue3中的生命周期的挂载钩子是onMounted,需要引入才能使用
C.Vue3组合API中的setup()方法中不可以使用生命周期钩子函数
D.Vue3引入了tree-shaking,以模块的方式引入api,减小打包体积
正确答案: C
Vue3的组合API中的setup()方法包含了所有的基本内容,包括生命周期,可以在setup()中使用生命周期钩子函数。
20. 不属于Vue使用虚拟DOM的特点是( )
A.虚拟节点可以理解成节点描述对象,它描述了应该怎样去创建真实的DOM节点。
B.虚拟DOM优势:渲染引擎操作 DOM 慢,js运行效率高,于是将DOM对比操作放在JS层,提高效率
C.提升渲染性能 Virtual DOM的优势不在于单次的操作,而是在大量、频繁的数据更新下,能够对视图进行合理、高效的更新
D.Virtual DOM 是以 JavaScript 对象为基础,所以必须依赖于浏览器才能运行
正确答案: D
Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等。
21.下列关于Vue内置组件的描述错误的是( )
transition:为组件的载入和切换提供动画效果
transition-group:作为多个元素/组件的过渡效果
keep-alive:缓存子组件,被包裹的子组件会多出两个生命周期:activated、deactivated
当组件在keep-alive内被切换时,它的mounted和unmounted生命周期钩子也会被调用
正确答案: D
当组件在keep-alive内被切换时,它的mounted和unmounted生命周期钩子会被activated和、deactivated代替。
22. 请按顺序选择正确的代码,实现图片预加载功能( )
<template>
<div>
<div>
<h1><strong>Loading...</strong></h1>
<h2><strong>{{percent}}%</strong></h2>
</div>
</div>
</template>
<script>
export default {
data() {
return {
count: 0,
percent: '',
images: [
'example.png',
'...',
'...'
]
}
},
mounted() {
__1__()
},
methods: {
preload: function() {
for (let url __2__ this.images) {
let image = new Image()
image.src = url
image.__3__ = () => {
this.count++
this.percent = Math.floor(this.count / this.images.length * 100)
}
}
},
},
watch: {
__4__: function(num) {
if (num === this.images.length) {
this.$router.push({path: 'home'})
}
}
}
}
</script>
正确答案: C this.preload、of、onload、count
挂载时,调用preload方法,使用of获取数组每项,图片加载成功时触发onload事件,观察count,当count等于数组长度时,代表全部加载完毕,进行跳转。
23. 下列关于vue-lazyload的描述错误的是( )
A.组件中使用vue-lazyload时,v-lazy代替v-bind:src
B.组件中使用vue-lazyload时,必须要加:key属性
C.vue-lazyload指令可以实现图片的懒加载
D.使用vue-lazyload时,扩展功能api中的attempt代表尝试加载图片数量
正确答案: B :key可以不加,如果不加:key属性,刷新页面时,可能由于key相同,图片不刷新。
24. 阅读以下代码,请选择可以正确打印h1标签宽度的选项( )
<template>
<div>
<h1 ref='h1' v-if="show">nowcoder</h1>
</div>
</template>
<script>
export default {
data() {
return {
show: false
}
},
mounted() {
this.show = true
// 此处填写代码
}
}
</script>
A.this.$nextTick(function() {
console.log(this.$refs.h1.offsetWidth)
})
B.setInterval(() => {
console.log(this.$refs.h1.offsetWidth)
})
C.setTimeout(() => {
console.log(this.$refs.h1.offsetWidth)
})
D.console.log(this.$refs.h1.offsetWidth)
正确答案: A B C
Vue实现响应式并不是数据发生变化之后DOM立即变化,而是在同步任务执行完成之后才执行渲染任务,简单说Vue的渲染是异步的。
26. 下列不属于Vue的特点的是( )
Vue.js的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM的系统
实现了双向数据绑定
Vue.js可以进行组件化开发,使代码编写量大大减少,读者更加易于理解
Vue虽然也提供了渲染函数,默认使用模板渲染,且不支持JSX
正确答案: D
27. 关于Vue-cli说法错误的是( )
Vue CLI是一个基于Vue.js进行快速开发的完整系统
CLI(@vue/cli) 是一个全局安装的npm包,提供了终端里的Vue命令
CLI目前还不能提供图形化界面管理你的所有项目
CLI服务是构建于webpack和webpack-dev-server之上的
正确答案: C 可以通过vue ui一套图形化界面管理你的所有项目
28. 下列关于v-model的说法,哪项是不正确的是( )
v-model如果为不同元素绑定数据,则使用不同的元素property, 并抛出不同的事件
v-model本质上是语法糖,它负责监听用户的输入事件以更新数据
v-model是内置指令,不能用在自定义组件上
对input使用v-model,实际上是指定其 :value和input事件
正确答案: C
vue2.2+版本新增了一个功能,可以在自定义组件上使用v-model实现双向绑定
29. 关于Vue双向数据绑定说法错误的是( )
Vue实现双向数据绑定是采用数据劫持和发布者-订阅者模式
Object.defineProperty(obj,key,val)可以监听数组变化,不需要做特殊处理
Vue2.0 数据劫持是利用ES5的Object.defineProperty(obj,key,val)方法来劫持每个属性的getter和setter
用户更新了View,Model的数据也自动被更新了,这种情况就是双向数据绑定
正确答案: B
Object.defineProperty(obj,key,val)不可以监听数组变化,需要做特殊处理,所以Vue3.0使用Proxy实现数据监听
30. 关于Vue组件生命周期说法错误的是( )
Vue组件的生命周期可以分成三个大阶段:挂载、更新、卸载
挂载阶段中涉及到的钩子函数有:beforeCreate、created、beforeMount、mounted
更新阶段涉及的钩子函数有:beforeUpdate、updated、activated、deactivated
首次进入页面钩子函数的执行顺序:beforeCreate、created、beforeMount、mounted
正确答案: C
Vue组件的生命周期涉及到的钩子函数和执行顺序是:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed,activated和deactivated是组件设置了keep-alive时,进入组件和离开组件时分别触发的两个函数
31. 关于Vue组件的生命周期说法错误的是( )
mounted钩子函数中,可以直接获取DOM元素
beforeMount钩子函数中,不可以直接获取DOM元素
beforeDestroy钩子函数中,不可以直接获取DOM元素
destroyed钩子函数中,不可以直接获取DOM元素
正确答案: C
Vue的生命周期的钩子函数中mounted和beforeDestroy中都可以获取到DOM元素
32. 关于Vue组件间通信说法错误的是( )
Vuex可以实现任何关系的组件间的通信
如果子组件修改,通过props获取的父组件传过去的字符串或数字会报错
子组件可以通过$emit给父组件传值
可以通过context进行组件间传值
正确答案: D
context是用在react中进行组件间的传值,vue并不提供该方法,Vue组件间传值可以通过props,$emit,Vuex,事件总线。通过props获取父组件的基本数据类型的值,在修改时会报错
33. 关于Vuex说法错误的是( )
actions通过commit触发mutations中的方法进行状态变更
Vuex是单项数据流变更数据
ajax一般放在mutations中,把获取到的数据存储state中
由于Vuex使用单一状态树,应用的所有状态会集中到一个比较大的对象
正确答案: C
异步操作放在actions中,actions通过commit调用mutations中方法操作state
一般使用ajax时会使用异步处理,而mutation是写同步操作的,异步一般写在actions中
34. 不属于Vue使用虚拟DOM的特点是( )
虚拟节点可以理解成节点描述对象,它描述了应该怎样去创建真实的DOM节点。
虚拟DOM优势:渲染引擎操作 DOM 慢,js运行效率高,于是将DOM对比操作放在JS层,提高效率
提升渲染性能 Virtual DOM的优势不在于单次的操作,而是在大量、频繁的数据更新下,能够对视图进行合理、高效的更新
Virtual DOM 是以 JavaScript 对象为基础,所以必须依赖于浏览器才能运行
正确答案: D
Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等
35. 关于Vue组件生命周期说法错误的是( )
A.在data中的对象的某个属性和input双向绑定,修改input的值,在deforeDestroy中获取的值是修改过后的值
B.父子组件生命周期的执行顺序是父亲beforecreate、父亲created、父亲beforeMount、孩子beforecreate、 孩子created、孩子beforeMount、父亲mounted、孩子mounted、父亲beforeDestroy、孩子beforeDestroy、孩子destroyed、父亲destroyed
C.在created钩子函数中操作DOM,可以将语句放在$nextTick中
D.ajax请求可以放在created钩子函数中
正确答案: B
知识点:加载渲染过程:
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
子组件更新过程
父beforeUpdate->子beforeUpdate->子updated->父updated
父组件更新过程
父beforeUpdate->父updated
销毁过程
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
36. 有如下代码,最终渲染出来的div元素的class属性值是( )
有如下模板:
1 2 3 4 | <div class="static" v-bind:class="{ active: isActive, 'text-danger': hasError }" ></div> |
和如下data:
1 2 3 4 | data: { isActive: true, hasError: false } |
正确答案:B static active
可以通过v-bind绑定class属性,且可以通过变量控制属性值,当变量是true时,该属性会被添加到class属性中
37. 用于绑定DOM属性的指令是( )
v-on
v-model
v-bind
v-html
正确答案: C
定DOM属性的指令是v-bind
38. 以下获取动态路由{ path: '/name/:id' }中id的值正确的是( )
this.$route.params.id
this.route.params.id
this.$router.params.id
this.router.params.id
正确答案: A
router其实是VueRouter的一个实例,所以它是一个全局对象,包含了所有的子对象和属性
而route是正在跳转的这个路由的局部对象,可以获取这个正在跳转的路由的name,path,params,query等
this.$router 全局的路由对象,options.routes包括所有的路由路径,this.$router.push() this.$router.go()
this.$route 本页面的路由对象, 当前页的 url地址, 当前页的传参 params query
39. 下列关于Vue自定义指令钩子函数的描述错误的是( )
被绑定元素插入父节点时调用inserted函数
bind函数只调用一次,指令第一次绑定到元素时调用
组件的VNode更新时调用update函数
自定义指令钩子函数参数"el"指所绑定的元素,但是不可以通过el直接操作DOM元素
正确答案: D
自定义指令钩子函数参数"el"指所绑定的元素,可以直接操作DOM元素。如修改绑定元素的字体颜色:el.style.color = 'red'。
40. 关于$nextTick说法错误的是( )
在组件内使用vm.$nextTick()实例方法特别方便,因为它不需要全局Vue,并且回调函数中的this将自动绑定到当前的Vue实例上
在created等虚拟DOM没有完成挂载的钩子函数中,不能把操作语句放在$nextTick的回调函数中
$nextTick()返回一个Promise对象
需要使用$nextTick()原因是Vue是异步渲染
正确答案: B
在created等虚拟DOM没有完成挂载的钩子函数中,避免操作DOM报错可以把操作语句放在$nextTick的回调函数中
41. 下列关于Vue响应式的描述错误的是( )
当利用索引值设置一个数组项时,Vue不能检测到数组的变动
当修改数组的长度时,Vue不能检测到数组的变动
Vue可以监听对象属性的添加或删除
可以通过Vue.set()方法向嵌套对象添加响应式属性
正确答案: C
Vue无法检测property的添加或移除。由于Vue会在初始化实例时对property执行getter/setter转化,所以property必须在data对象上存在才能让Vue将它转换为响应式的。
这里应该需要说明下vue的版本在2.x的时候,在3.x的时候已经实现了深层对象和数组元素直接赋值、删除属性的响应式
由于 JavaScript 的限制,Vue 不能检测数组和对象的变化,因而对象属性的添加或删除不可以监听到。
Vue 无法检测 property 的添加或移除。由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在data对象上存在才能让 Vue 将它转换为响应式的
42.下列关于Vue和React的描述错误的是( )
Vue进行数据拦截/代理,对数据更敏感,数据驱动视图自更新,而React需要手动驱动数据更新视图
Vue和React的this都指向当前组件实例
Vue和React都能使用jsx进行编程
Vue和React都是数据驱动视图的更新
正确答案: B React中组件的this并不是当前实例,需要通过bind或箭头函数来修改指向。
43. 关于Vue中的diff算法说法错误的是( )
比较只会在同层级节点进行比较, 不会跨层级比较
在diff比较的过程中,循环从两边向中间收拢。
vue的虚拟dom渲染真实 dom 的过程中首先会对新老VNode的开始和结束位置进行标记:oldStartIdx、oldEndIdx、newStartIdx、newEndIdx
当老VNode节点的 start 和新VNode节点的end满足sameVnode时,新VNode节点会被提到start位置
正确答案: D
老 VNode 节点的start和新VNode节点的end满足 sameVnode 时,这说明这次数据更新后oldStartVnode已经跑到了oldEndVnode后面去了,这时候在patchVnode后,还需要将当前真实dom节点移动到oldEndVnode的后面,同时老VNode节点开始索引加 1,新VNode节点的结束索引减 1。
44. 以下属于Vue绑定事件的指令是( )
v-bind
@
v-on
1
正确答案: B C
绑定事件有两种方式:第一种,通过v-on指令。二种,通过@语法糖
45. 下面说法错误的是( )
watch方法中不能执行异步操作
不应该使用箭头函数来定义 method 函数,箭头函数绑定了父级作用域的上下文,所以this将不会按照期望指向 Vue 实例
Vue 实例将会在实例化时调用$watch(),遍历 watch 对象的每一个 property
computed的结果会被缓存,除非依赖的响应式 property 变化才会重新计算
正确答案: A watch中能够执行异步操作
46. 关于路由守卫说法错误的是( )
Vue路由守卫分为全局路由、单个路由守卫、组件内部路由
全局路由守卫的钩子函数有:beforeRouteEach(全局前置守卫)、beforeRouteResolve(全局解析守卫)、afterRouteEach(全局后置守卫)
单个路由独享的钩子函数只有一个:beforeEnter
组件路由守卫相关的钩子函数:beforeRouteEnter、 beforeRouteUpdate、beforeRouteLeave
正确答案: B
全局路由守卫的钩子函数有: beforeEach(全局前置守卫)、beforeResolve(全局解析守卫)、afterEach(全局后置守卫)
#学习路径#