1.监控数据变化的实现原理不同。为什么React不能准确监控数据变化?这是因为Vue和React的设计理念不同。Vue使用可变数据,而React强调数据的不可变性。所以应该说没有好坏之分,在构建大型应用时,Vue更简单,React更健壮。二、数据流向的区别大家都知道Vue默认支持双向绑定。在Vue1.0中,我们可以实现两种双向绑定:propsv-model去掉了Vue2.x中的第一种,即父子组件之间不再可以进行双向绑定(但它提供了一种语法sugar来自动帮助你传递事件),Vue2.x不鼓励组件对其props进行任何修改。然而,React从一开始就不支持双向绑定。React一直提倡一种单向的数据流,他称之为onChange/setState()模式。但是,由于我们一般使用Vuex、Redux等状态管理框架进行单向数据流,所以往往感受不到这种差异。3.HOC和mixins我们在Vue中组合不同功能的方式是通过mixin,而在React中我们使用HOC(高阶组件)。React一开始也是用mixins,但是后来觉得这种方式对组件的侵入太大,会带来很多问题,所以放弃了mixinx,改用HoC。关于mixin有什么问题,可以参考这篇React官方文章MixinsConsideredHarmful。而Vue一直都是使用mixins来实现的。但是为什么Vue不用HOC来实现呢?因为高阶组件本质上是高阶函数,而React组件是纯函数,所以高阶函数对于React来说非常简单。但是Vue做不到。Vue中的组件是一个包装好的函数,而不是简单的我们定义组件时传入的对象或者函数。比如我们定义的模板是如何编译的?例如,声明的props是如何接收的?这些都是Vue在创建组件实例时隐式做的事情。既然vue默默的为我们做了这么多事情,如果我们直接把组件的声明包装起来,返回一个高层组件,那么包装好的组件是无法正常工作的。4、组件通信的区别Vue中实现组件通信的方式有3种:父组件通过props向子组件传递数据或回调。虽然可以传递回调,但我们一般只是传递数据,子组件通过事件机制处理与父组件的通信。子组件通过事件向父组件发送消息。V2.2.0中新增的provide/inject用于从父组件向子组件注入数据,可以跨越多个层级。在React中,也有三种对应的方式:父组件可以通过props向子组件传递数据或者回调可以通过context进行跨层通信,这实际上类似于provide/inject。可见React本身是不支持自定义事件的。Vue中子组件向父组件传递消息有两种方式:事件和回调函数,而Vue更喜欢使用事件。但是在React中,我们都使用回调函数,这可能是它们之间最大的区别。5.渲染模板的差异从表面上看,模板的语法是不同的。React通过JSX渲染模板,而Vue通过扩展的HTML语法渲染模板。但实际上,这只是表面现象。毕竟,React不必依赖JSX。从深层次来说,模板的原理不同,这是它们本质的区别:React在组件JS代码中通过原生JS实现模板中的常用语法,比如插值、条件、循环等,都是通过JS语法实现的Vue与组件的JS代码在单独的模板中实现,通过指令实现。例如,一个条件语句需要v-if来实现。react中的render函数支持闭包特性,所以我们导入的组件可以直接在render调用中使用。但是在Vue中,由于模板中使用的数据必须挂在this上进行中转,所以我们导入一个组件后,需要在components中进行声明,这显然很奇怪但又不得不这样。6.Vuex和Redux的区别从表面上看,store注入和使用有一些区别。在Vuex中,$store是直接注入到组件实例中的,因此可以更灵活的使用:使用dispatch和commit通过mapState提交更新或者直接通过this.$store读取数据。在Redux中,我们每个组件都需要display使用connect来连接所需的props和dispatch。另外,Vuex更加灵活。Components既可以dispatchaction也可以commitupdates,而Redux只能dispatch,不能直接调用reducer修改。在实现原理上,最大的区别有两点:Redux使用的是不可变数据,而Vuex的数据是可变的。Redux每次都是用新状态替换旧状态,而Vuex在检测数据变化时直接修改Redux通过diff比较差异,而Vuex其实和Vue一样,通过getter/setter进行比较(如果看Vuex源码代码,你就会知道,其实他直接在内部创建了一个Vue实例来跟踪数据的变化)7.diff算法不同。这两个过程在思想上是相似的,它们都基于两个假设(使算法复杂度降低到O(n)):不同的组件产生不同的DOM结构。当类型不同时,对应的DOM操作是直接销毁旧的DOM,创建新的DOM。同一层级的一组子节点可以通过一个唯一的键来区分。但是两者在源码实现上是有区别的:Vue是基于snabbdom库,具有更好的速度和模块机制。VueDiff使用双向链表在比较时更新DOM。React主要是通过diff队列存储哪些DOM需要更新,获取patchtree,然后统一操作,批量更新DOM。八、事件机制不同Vue原生事件使用标准web事件Vue组件自定义事件机制,这是父子组件通信的基础Vue合理使用了snabbdom库的模块插件ReactReact原生事件封装,所有事件冒泡上到顶层文件进行监控,然后在这里下发合成事件。基于这个集合,事件机制可以跨终端使用,而不是强绑定到WebDOM。React组件上没有事件,父子组件通信使用props
