1.设计思想 vue的官网中说它是一款渐进式框架,采用自底向上增量开发的设计。 react主张函数式编程,所以推崇纯组件,数据不可变,单向数据流,当然需要双向的地方也可以手动实现, 比如借助 onChange 和 setState 来实现一个双向的数据流。
2.编写语法Vue推荐的做法是webpack+vue-loader的单文件组件格式,vue保留了html、css、js分离的写法React的开发者可能知道,react是没有模板的,直接就是一个渲染函数,它中间返回的就是一个虚拟DOM树,React推荐的做法是JSX + inline style,也就是把HTML和CSS全都写进JavaScript了,即'all in js'。
3.构建工具 vue提供了CLI 脚手架,可以帮助你非常容易地构建项目。 React 在这方面也提供了 create-react-app,但是现在还存在一些局限性,不能配置等等
4.数据绑定 vue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层。 在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View。 (这里我们可以继续深入讲解一下双向数据绑定的原理,我之前的文章手写Vue源码可参考) react是单向数据流,react中属性是不允许更改的,状态是允许更改的。 react中组件不允许通过this.state这种方式直接更改组件的状态。自身设置的状态,可以通过setState来进行更改。 (注意:React中setState是异步的,导致获取dom可能拿的还是之前的内容, 所以我们需要在setState第二个参数(回调函数)中获取更新后的新的内容。) 【这里如果你了解深入的话可以尝试描述一下React中setState的异步操作是怎么实现的,Vue中的更新是通过微任务等】
5.diff算法vue中diff算法实现流程:
1.在内存中构建虚拟dom树
2.将内存中虚拟dom树渲染成真实dom结构
3.数据改变的时候,将之前的虚拟dom树结合新的数据生成新的虚拟dom树 4.将此次生成好的虚拟dom树和上一次的虚拟dom树进行一次比对(diff算法进行比对),来更新只需要被替换的DOM, 而不是全部重绘。在Diff算法中,只平层的比较前后两棵DOM树的节点,没有进行深度的遍历。
5.会将对比出来的差异进行重新渲染 react中diff算法实现流程: DOM结构发生改变-----直接卸载并重新create DOM结构一样-----不会卸载,但是会update变化的内容 所有同一层级的子节点.他们都可以通过key来区分-----同时遵循1.2两点 (其实这个key的存在与否只会影响diff算法的复杂度,换言之,你不加key的情况下, diff算法就会以暴力的方式去根据一二的策略更新,但是你加了key,diff算法会引入一些另外的操作)React会逐个对节点进行更新,转换到目标节点。而最后插入新的节点,涉及到的DOM操作非常多。diff总共就是移动、删除、增加三个操作,而如果给每个节点唯一的标识(key),那么React优先采用移动的方式,能够找到正确的位置去插入新的节点。
vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。而对于React而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldComponentUpdate这个生命周期函数方法来进行控制。