面试题(五)常见vue相关面试题总结
1.vue 优点
答:
- 轻量级框架:只关注视图层,是一个构建数据的视图集合,大小只有几十kb; 简单易学:国人开发,中文文档,不存在语言障碍 ,易于理解和学习;
- 双向数据绑定:保留了angular的特点,在数据操作方面更为简单;
- 组件化:保留了react的优点,实现了html的封装和重用,在构建单页面应用方面有着独特的优势;
- 视图,数据,结构分离:使数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作;
- 虚拟DOM:dom操作是非常耗费性能的, 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式;
- 运行速度更快:相比较与react而言,同样是操作虚拟dom,就性能而言,vue存在很大的优势。
2.vue 父组件向子组件传递数据?
答:通过props
3.子组件像父组件传递事件
答:通过$emit
方法
4.v-show 和 v-if 指令的共同点和不同点
答:
共同点:都能控制元素的显示和隐藏
不同点:实现本质方法不同,v-show本质是通过控制css中的display设置为none,控制隐藏,只会编译一次;v-if是动态的向DOM树内添加或者删除DOM元素,若初始值为false,就不会编译了。而且v-if不停的销毁和闯将比较消耗性能。
总结:如果要频繁切换某节点,使用v-show(切换开销比较小,初始开销较大)。如果不需要频繁切换某节点,使用v-if(初始渲染开销较小,切换开销比较大)。
5.如何让 CSS 只在当前组件中起作用
答:在组件中的 style 前面加上 scoped <style lang="scss" scoped></style>
**6. keep-alive
的作用是什么?
答:keep-alive
是vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
7.如何获取 dom
答:<form ref="domName"></form>
用法:this.$refs.domName
8.说出几种 vue 当中的指令和它的用法?
答:v-model 双向数据绑定
v-for 循环
v-if v-show 显示与隐藏
9.vue-loader 是什么?使用它的用途有哪些?
答:vue文件的一个加载器,将 template/js/style转换成js模块。
用途:js可以写es6、style样式可以scss或less、template可以加jade等
10.为什么使用 key
答:需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点。
作用主要是为了高效的更新虚拟DOM
11.axios 及安装
答:请求后台资源的模块
安装:npm install axios --save
// main.js
import axios from 'axios' // 引入
// 配置请求的根路径
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
// 通过axios 请求拦截器 添加token 需要授权的 API ,必须在请求头中使用 `Authorization` 字段提供 `token` 令牌
axios.interceptors.request.use(config => {
config.headers.Authorization = window.sessionStorage.getItem('token')
// 在最后必须return config
return config
})
// axios 响应拦截器
axios.interceptors.response.use(function (res) {
return res.data
}, function (err) {
console.log(err)
})
Vue.prototype.$http = axios // 挂载到vue实例上
// js中使用import进来,然后.get或.post。返回在.then函数中如果成功,失败则是在.catch函数中。
// get delete方法传参格式一样用params
this.$http.get(`http://127.0.0.1:8888/api/private/v1/{$id}`,{params:{key:value}})
.then(res => {
console.log(res)
})
.catch(err => {
conosle.log(err)
})
// post put 方法传参格式一致
this.$http.get(`http://127.0.0.1:8888/api/private/v1/{$id}`,{key:value})
.then(res => {
console.log(res)
})
.catch(err => {
conosle.log(err)
})
12.axios 解决跨域
答:vue-cli3.0中直接使用就可以解决跨域问题。
13.v-modal 的使用
答:v-model用于表单数据的双向数据绑定,其实它就是一个语法糖,这个背后就做了两个操作:
v-bind 绑定一个value属性;
v-on指令给当前元素绑定input事件。
14.scss 的安装以及使用
答:安装: npm install sass-loader node-sass
也可以先安装node-sass,再安装sass-loadernpm install node-sass --save-dev
npm install sass-loader --save-dev
使用:无需配置,直接使用即可,单文件中的引入和使用
<style lang="scss" scoped>
@import "./styles/base.scss";
</style>
15.请说出 vue.cli 项目中 src 目录每个文件夹和文件的用法?
答:assets文件夹是放静态资源;
components是放组件;
router是定义路由相关的配置;
app.vue是一个应用主组件;
main.js是入口文件
16.分别简述 computed 和 watch 的使用场景
答:computed:
当一个属性受多个属性影响的时候就需要用到computed
最典型的栗子:购物车商品结算的时候
watch:
当一条数据影响多条数据的时候就需要用到watch
栗子:搜说数据
17.v-on 可以监听多个方法吗
答:可以
<input type="text" v-on="{ input: onInput, focus: onFocus, blur: onBlur }"/>
18.$nextTick 的使用
答:当你修改了data的值然后马上获取这个dom元素的值,是不能获取到更新后的值的,需要使用 $nextTick 这个回调,让修改后的data值在渲染更新到dom元素之后再获取,才能成功。
19.vue 组件中 data 为什么必须是一个函数
答:因为JavaSc的特性所导致,在component中,data必须以函数的形式存在,不可以是对象。
组件中的data写成一个函数,数据以函数返回值的形式定义,这样每次复用组件的时候,都会返回一份新的data,相当于每个组件实例都有自己的私有的数据空间,它们只负责各自维护的数据,不会造成混乱。而单纯的写成对象形式,就说所有的组件实例共用了一个data,这样改一个全都改了。
20.vue 事件对象的使用
答: 函数形式
若参数采用函数形式,则事件侦听器处理函数的第一个参数默认接收事件对象event,event对象将被自动当做实参传入。注意,形参的名称可以自定义。
<template>
<button @click="handle">button</button>
</template>
<script>
export default{
methods: {
handle (event){
console.log(event.target)
}
}
}
</script>
函数执行的形式
若参数采用函数执行的形式,则需要使用 $event
变量向事件侦听器处理函数中显示传入event对象。注意,实参名称即 $event
变量名不能自定义。
<template>
<button @click="handle($event)">button</button>
</template>
<script>
export default{
methods: {
handle (event){
console.log(event)
}
}
}
</script>
21 组件间的通信
答:
父组件向子组件传值: props
子组件向父组件传值: $emit
状态管理:vuex
22.渐进式框架的理解
答:主张最少;可以根据不同的需求选择不同的层级;
23.Vue 中双向数据绑定是如何实现的
答:vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的,也就说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;
核心:关于VUE双向数据绑定,其核心是 Object.defineProperty()方法。
24.单页面应用和多页面应用区别及优缺点
答:单页面应用(SPA),通俗点说就是指只有一个主页面的应用,浏览器一开始要加载所有必须的 html,js,css。所有的页面内容都包含这个所谓的主页面中。但在写的时候,还是会分开写(页面片段),然后在交互的时候由路由程序动态载入,单页面的页面跳转,仅刷新局部资源。多应用于pc端。
多页面(MPA),就是指一个应用中有多个页面,页面跳转时是整页面刷新
单页面的优点:
用户体验好,快,内容的改变不需要重新加载整个页面,基于这一点spa对服务器压力较小;前后端分离;页面效果会比较炫酷(比如切换页面内容时的专场动画)。
单页面缺点:
不利于seo;导航不可用,如果一定要导航,需要自行实现前进、后退。(由于是单页面不能用浏览器的前进后退功能,所以需要自己建立堆栈管理);初次加载时耗时多;页面复杂度提高很多。
25.vue 中过滤器有什么作用及详解
答:过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。
首先定义过滤器有两种方式,第一种是全局过滤器,我们可以直接在vue对象上使用filter方法注册过滤器,这种全局注册的过滤器在任何一个组件内都可以使用。第二种则是组件内部的过滤器,注册组件内部过滤器则只能在当前组件内使用。
// 全局过滤器
Vue.filter('formatTime', function (value) {
const dt = new Date(value)
const hh = (dt.getHours() + '').padStart(2, '0')
const mm = (dt.getMinutes() + '').padStart(2, '0')
const ss = (dt.getSeconds() + '').padStart(2, '0')
return `${hh}:${mm}:${ss}`
})
<!-- 组件内的局部过滤器 -->
<script>
export default{
// ...
filters: {
formatDate(val){
const dt = new Date(val)
const y = dt.getFullYear()
const m = (dt.getMonth() + 1 + '').padStart(2, '0')
const d = (dt.getDate() + '').padStart(2, '0')
return `${y}-${m}-${d}`
}
}
}
</script>
<!-- 组件内使用 -->
<template>
<div>
<h2>vue过滤器</h2>
<!-- 局部过滤器 -->
<p>{{ 1533527037000 | formatDate }}</p>
<!-- 全局过滤器 -->
<p>{{ 1533527037000 | formatTime }}</p>
<!-- 过滤器可以串联 -->
<p>{{ message | filterA | filterB }}</p>
<!-- 过滤器传参 -->
<p>{{ message | filterA('arg1', arg2) }}</p>
</div>
</template>
<script>
export default{
// ...
}
</script>
26.v-if 和 v-for 的优先级
答:当 v-if 和 v-for 一起使用时,v-for 具有比 v-if 更高的优先级,这就意味着 v-if 将分别重复运行于每个 v-for 循环中。所以,不推荐 v-if 和 v-for 同时使用。
如果 v-if 和 v-for 一起用的话,vue会自动提示 v-if 应该放到外层去。
27.assets 和 static 的区别
答:
相同点:
assets和static两个都是存放静态资源文件。项目中所需要的资源文件图片,文字图标,样式文件等都可以放在这两个文件夹下。
不同点:
assets中存放的静态资源文件在项目打包时,也就是运行 npm run build 时会将assets中放置的静态资源文件进行打包上传,所谓打包简单点可以理解为压缩体积,代码格式化。而压缩后的静态资源文件最终都会放置在static文件中跟着index.html一同上传至服务器。static中放置的静态资源文件就不会要走打包压缩格式化等流程,而是直接进入打包好的目录,直接上传至服务器。因为避免了压缩直接进行上传,在打包时会提高一定的效率,但是static中的资源文件由于没有进行压缩等操作,所以文件的体积也就相对于assets中打包后的文件体积较大点。在服务器中就会占据更大的空间。
建议:
将项目中template需要的样式文件js文件等都可以放置在assets中,走打包这一流程,减少体积。而项目中引入的第三方的资源文件如iconfont.css等文件可以放置在static中,因为这些引入的第三方文件已经经过处理,我们不需要处理,直接上传。
28.列举常用的指令
答:
v-model 表单数据双向绑定
v-if v-show 控制显示隐藏
v-for 循环
v-bind 动态绑定属性
v-on 绑定事件
29.vue 常用的修饰符
答:
v-model修饰符:
.lazy:输入框改变,这个数据就会改变,lazy这个修饰符会在光标离开input框才会更新数据
.trim:过滤输入框数据首位空格
.number:先输入数字就会限制输入只能是数字,先字符串就相当于没有加number,注意,不是输入框不能输入字符串,是这个数据是数字。
事件修饰符:
.stop:等同于JavaScript中的event.stopPropagation(),阻止事件冒泡
.prevent:等同于JavaScript中的event.preventDefault(),阻止默认行为,比如表单的提交、a标签的跳转就是默认事件
.capture:与事件冒泡的方向相反,事件捕获由外到内
.self:只会触发自己范围内的事件,不包含子元素
.once:只会触发一次
30.数组更新检测
答:
由于JavaScript的限制,Vue不能检测以下变动的数组:
- 当利用索引直接赋值一个项时,例如: vm.items[indexOfItem] = newValue
- 当修改数组的长度时,例如:vm.items.length = newLength
vue针对这两个问题给出了响应的解决办法,使用这两种方法,也会触发状态更新:
- 使用vue全局方法 Vue.set()或者使用 vm.$set() 实例方法
- 使用 splice concat 等修改数组
vue能不能检测到数组的变化并更新,取决于原生js的数组方法,如果原生js方法(vue变异方法)能够修改原数组,那么vue就可以检测到变化并更新(例如:push,pop,shift, unshift, splice,sort ,reverse等方法)
如果原生js方法(vue非变异方法)不能够修改原数组,而是返回一个新数组,那么vue也可以检测到变化并更新,前提是使用这些方法时要把新数组返回出来去替换掉旧数组(例如:filer(),concat(),slice()等方法)
31.Vue.set 视图更新
答:
32.自定义指令详解
答:自定义指令
33.vue 的两个核心点
答:数据驱动、组件系统
数据驱动:ViewModel,保证数据和视图的一致性
组件系统:应用类UI可以看作全部是由组件树构成的
34.vue 和 jQuery 的区别
答:jQuery是使用选择器($
)选取DOM对象,对其进行赋值、取值、事件绑定等操作,其实和原生的HTML的区别只在于可以更方便的选取和操作DOM对象,而数据和界面是一起的。比如需要获取label标签的内容:$("label").val()
它还剩依赖DOM元素的值。
Vue则是通过Vue对象将数据和View完全分离开来了。对数据进行操作不再需要引用相应的DOM对象,可以说数据和View是分离的,它们通过Vue对象这个vm实现相互的绑定。这就是传说中的MVVM。
35 引进组件的步骤
答:
<template>
<!-- 3.在template中使用组件 -->
<m-header></m-header>
</template>
<script>
import MHeader from '@/components/m-header/index' // 1.在script的第一行用import引入路径
export default{
// ...
components: {
MHeader // 2.在components中写上组件名称
}
}
</script>
36.Vue-cli 打包命令是什么?打包后会导致路径问题,应该在哪里修改
答:打包命令是 npm run build
执行命令后,打包生成dist文件夹,访问的时候报错。
解决方法:
// 在根目录下,新建 vue.config.js文件,内容如下 @ 指根目录src 再次执行打包命令
module.exports = {
publicPath:'./',
configureWebpack:{
resolve: {
alias: {
'assets': '@/assets',
'common': '@/common',
'components': '@/components',
'views': '@/views',
'plugins': '@/plugins'
}
}
}
}
37.三大框架的对比
Angular | React | Vue | |
---|---|---|---|
组织方式 | MVC | 模块化 | MVVM |
数据绑定 | 双向绑定 | 单向绑定 | 双向绑定 |
模板能力 | 强大 | * | * |
*度 | 较小 | 大 | 较大 |
路由 | 静态路由 | 动态路由 | 动态路由 |
Vue.js是一个构建数据驱动的Web界面的库。
Vue.js通过简单的API(应用程序编程接口)提供高效的数据绑定和灵活的组件系统。
Vue.js的特性如下:
- 轻量级的框架
- 双向数据绑定
- 指令
- 插件化
与AngularJS的区别
相同点:
都支持指令:内置指令和自定义指令。
都支持过滤器:内置过滤器和自定义过滤器。
都支持双向数据绑定。
都不支持低端浏览器。
不同点:
1.AngularJS的学习成本高,比如增加了Dependency Injection特性,而Vue.js本身提供的API都比较简单、直观。
2.在性能上,AngularJS依赖对数据做脏检查,所以Watcher越多越慢。
Vue.js使用基于依赖追踪的观察并且使用异步队列更新。所有的数据都是独立触发的。
对于庞大的应用来说,这个优化差异还是比较明显的。
与React的区别
相同点:
React采用特殊的JSX语法,Vue.js在组件开发中也推崇编写.vue特殊文件格式,对文件内容都有一些约定,两者都需要编译后使用。
中心思想相同:一切都是组件,组件实例之间可以嵌套。
都提供合理的钩子函数,可以让开发者定制化地去处理需求。
都不内置列数AJAX,Route等功能到核心包,而是以插件的方式加载。
在组件开发中都支持mixins的特性。
不同点:
React依赖Virtual DOM,而Vue.js使用的是DOM模板。React采用的Virtual DOM会对渲染出来的结果做脏检查。
Vue.js在模板中提供了指令,过滤器等,可以非常方便,快捷地操作DOM。
38.跨组件双向数据绑定
答:通过 this.$emit('input')
修改最终的值,这是封装组件的关键所在:统一数据源。
39.delete 和 Vue.delete 删除数组的区别
答:delete只是被删除的元素变成了 empty/undefined 其他的元素的键值还剩不变。
Vue.delete 直接删除了数组,百变了数组的键值。
40.SPA 首屏加载慢如何解决
答:安装动态懒加载所需插件;使用CDN资源。
41.Vue-router 跳转和 location.href 有什么区别
答:使用 location.href=’/url’来跳转,简单方便,但是刷新了页面;
使用 history.pushState(’/url’),无刷新页面,静态跳转;
引进router,然后使用router.push(’/url’)来跳转,使用了diff算法,实现了按需加载,减少了dom的消耗。
其实使用router跳转和使用history.pushState()没什么差别的,因为vue-router就是用了history.pushState(),尤其是在history模式下。
42.vue slot
答:简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示、如何显示,就是slot分发负责的活。
43.你们 vue 项目是打包了一个 js 文件,一个 css 文件,还是有多个文件?
答:根据vue-cli脚手架规范,一个js文件,一个css文件。
44.vue 遇到的坑,如何解决的?
45.Vue 里面 router-link 在电脑上有用,在安卓上没反应怎么解决?
答:Vue路由在Android机上有问题,babel问题,安装babel polypill插件解决。
46.Vue2 中注册在 router-link 上事件无效解决方法
答:使用@click.native。原因:router-link会阻止click事件, .native指直接监听一个原生事件。
47.RouterLink 在 IE 和 Firefox 中不起作用(路由不跳转)的问题
答:方法一:只用a标签,不适用button标签;
方法二:使用button标签和Router.navigate方法
48.axios 的特点有哪些
答:从浏览器中创建XMLHttpRequests;
node.js创建http请求;
支持Promise API;
拦截请求和响应;
转换请求数据和响应数据;
取消请求;
自动转换成json
axios中的发送字段的参数是data跟params两个,两者的区别在于params是跟请求地址一起发送的,data的作为一个请求体进行发送
params一般适用于get请求,data一般适用于post put请求。
49.请说下封装 vue 组件的过程?
答:1. 建立组件的模板,先把架子搭起来,写写样式,考虑好组件的基本逻辑。
2.准备好组件的数据输入。即分析好逻辑,定好 props 里面的数据、类型。
3. 准备好数组的数据输出。即根据组件逻辑,做好要暴露出来的方法。
4. 封装完毕,直接调用即可。
50.vue 各种组件通信方法(父子 子父 兄弟 爷孙 毫无关系的组件)
51.params 和 query 的区别
答:用法:
query要用path来引入,params要用name来引入,接收参数都是类似的,分别是 this.$route.query.name
和 this.$route.params.name
。
url地址显示:query更加类似于我们ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示
注意:query刷新不会丢失query里面的数据
params刷新会丢失params里面的数据。
52.vue mock 数据
53 vue 封装通用组件
54.vue 初始化页面闪动问题
答:使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们还是有必要让解决这个问题的。
<div id="app" v-cloak>
{{context}}
</div>
<style>
[v-cloak] {
display: none;
}
</style>
在简单项目中,使用 v-cloak 指令是解决屏幕闪动的好方法。但在大型、工程化的项目中(webpack、vue-router)只有一个空的 div 元素,元素中的内容是通过路由挂载来实现的,这时我们就不需要用到 v-cloak 指令了。
55.vue 禁止弹窗后的屏幕滚动
答:vue弹窗屏蔽滑动的两种解决方案
56.vue 更新数组时触发视图更新的方法
答:push();pop();shift();unshift();splice(); sort();reverse()
57.vue 常用的 UI 组件库
答:Mint UI,element,VUX
58.vue 如何引进本地图片
答:两种方式
<!-- 第一种,只引入单个图片,这种引入方法在异步中引入则会报错。比如需要遍历出很多图片展示时 -->
<image :src=require('图片路径')>
<!-- 第二种,可引入多个图片,也可引入单个图片。vue-cli3版本没有static文件夹。可将静态图片存放到public目录下,直接引入即可 -->
<image src="/public/image/logo.png"/>
59.vue 如何引进 sass
60.vue 修改打包后静态资源路径的修改
答:cli3版本:在根目录下新建vue.config.js 文件,然后加上以下内容:(如果已经有此文件就直接修改)
module.exports = {
publicPath: '', // 相对于 HTML 页面(目录相同)
}
本文地址:https://blog.csdn.net/tyoubinn/article/details/109202704