2018-03-28 常考Vue知识点

1、Vue双向数据绑定的原理

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

具体步骤:(1)第一步:需要observe(发布者)的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化 (2) 第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图 (3)第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:1、在自身实例化时往属性订阅器(dep)里面添加自己 2、自身必须有一个update()方法3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调,则功成身退。(4)第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。

2、Vue虚拟DOM树的原理

在大型项目中,不断的改变DOM,开销非常大;希望以最小的修改量实现DOM树的更新。维护状态,更新视图

原理步骤:(Virtual DOM 本质上就是在 JS 和 DOM 之间做了一个缓存,只将变更写入DOM)

(1)用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中

(2)当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异

(3)把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了

注意:视图的结构确实是整个全新渲染了,但是最后操作DOM的时候确实只变更有不同的地方

Virtual DOM 的 diff 算法只对同级元素进行对比;Virtual DOM 算法主要是实现上面步骤的三个函数:elementdiffpatch

原地复用,用key值解决。(同级中相同的节点类型会复用)

https://www.zhihu.com/question/29504639/answer/73607810

https://blog.csdn.net/yczz/article/details/51292169

3、Vue-router如何实现路由跳转的

(1)监控路由变化的history对象

安装插件\根据路由配置生成router实例 \将router实例传入根vue实例 

(2)主动触发<router-link>  

router-link绑定了click方法,触发history.push或者history.replace,从而触发history.transitionTo 同时会监控hashchange和popstate来对路由变化作对用的处理

4、Vuex的状态管理的流程

Vuex全局单例模式管理

在Vue组件中dispatch actions,action中commit mutations,mutations是唯一可以触发state中数据状态更新的方法。

5、Vue的生命周期钩子函数有哪些,mouted钩子和created钩子不同

总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。

创建前/后: 在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。在created阶段,vue实例的数据对象data有了,$el还没有。载入前/后:在beforeMount阶段,vue实例的$el和data都初始化了,但还是虚拟的dom节点,data.message还未替换。在mounted阶段,vue实例挂载完成,data.message成功渲染。更新前/后:当data变化时,会触发beforeUpdate和updated方法。销毁前/后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。

6、Vue父子间通信

(1)子组件使用props:[]暴露出属性,父组件直接传值修改props——父向子传值

(2)自定义事件:在子组件的实现方法中利用this.$emit("a")触发a事件,当父组件调用子组件时,直接在该子组件上@a进行触发——子向父传值

父子间通信实例

7、用Vue实现一个非父子组件间的点击改变对方背景色或者改变对方内容;再用Jquery实现;并将Vue和Jquery进行对比

样式
用vue点击一个按钮改变另一个按钮的内容
用vue改变对方背景色

过程:(1)新建Vue对象(2)将父组件的id挂载到el上(3)用data填充数据,massage,活动的class一会style信息等(4)添加method方法

注意:对css的操作可以通过绑定class或者绑定style

以下时Jquery方法(样式同上):

点击改变内容以及颜色

区别:

Vue直接操作视图层,不需要操作DOM节点,我们只需要关注逻辑,完全实现了视图层和逻辑层的解耦;

Jquery的操作是基于DOM节点的操作,它的优势在于良好的封装和兼容,使调用简单方便。

8、Vue中的请求代码应该放在组件的method中还是Vuex的action中?你是怎么做的?

我在项目中的做法:将登陆请求以及对返回数据的处理写在业务组件的method中,将姓名和邮箱信息等利用localstorage中,放到vuex的module中处理,其它页面需要显示相关信息时,取得数据即可。因为这是组件自己的请求,放在method中是没问题的,不存在复用问题。

我个人的思考是:大型项目中,要实现代码复用,可以将请求封装到Actions中,业务代码逻辑中只有对Actions的调用操作,将请求返回的数据处理好之后传入mutations中,mutations中仅仅是对数据进行增删改的处理,然后映射到state中。在组件中dispatch Actions后,异步commit mutations,直接改变state中的数据,state中的数据变化直接触发View视图的更新,符合数据流的走向。

9、Vue中computed、method和watch的区别?

computed计算属性:HTML DOM加载完成后立即执行,相当于赋值。计算属性是根据依赖进行缓存的,只有当依赖改变时,才会重新计算求值;依赖不改变时,不会调用该函数而是直接返回之前的值。

method属性:需要一定的条件触发调用后才能执行,比如click。只要页面重新渲染就会调用method中的函数。

PS:当一个性能开销很大的计算属性A,要遍历很大的数组,又有别的计算属性依赖于A,这时,利用计算属性的缓存原理,可以避免多次重复计算。这种情况下显然不适合用method。

watch侦听器:(自定义侦听器)Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

10、为什么要使用key?

key是Vue中识别节点的通用机制;页面更新重新渲染时,同一级的节点默认是原地复用的渲染规则。

key 的特殊属性主要用在 Vue的虚拟DOM算法,在新旧nodes对比时辨识VNodes。如果不使用key,Vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法(如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。)。使用key,它会基于key的变化重新排列元素顺序,并且会移除key不存在的元素。(高效更新虚拟DOM)

有相同父元素的子元素必须有独特的key。重复的key会造成渲染错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容