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-loader npm 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 = newLengthvue针对这两个问题给出了响应的解决办法,使用这两种方法,也会触发状态更新:
使用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.三大框架的对比
AngularReactVue组织方式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 页面(目录相同) }