zoukankan      html  css  js  c++  java
  • 三大框架的对比

      Vue和React都使用虚拟dom,React拥有更加丰富的生态系统。

    渲染上的区别

      React重新渲染的时候会以这个组件为根,将整颗子树进行渲染,手动实现shouldComponentUpdate进行优化,而Vue组件的依赖是在渲染过程中自动追踪的,所以系统能精确知晓哪个组件确实需要被重渲染。你可以理解为每一个组件都已经自动获得了 shouldComponentUpdate,并且没有上述的子树问题限制。

    对于html的表达

      对于html的表达,vue使用的是模板,模板比jsx读起来更加自然,而且基于模板的项目更容易往vue迁移,vue其实也支持jsx,不过更推荐使用模板;而react使用的是jsx,jsx是javascript的语法糖,里面可以写变量、流程控制,引用当前作用域的值等。

    实现作用域内的css

      react实现作用域内的css需要使用一些CSS-in-JS库来实现,而对于单文件的vue,只需要在style标签中加一个scoped即可,如果要进行其他样式预处理,全部都在style标签中

    学习成本

      学习react,需要知道相关的工具使用,如jsx、babel等,但学习vue,可能只需要不到一天时间看官方文档,就可以写出简单的程序了

    对于双向绑定

      在react中使用表单相当麻烦,为了维持双向绑定,必须要每个字段对应一个onchange函数。

      在angular 1 中有双向绑定,但因为这点太灵活了不好管理,导致很多时候没法跟踪数据的变化,不知道哪里改变了这个值。

      vue也支持双向绑定(v-model),但默认使用的是单向数据流

    原生渲染

      react和vue都具有编写app的能力,分别对应react native 和 weex,但react native更加成熟

    vue和angular的性能对比

      angular使用脏检测、watcher多的时候,脏检测很慢,而且可能要循环多次,对这里的优化可能会比较复杂

      vue能精准跟踪依赖的变化,而不需要像angular进行循环,效率更高

    组件间的通信对比

    angular

      对于作用域,如果组件处于不同作用域,可以使用emit、broadcast等作用域通信,同一个作用域的话,就通过这个作用域来通信;

      对于controller:可以通过require获取指令的controller来通信,或者使用共有的controller来通信

      对于传参:传入一个函数,传入单向绑定的值,或双向绑定的值

    vue

      通过props传递的数据是单向的,即从上往下。

      从下往上的方式(自定义事件)是父组件通过v-on传递一个函数给子组件,子组件中执行emit,触发该函数。其实不用v-on,直接通过props传递一个函数供子组件调用也行:

        Vue.component('son', {
            template:'<button @click="click">son</button> ',
            props: ['cb'],
            data:function(){
                var cb = this.cb;
                return {
                    click:function(){
                        cb();
                    }
                }
            }
        })
        Vue.component('parent', {
            template:'<son :cb="cb"></son>',
            data:function(){
                return {
                    cb:function(){
                        alert("function in parent execed")
                    }
                }
            }
        })
        new Vue({
            el: '#root',
            template:'<parent></parent>'
        })

     

      对于非父子组件的通信:

    var bus = new Vue()
    // 触发组件 A 中的事件
    bus.$emit('id-selected', 1)
    // 在组件 B 创建的钩子中监听事件
    bus.$on('id-selected', function (id) {
      // ...
    })

     

     react

      通过props传递值实现从上往下的通信,这是单向的,而对于从下往上,和vue类似,通过props传递一个函数供子组件调用即可。

      以上是子组件调用父组件,通过props。而父组件调用子组件,可以通过ref获取子组件的实例对象,再与之进行通信

      而对于兄弟组件间的通信,使用全局的eventBus,或者接着一个共有的父组件来通信:子组件调用props传来的父组件的函数,通知父组件发消息给另外的子组件,父组件setState更新另外一个子组件的props,从而达到通信(显然这种性能太差,默认情况下setState会刷新整颗树),更好的方式是使用redux或flux

    列表渲染对比

      angular通过显式指定track by来实现列表元素dom的复用

      而react和vue都采用虚拟dom,则通过指定key来实现复用。不指定key的时候前者会有warning,而后者不会,不指定key默认都是key=index,也就是就地复用,当key重复的时候,也都是第一个key会进行dom复用,而后一个key则创建新的dom

    参考:

      http://www.cnblogs.com/hellohello/p/8068008.html

      http://www.cnblogs.com/hellohello/p/8150400.html

    总结:

      三个框架中都需要一个标识来追踪数组中(循环创建)的dom,只不过vue和react默认是以index作为标识,而ng1默认以对象的$$hashkey来标识(对于原始类型则是对应的值来标识),用于追踪dom的标识不存在的话,则移除这个dom,创建新的dom,存在的话则复用。

    选择React,为什么不选Angular

    react:强大的生态圈 + 虚拟dom + jsx同构 + 单向数据流

  • 相关阅读:
    PAT顶级 1015 Letter-moving Game (35分)
    PAT顶级 1008 Airline Routes (35分)(有向图的强连通分量)
    PAT顶级 1025 Keep at Most 100 Characters (35分)
    PAT顶级 1027 Larry and Inversions (35分)(树状数组)
    PAT 顶级 1026 String of Colorful Beads (35分)(尺取法)
    PAT顶级 1009 Triple Inversions (35分)(树状数组)
    Codeforces 1283F DIY Garland
    Codeforces Round #438 A. Bark to Unlock
    Codeforces Round #437 E. Buy Low Sell High
    Codeforces Round #437 C. Ordering Pizza
  • 原文地址:https://www.cnblogs.com/hellohello/p/8073215.html
Copyright © 2011-2022 走看看