前端框架用vue还是react?清晰对比两者差异( 二 )


react用过react的开发者可能知道,react是没有模板的,直接就是一个渲染函数,它中间返回的就是一个虚拟DOM树,React推荐的做法是 JSX + inline style, 也就是把HTML和CSS全都写进JavaScript了,即'all in js' 。JSX实际就是一套使用XML语法,用于让我们更简单地去描述树状结构的语法糖 。在react中,所有的组件的渲染功能都依靠JSX 。你可以在render()中编写类似XML的语法,它最终会被编译成原生JavaScript 。不仅仅是 HTML 可以用 JSX 来表达,现在的潮流也越来越多地将 CSS 也纳入到 JavaScript 中来处理 。JSX是基于 JS 之上的一套额外语法,学习使用起来有一定的成本 。
构建工具vuevue提供了CLI 脚手架,可以帮助你非常容易地构建项目 。全局安装之后,我们就可以用 vue create命令创建一个新的项目,vue 的 CLI 跟其他 CLI不同之处在于,有多个可选模板,有简单的也有复杂的,可以让用户自定义选择需要安装的模块,还可以将你的选择保存成模板,便于后续使用 。
极简的配置,更快的安装,可以更快的上手 。它也有一个更完整的模板,包括单元测试在内的各种内容都涵盖,但是,它的复杂度也更高,这又涉及到根据用例来选择恰当复杂度的问题 。
reactReact 在这方面也提供了 create-react-App,但是现在还存在一些局限性:

  • 它不允许在项目生成时进行任何配置,而 Vue CLI 运行于可升级的运行时依赖之上,该运行时可以通过插件进行扩展 。
  • 它只提供一个构建单页面应用的默认选项,而 Vue 提供了各种用途的模板 。
  • 它不能用用户自建的预设配置构建项目,这对企业环境下预先建立约定是特别有用的 。
而要注意的是这些限制是故意设计的,这有它的优势 。例如,如果你的项目需求非常简单,你就不需要自定义生成过程 。你能把它作为一个依赖来更新 。
数据绑定vuevue是实现了双向数据绑定的mvvm框架,当视图改变更新模型层,当模型层改变更新视图层 。在vue中,使用了双向绑定技术,就是View的变化能实时让Model发生变化,而Model的变化也能实时更新到View 。
Vue采用数据劫持&发布-订阅模式的方式,vue在创建vm的时候,会将数据配置在实例当中,然后通过Object.defineProperty对数据进行操作,为数据动态添加了getter与setter方法,当获取数据的时候会触发对应的getter方法,当设置数据的时候会触发对应的setter方法,从而进一步触发vm的watcher方法,然后数据更改,vm则会进一步触发视图更新操作 。
reactreact是单向数据流,react中属性是不允许更改的,状态是允许更改的 。react中组件不允许通过this.state这种方式直接更改组件的状态 。自身设置的状态,可以通过setState来进行更改 。在setState中,传入一个对象,就会将组件的状态中键值对的部分更改,还可以传入一个函数,这个回调函数必须向上面方式一样的一个对象函数可以接受prevState和props 。通过调用this.setState去更新this.state,不能直接操作this.state,请把它当成不可变的 。调用setState更新this.state,它不是马上就会生效的,它是异步的 。所以不要认为调用完setState后可以立马获取到最新的值 。多个顺序执行的setState不是同步的一个接着一个的执行,会加入一个异步队列,然后最后一起执行,即批处理 。
setState是异步的,导致获取dom可能拿的还是之前的内容,所以我们需要在setState第二个参数(回调函数)中获取更新后的新的内容 。
diff算法vuevue中diff算法实现流程
  1. 在内存中构建虚拟dom树
  2. 将内存中虚拟dom树渲染成真实dom结构
  3. 数据改变的时候,将之前的虚拟dom树结合新的数据生成新的虚拟dom树
  4. 将此次生成好的虚拟dom树和上一次的虚拟dom树进行一次比对(diff算法进行比对),来更新只需要被替换的DOM,而不是全部重绘 。在Diff算法中,只平层的比较前后两棵DOM树的节点,没有进行深度的遍历 。
  5. 会将对比出来的差异进行重新渲染
reactreact中diff算法实现流程
  1. DOM结构发生改变-----直接卸载并重新create
  2. DOM结构一样-----不会卸载,但是会update变化的内容
  3. 所有同一层级的子节点.他们都可以通过key来区分-----同时遵循1.2两点
    (其实这个key的存在与否只会影响diff算法的复杂度,换言之,你不加key的情况下,diff算法就会以暴力的方式去根据一二的策略更新,但是你加了key,diff算法会引入一些另外的操作)
React会逐个对节点进行更新,转换到目标节点 。而最后插入新的节点,涉及到的DOM操作非常多 。diff总共就是移动、删除、增加三个操作,而如果给每个节点唯一的标识(key),那么React优先采用移动的方式,能够找到正确的位置去插入新的节点 。


推荐阅读