以下只是我的个人观点,问题挺多的,希望各位大佬们走过路过能给我指错,大家互相学习互相进步感谢每一位留言解惑的大佬,有不对的地方可以在下方留言,瑟瑟发抖的菜狗感谢各位大佬们^V^
1:跨域有了解吗?如何解决跨域?
一个请求数据的协议、域名、端口号只要有一个不同就会出现跨域
1. 通过jsonp的方式解决跨域,jsonp的实现原理是JavaScript标签src引入的信息是不会出现浏览器跨域的情况,所以可以在这个脚本里面写一个回调函数调用的方式通过参数return来获取信息,但是只局限于get请求的数据
2. 前端解决跨域通过webpack的webpack-dev-server配置项,添加proxy代理解决跨域,后端部署项目解决跨域可以通过Nginx反向代理通过pass_proxy配置url实现,proxy的实现原理是出现跨域的情况来源于和服务器和浏览器(客户端)交互,浏览器的请求存在跨域问题,服务器和服务器交互就不存在跨域问题,这两个实现解决跨域的方式都是通过开启一个新的服务器,将新的服务器域名协议和端口号都配置成浏览器要访问的,这样本地的服务器和浏览器就不存在跨域请求问题了,数据都是通过本地服务器和外网服务器请求得来的
2:你对es6新特性了解哪些?
1. let ,const 定义变量
2. ()=>{} 箭头函数
3. 数组和对象的解构赋值
4. 扩展运算符
5. 模板字符串
6. promise和async/await
7. proxy
8. set/map
3:组件库如何做按需加载
一般来说全局引入的意思就是将所有的组件都一股脑的通过vue.componenter循环遍历一边组件全局注册进去,那么按需加载的意思就是如果用到了该组件库才给他全局注册进来,可以自定义一个数组用来放入你需要引入的那些组件,在遍历的时候比对所有的组件判断是否有该组件,过滤出你需要用到的组件并注册进入全局中使用就实现了按需加载组件的效果
4:有哪些判断方法可以判断类型?
Array.isArray() //只能判断数组
typeof array // 判断数据类型,只能做值类型判断和对象判断,不能判断具体的对象是数组还是对象
Array.prototype.call(array) //通过原型链+call的方式可以判断数据类型 [Object Array]
5:说一下你对原形链的理解?es6和es5继承的区别
原型链可以理解为一个链表的结构,通过显式原型function.prototype 或者隐式原型Function.__proto__将父级原型连接起来,最后都是Object.__proto__指向null(祖原型) 的一个链表结构数据,主要的作用是如果当前原型没有改数据的情况下,可以通过这个原型链找到父级的原型调用父级上面已有的方法或者数据来实现父子继承功能,ES5 是通过普通的函数通过工厂模式的定义方式返回函数构造声明的对象实现,Es6是加了一些class extends 等语法糖的关键字替代Es5的效果,他们的继承区别是Es5是通过函数传参的方式在内部返回一个对象,对象中有一个__proto__指向父级继承的对象实现继承,Es6有extends关键字指向继承的父级对象(这一块Es5的继承我不是很了解)
6:Vue如何实现的双向绑定原理
Vue2 是通过observer监听object.definepropty方法,这个方法第一个参数是一个对象,第二个参数是一个对象,这个对象里面有两个方法,seeter和getter
可以通过setter方法传参数修改参数的值,通过getter方法return返回来获取值
Vue3是通过proxy代理的方式来直接代理某个对象,并可以监听修改对象下面的所有key值,只要这个是一个代理对象,那么他的事件方法就能够被代理对象监听
区别:object.definepropty只能监听一个对象的key,而proxy可以监听对象的所有key
7:vue 组件通信方法
1. 父子组件间通信 父传子通过父组件传值子组件在props中接收父组件传来的值;子传父通过父组件写自定义事件,子组件通过调用自身函数使用$emit函数发射,第一个参数是父组件的自定义事件,第二个参数是子组件传给父组件的参数信息,父组件的自定义事件中的第一个参数就可以接收子组件传来的信息
2. 通过provide和inject 的方式实现祖孙之间的通信inject在祖组件中定义并定义数据对象,在孙组件中使用inject来获取provide中的数据信息
3. eventBus,和context 实现逻辑是在vue全局注入一个全局对象,这样所有的组件都可以通过this获取该vue实例的数据信息
8:vuex是什么?怎么使用?哪种功能场景使用它?
Vuex是一个vue用来管理数据的仓库,一般是将那些经常使用的全局数据保存在仓库中,vuex的使用方式是创建一个store仓库之后,创建一个state来存储变量默认信息,创建mutation同步修改state的状态值信息,创建getter来实现计算属性的效果,用一个变量值表示某一个逻辑结果信息,并且是响应信息,创建action来实现一些异步操作的数据修改,通过patch的方式commit mutation的同步信息实现同步操作,项目大了的情况下,创建moudle实现分模块管理vuex,一般在实现后台管理系统的时候,用户登陆时需要获取到用户的token信息并通过token拿到用户的角色信息和用户菜单信息,而这些信息在登陆状态下基本都需要使用,这时候把数据存入vuex中管理并通过localstorege实现数据的强缓存效果
9:再说一下虚拟Dom以及key属性的作用
虚拟dom的作用:通过AST语法树生成虚拟dom,可以实现编写一种规范的代码通过某种规则将虚拟dom对象转换成不同的xml语法,增强语法的灵活性和可扩展性
Key属性的作用:在vue的for循环变量dom时加一个key属性,他的作用是实现老的vdom对象和新的vdom对象通过diff算法比对时出现的一些差异化时,通过key值的比对,来做一次差异化配对,判断是否该位置key值是否相等,相等说明不需要重新渲染,所以key值必须保证唯一性才可以作为判断条件
10:防抖节流说一下
防抖 一段时间内再次触发会清除并重新计算这段时间,这段时间结束后触发事件
使用场景 异步请求时防止调用多次请求
节流:一段时间内不管触发多少次事件,最后只会触发一次
使用场景 监听鼠标移动的时获取鼠标的坐标值,控制获取坐标值的频率减少反复的调用