vue面试知识点

6 篇文章 0 订阅
2 篇文章 0 订阅

1. Vue优势

Vue专注于MVVM模式的viewmodel层,通过双向绑定把view和model层连接起来,操作数据重新渲染页面,vue有优势是简单快捷组合紧凑

2. Vue2.0/vue1.0

每个组件模板中不在支持片段代码

组件的定义发生了改变和升级

生命周期发生了变化

3. 浏览器兼容(高低兼容)

1、不同浏览器的标签默认的外补丁( margin )和内补丁(padding)不同

解决方案: css 里增加通配符 * { margin: 0; padding: 0; }

2、IE6双边距问题;在 IE6中设置了float , 同时又设置margin , 就会出现边距问题

解决方案:设置display:inline;

3、当标签的高度设置小于10px,在IE6、IE7中会超出自己设置的高度

解决方案:超出高度的标签设置overflow:hidden,或者设置line-height的值小于你的设置高度

4、图片默认有间距

解决方案:使用float 为img 布局

5、IE9一下浏览器不能使用opacity

解决方案:

opacity: 0.5;filter: alpha(opacity = 50);filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);

6、边距重叠问题;当相邻两个元素都设置了margin 边距时,margin 将取最大值,舍弃最小值;

解决方案:为了不让边重叠,可以给子元素增加一个父级元素,并设置父级元素为overflow:hidden;

7、cursor:hand 显示手型在safari 上不支持

解决方案:统一使用 cursor:pointer

8、两个块级元素,父元素设置了overflow:auto;子元素设置了position:relative ;且高度大于父元素,在IE6、IE7会被隐藏而不是溢出;

解决方案:父级元素设置position:relative

判断浏览器

navigator = window.navigator,

agent = navigator.userAgent.toLowerCase(),

4. 路由权限控制

5. Vue打包配置项

1、build/dev-server.js 文件 项目node的启动文件,这里面做了webpack配置和node操作,

2、build/webpack.base.conf.js webpack基本配置文件

3、build/webpack.dev.conf.js 开发环境webpack配置

4、build/webpack.prod.conf.js 正式环境的webpack配置

5、build/build.js 执行打包的配置文件

6、config/index.js 开发、线上环境的文件输出、打包等一些配置

这是脚手架里面的一些主要配置文件,通过配置,整个项目分为开发环境和生产环境,不需要你多做很多繁琐的工作,用起来很方便,如果你想按照自己的喜好或者需求,可以修改主题文件的配置,下面我们就附上上述每个文件的代码和注释。    ps:代码我修改过,不是完全一样的,大家主要看看文件功能,和一些代码、组件的含义。

6. 跨域

XMLHttpRequest Level2

XHR2是HTML5新特性中的一个(事实上没有什么XHR1,XHR2这样的概念,XHR2只是HTML5提供的一套新的规范),在原有XHR对象上新增了一些功能:跨域访问,全新的事件,还有请求进度以及响应进度。

Response.AddHeader(“Access-Control-Allow-Origin”,"*") ;//跨域访问

1、 Jsonp解决

this.$http.jsonp(‘http://www.demo2.com:8080/login’, {

​ params: {},

​ jsonp: ‘onBack’

}).then((res) => {

​ console.log(res);

})

2、 document.domain + iframe跨域

3、 location.hash + iframe

4、 window.name + iframe跨域

5、 postMessage跨域

6、 跨域资源共享(CORS)

7、 nginx代理跨域

8、 nodejs中间件代理跨域

9、 WebSocket协议跨域

7. History/hash

hash —— 即地址栏 URL 中的 # 符号(此 hash 不是密码学里的散列运算)。

比如这个 URL:http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定浏览器支持)

hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。公共组件封装

hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.abc.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。

history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致,如 http://www.abc.com/book/id。如果后端缺少对 /book/id 的路由处理,将返回 404 错误。Vue-Router 官网里如此描述:“不过这种模式要玩好,还需要后台配置支持……所以呢,你要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。”

8. Vuex数据处理

vuex就是一个存放多个组件共用的一个数据的存放、更改、处理的一个容器,就是说来存放处理公共数据的工具,存放的数据一变,各个组件都会更新,也就是说存放的数据是响应式的。

9. Css处理器优先级

通用选择器(*) < 元素(类型)选择器 < 类选择器 < 属性选择器 < 伪类 < ID 选择器 < 内联样式

10. Div上下左右

11. Js原型链 变量提升

原型链

所有的实例对象都有__proto__属性, 它指向的就是原型对象

这样通过__proto__属性就形成了一个链的结构---->原型链

当查找对象内部的属性/方法时, js引擎自动沿着这个原型链查找

当给对象属性赋值时不会使用原型链, 而只是在当前对象中进行操作

变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined)

12. 弹性

只需要设置display:flex只需要设置display:flex

13. 满足什么条件才算跨域(IP相同,port不同)

跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。

所谓同源是指,域名,协议,端口均相同,只要有一个不同,就是跨域。不明白没关系,举个栗子:

http://www.123.com/index.html 调用 http://www.123.com/server.php (非跨域)

http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。

14. Vue组件

Vue.component(“mycomponent”,{}

15. 闭包

闭包

  • 理解:

  • 当嵌套的内部函数引用了外部函数的变量时就产生了闭包

  • 通过chrome工具得知: 闭包本质是内部函数中的一个对象, 这个对象中包含引用的变量属性

  • 作用:

  • 延长局部变量的生命周期

  • 让函数外部能操作内部的局部变量

  • 写一个闭包程序


function fn1() {

 var a = 2;

 function fn2() {

  a++;

  console.log(a);

 }

 return fn2;

}

var f = fn1();

f();

f();

  • 闭包应用:

  • 模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为

  • 循环遍历加监听

  • JS框架(jQuery)大量使用了闭包

  • 缺点:

  • 变量占用内存的时间可能会过长

  • 可能导致内存泄露

  • 解决:

  • 及时释放 : f = null; //让内部函数对象成为垃圾对象

16. Typeof instanceof

1、typeof返回结果是该类型的字符串形式表示【6】(number、string、undefined、boolean、function、object)

注意

typeof对于原始类型来说,除了null都可以显示正确类型

typeof对于对象来说,除了函数都会显示object

2、instanceof是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型。

instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

17. Js 继承实现

18. Px/em的区别

19. 页面性能

资源压缩合并,减少HTTP请求(图片合并、JS脚本文件合并、CSS文件合并)

非核心代码异步加载——异步加载的方式——异步加载的区别

利用浏览器缓存——缓存的分类——缓存的原理

使用CDN(网络优先)——本质上是一个缓存,将数据缓存在离用户最近的地方,一般缓存的是静态资源

将CSS放在页面最上面,将JS放在页面最下面(页面从上到下加载)

把JS和CSS提取出来放在外部文件中(优点:减少了http体积,提高了js和css的复用性,提供可维护性;缺点:增加了http 请求,可通过缓存解决)

预解析DNS,减少DNS查询(DNS将请求的域名转换为对应的IP地址,然后将IP返回给浏览器,此过程会花费一定时间,影响页面加载)——方法:缓存DNS查找!

20. MVVM理解

21. Vue生命周期

22. Vue组件数据传递

23. Vue路由实现

利用 Vue.js 提供的插件机制 .use(plugin) 来安装 VueRouter

vue-router是Vue.js框架的路由插件,它是通过mode这一参数控制路由的实现模式的:

const router=new VueRouter({

mode:‘history’,

routes:[…]

})

import Vue from ‘vue’

import Router from ‘vue-router’

import Home from ‘@/pages/home/Home’

import City from ‘@/pages/city/City’

Vue.use(Router)

export default new Router({

routes: [

{

path: ‘/’,

name: ‘Home’,

component: Home

},

{

path: ‘/city’,

name: ‘City’,

component: City

}

]

})

24. Vue路由钩子函数

主要包括beforeEach和aftrEach,

beforeEach函数有三个参数:

to:router即将进入的路由对象

from:当前导航即将离开的路由

next:Function,进行管道中的一个钩子,如果执行完了,则导航的状态就是 confirmed (确认的);否则为false,终止导航。

afterEach函数不用传next()函数

这类钩子主要作用于全局,一般用来判断权限,以及以及页面丢失时候需要执行的操作,例如:

//使用钩子函数对路由进行权限跳转

router.beforeEach((to, from, next) => {

const role = localStorage.getItem(‘ms_username’);

if(!role && to.path !== ‘/login’){

​ next(’/login’);

}else if(to.meta.permission){

​ // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已

​ role === ‘admin’ ? next() : next(’/403’);

}else{

​ // 简单的判断IE10及以下不进入富文本编辑器,该组件不兼容

​ if(navigator.userAgent.indexOf(‘MSIE’) > -1 && to.path === ‘/editor’){

​ Vue.prototype.$alert('vue-quill-editor组件不兼容IE10及以下浏览器,请使用更高版本的浏

​ 览器查看’, ‘浏览器不兼容通知’, {

​ confirmButtonText: ‘确定’

​ });

​ }else{

​ next();

​ }

}

25. Vuex是什么 怎么用

26. Vue打包配置项

vue中打包生成可配置文件以便修改接口地址

27. H5新特性

Web前端最新的官方标准无疑就是es6和H5了,es6之前已经说过了(多是一些语法糖),现在来总结一下H5给我们来了哪些新“朋友”吧~

1.video/radio 视频/音频

2.canvas 绘画

3.geolocation 定位

4.WebSocket 前后端双向通讯

5.localStorage/sessionStorage代替cookie本地存储

6.文件拖拽(drag事件+dataTransfer+FileReader)

7.WebWorker js多线程,提高性能

8.WebSQL 前端数据库(已被官方弃用)

9.manifest 离线缓存

同时也新增了一些标签,常用的有:header、nav、section、aside、footer

28. 单独路由

建立一个 router.js 文件

引入

import Vue from 'vue'

import VueRouter from 'vue-router'

import Home from '../components/home/home.vue'

然后注册

Vue.use(VueRouter);

const router = new VueRouter({

​	mode : 'history',

​	base: __dirname,

 	routes: [

​	 	{

​	   	path:  historyUrl + '/',

​	   	component: Home,

​	   	name : '主页'

​	 	},

]}

最后暴露出云

export default router

在main.js 里面直接引入然后就可以用了

import router from './main/router.js'

const app = new Vue({

​	router : router,

​	watch : {

 		'$route' (to,from,next){

 			//console.log(to) //路由监听

 			//console.log(from)

 		}

 	},

​	render : h => h(App)

}).$mount('#app');

 

别的 js 文件如果要调用 router 方法,直接像 main.js 一样引入直接用就可以了

29. 常用指令Vue-router动态路由 怎么获取参数 拦截做什么 token登录

#30.Vue-router动态路由 怎么获取参数 拦截做什么 token登录

this. r o u t e . q u e r y . i d , t h i s . route.query.id,this. route.query.idthis.route.params.idVue-router动态路由 怎么获取参数 拦截做什么 token登录

31. Vue操作dom吗

32. 哪些适合vue(数据多、手机web、APP共用一套、利于跨平台)

33. Vue+iview

1、js数据类型有几种,如何判断数据的类型

基本类型:String、Number、Boolean、Symbol、Undefined、Null

引用类型:Object

Typeof、instanceof

2、如何判断某个变量是数组

arr instanceof Array

3、H5的本地存储特性是什么,最大存储量是多少

(1)两个接口:分别是localStorage和sessonStorage

(2)四个函数:分别是setItem、getItem、removeItem和clear

最大存储:

不同浏览器对 HTML5 的本地存储大小如下:

IE 9 > 4999995 + 5 = 5000000

firefox 22.0 > 5242875 + 5 = 5242880

chrome 28.0 > 2621435 + 5 = 2621440

safari 5.1 > 2621435 + 5 = 2621440

opera 12.15 > 5M

不同手机对 HTML5 的本地存储大小基本均有限制,一个测试的结果如下:

iPhone > 2M + 512 = 2.5M

android 2M

在这里插入图片描述

4、用过Promise吗,Promise的作用

Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。

5、vue子父组件之间相互传值

props

6、vue生命周期

  • beforeCreate:实例刚在内存中被创建出来,此时,还没有初始化好 data 和 methods 属性

​ + created:实例已经在内存中创建OK,此时 data 和 methods 已经创建OK,此时还没有开始 编译模板

​ + beforeMount:此时已经完成了模板的编译,但是还没有挂载到页面中

​ + mounted:此时,已经将编译好的模板,挂载到了页面指定的容器中显示

  • 运行期间的生命周期函数:

    • beforeUpdate:状态更新之前执行此函数, 此时 data 中的状态值是最新的,但是界面上显示的 数据还是旧的,因为此时还没有开始重新渲染DOM节点

    • updated:实例更新完毕之后调用此函数,此时 data 中的状态值 和 界面上显示的数据,都已经完成了更新,界面已经被重新渲染好了!

  • 销毁期间的生命周期函数:

    • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。

    • destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。
      在这里插入图片描述

在这里插入图片描述

7、如何判断是ios系统还是安卓系统,手机型号从什么对象中取

methods:{

downApp() {

​ let ua = navigator.userAgent.toLowerCase();

​ //Android终端

​ let isAndroid = ua.indexOf(‘Android’) > -1 || ua.indexOf(‘Adr’) > -1;

·   //Ios终端

​ let isiOS = !!ua.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);

​ if (isWeixinBrowser()) {

​ this.$router.push({

​ path: ‘/product’

​ })

​ } else {

​ if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {

​ //Ios

​ } else if (/(Android)/i.test(navigator.userAgent)) {

​ //Android终端

​ window.location = ‘http://www.xyfan.top/app.apk’

​ }

​ }

​ function isWeixinBrowser() {

​ return (/micromessenger/.test(ua)) ? true : false;

​ }

}

}

8、路由拦截,一般会在路由拦截中做什么

在一个vue项目中很多页面是需要登录后才有权限访问的,所以需要在前端做路由拦截判断用户是否可以访问该页面。

const routes = [

{

path: ‘/’,

name: ‘Index’,

meta: {

requireAuth: true,

},

components: Index

},

{

path: ‘/login’,

component: Login

}

];

9、vue中有几种定时器,啥区别

在项目中,我们经常会使用到定时器setInterval(),可是很多时候我们会发现,即使我退出当前页面,定时器依然在工作,非常消耗内存,所以我们要进行手动清理:

将定时器保存在变量中,退出页面时清除变量

1.定义空的变量

data: function (){

return {

timer: null

}

}

2.定义定时器

methods: {

setTimer: function () {

this.timer = setInterval( () => {

}, 1000)

}

}

3.进入和退出时清除定时器

mounted() {

clearInterval(this.timer)

},

distroyed: function () {

clearInterval(this.timer)

}

截判断用户是否可以访问该页面。

const routes = [

{

path: ‘/’,

name: ‘Index’,

meta: {

requireAuth: true,

},

components: Index

},

{

path: ‘/login’,

component: Login

}

];

9、vue中有几种定时器,啥区别

在项目中,我们经常会使用到定时器setInterval(),可是很多时候我们会发现,即使我退出当前页面,定时器依然在工作,非常消耗内存,所以我们要进行手动清理:

将定时器保存在变量中,退出页面时清除变量

1.定义空的变量

data: function (){

return {

timer: null

}

}

2.定义定时器

methods: {

setTimer: function () {

this.timer = setInterval( () => {

}, 1000)

}

}

3.进入和退出时清除定时器

mounted() {

clearInterval(this.timer)

},

distroyed: function () {

clearInterval(this.timer)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值