CVTE电话面
1.为什么使用Vuex来管理状态
2.还有什么多级组件的传递方式
$attrs/$listeners:实现多层嵌套传递,$attrs包含没有被props声明的属性(不包括class和style),如果某个prop被子组件声明了(这个属性已经再子组件的props中),再子组件的$attr会把声明的prop踢出,并且可以通过v-bind=“$attrs”传入内部组件。inheritAttrs:false可以关闭自动挂载到根元素上的没有再props声明的属性。
$listeners:包含了父作用域中的(不含.native修饰器的)v-on事件监听器,它可以通过v-on=“$listeners”传入内部组件。
Provide/inject:主要解决了跨级组件间的通信问题,祖先通过provider来提供变量,然后再子孙组件中通过inject来注入变量。但是provide和inject绑定并不是响应式的,如果传入例如一个可监听的对象,那么其对象的属性还是可响应的。
3.Vue的双向绑定
https://segmentfault.com/a/1190000006599500
mvvm 模式实现双向绑定,view与model不直接进行交互利用VM来实现数据的交互,MVVM 作为数据绑定的入口,整合 Observer(数据监听器,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者)、Compile (指令解析器,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数)和 Watcher (观察者,能够订阅并收到每个属性变动的通知,执行指令绑定的相应的回调函数)三者,通过Observer来监听自己的 model 数据变化,通过 Compile 来解析编译模板指令,最终利用 Watcher 搭起 Observer 和 Compile 之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据 model 变更的双向绑定效果。
4.MVVM是什么演变过来的
https://www.jianshu.com/p/b0aab1ffad93
https://www.jianshu.com/p/ff6de219f988
5.MVC解决了什么问题,为什么前端采用MVC模式
6.状态码304,404,500
304 缓存未改动,使用原先缓存内容,404服务器请求不到页面资源
500,服务器内部错误
7.协商缓存和强制缓存
https://segmentfault.com/a/1190000008956069
8.ES6的特性
9.面向对象的三大特性
继承,封装,多态
封装:就是当你需要隐藏一些属性和方法是,就可以将这些属性和方法封装起来,然后通过一个外部可以调用的特定接口(也可以说是一个公共的方法)进行调用。
继承:原型链的继承,构造函数继承,组合继承,寄生继承,寄生组合继承
多态:多态就是通过对传递的参数判断来执行逻辑,即可实现一种多态处理机制
10.TCP,UDP的区别,http是基于哪个协议的,是哪个层,DNS是哪个层
TCP是面向连接的,而UDP是无连接的,即发送数据前不建立连接
TCP提供可靠的服务,通过TCP传输的数据无差错,不丢失,不重复;UDP尽最大努力交付,不保证可靠交付,可能出现丢包。
TCP是面向字节流,分组发送;UDP面向报文,并且网络拥塞不会使得发送速率降低
TCP只能是1对1的,UDP支持一对多
http是基于TCP协议的,是应用层,DNS解析也是应用层
11.Js函数提升和变量提升,为什么
js代码执行前引擎会先进行预编译,预编译期间会将变量声明与函数声明提升至其对应作用域的最顶端。
在我们的js中,代码的执行时分两步走的,1、解析 2、一步一步执行
那么变量提升就是变量声明会被提升到作用域的最顶上去,也就是该变量不管是在作用域的哪个地方声明的,都会提升到作作用域的最顶上去。函数声明式,会将函数的声明和定义一起提升到作用域的最顶上去。如果函数声明和变量声明使用的是同一个变量名称,函数声明的优先级高于变量声明的优先级。
12.写了一个JS脚本,在浏览器上执行,是怎么样的一个执行过程(任务队列)
https://www.jianshu.com/p/12b9f73c5a4f
13.Vue-router原理
https://www.jianshu.com/p/4295aec31302
可以通过mode方法选择路由方式,harsh模式,history模式,
hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash 读取;
特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务 端完全无用,hash不会重加载页面。加载url中指示网页中的位置。
hash 模式下,仅 hash 符号之前的内容会被包含在请求中,如 http://www.xxx.com,因 此对于后端来说,即使没有做到对路由的全覆盖,也不会返回 404 错误。
HashHistory.push() **将新路由添加到浏览器访问历史的栈顶
replace()方法与push()方法不同之处在于,它并不是将新路由添加到浏览器访问历史的栈顶,而是替换掉当前的路由
这种 #。后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请 求,也就不会刷新页面。另外每次 hash 值的变化,还会触发hashchange 这个事件, 通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听 hashchange来实现更新页面部分内容的操作:
history模式:通过back(), forward(), go()等方法,我们可以读取浏览器历史记录栈的信 息,进行各种跳转操作。且提供了两个新方法:pushState(),replaceState()可以对 浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。这2个方法有个 共同的特点:当调用他们修改浏览器历史栈后,虽然当前url改变了,但浏览器不会立 即发送请求该url,这就为单页应用前端路由,更新视图但不重新请求页面提供了基础
history 模式下,前端的 URL 必须和实际向后端发起请求的 URL 一致, 如 http://www.xxx.com/items/id。后端如果缺少对 /items/id 的路由处理,将返回 404 错误。