这里要讨论的话题,不是前端框架哪家强,因为在 Vue 官网就已经有了比较全面客观的介绍,并且是中文的。

上图是二月份前端框架排名,React 位居第一,Vue 排名第三。还清晰记得,16 年十月份该 showcase 首页并未看到 Vue,如今已有 40000+ stars,那时的 React 也差不多这个成绩,可见 Vue 2.0 有多受关注,而排名第二的 Angular 当时位居第一,短短数月 React、Vue 都有比较好的成绩,而 Angular 的 stars 没有明显增长,是否可以断章取义,Angular 正在慢慢地退出这个舞台。

对于近期关注度最高的 React 和 Vue,想在这里谈谈两个框架在开发风格上的差异。Vue 升级到2.0之后新增了很多 React 原有的特性,我的理解是 Vue 在这些方面对 React 的肯定和致敬,下面将在几个细节上作对比。

Vue更容易上手

Vue 更容易上手!这是真的吗?我书读的少,作者是想支持国产吗?

Vue 的语法很自由,比如:

  • 前期不需要认识复杂的生命周期函数,可能只关心 mounted 和 Vue.nextTick(保证 this.$el 在 document 中)

  • 熟悉的前端模板

  • 父子组件间通信更灵活

  • slot,可以大尺度地扩展组件(但也不要过度使用哦)

  • v-model,mvvm 的方式处理表单更方便

  • 官网中文文档(哈哈,不得不承认)

从入门学习一个框架的角度看,少一些规则多一些自由空间,门槛会低些。

表单在 React 中的蛋疼之处

React 和 Vue 如何拿 input 的 value,先上代码

Reactjs

class Demo extends React.Component{
  constructor(props){    super(props)    this.state={
      inputA: '',
      inputB: ''
    }
  }
  _onChangeA(e){    this.setState({
      inputA: e.target.value
    })
  }
  _onChangeB(e){    this.setState({
      inputB: e.target.value
    })
  }
  render() {    return (
      
                          
    );   } }; ReactDOM.render(   ,  document.getElementById('container') );

Vuejs


    
    
    
new Vue({     el: '#demo',     data: {       inputA: '',       inputB: ''     } })

Vue 进行表单处理的方式是不是更简洁,由于 v-model 属性支持数据双向绑定,说白了就是(value 的单向绑定 + onChange 事件监听)的语法糖,但这个味道还不错吧,比起在 React 中需要绑定多个 onChange 事件确实要方便得多。

JSX vs Templates

刚接触 React,因为用惯了javascript 模板引擎,一直坚信视图与功能逻辑分离是正确的选择,突然看到 JSX 把 html 写在 js 里,内心是拒绝的!

Facebook 官方好像知道大家对 JSX 有偏见,在文档一开始就给出解释

We strongly believe that components are the right way to separate concerns rather than “templates” and “display logic.” We think that markup and the code that generates it are intimately tied together. Additionally, display logic is often very complex and using template languages to express it becomes cumbersome.

在这里结合我的理解翻译一下, React 团队坚信一个组件的正确用途是 “separate concerns”,而不是前端模板或者展示逻辑。我们认为前端模板和组件代码是紧密相连的。另外,模板语言经常让展示的逻辑变得更复杂。

刚开始没弄明白什么是 “separate concerns”,其实现在也… Facebook 可能是在强调组件应该从功能上去抽象定义,而不仅仅从视觉上区分。

  • 看完官方答复我欣然接受了,有谁在写前端模板的时候,没有掺杂业务逻辑的,掺杂了不就违背 MVC 吗!Facebook 觉得这种“分离”让问题更复杂,不如把模板和逻辑代码结合到一块。而开发者一开始不接受 JSX,是受到传统js拼接字符串模板的死板方式影响,其实 JSX 更灵活,它在逻辑能力表达上完爆模板,但也很容易写出凌乱的render函数,不如模板直观

组件通信

Vue 组件向上通信可通过触发事件,但在 Vue 2.0 废弃 dispatch,建议使用global event bus。而大多初学者以为 React 只能靠调用父组件的 callback,并且这种方式遇到组件层次太深的时候简直就是噩梦。其实 React 也可以通过事件通信来解决问题,只不过需要额外 coding 或调用第三方插件,而 Vue 的核心库已实现了该功能。React 拥有丰富的生态圈,很多事情是大家一起完成的。

ref or props

父组件可通过 ref 定位子组件并调用它的 api,也可通过 props 传递数据,实现父组件通知子组件,ref 和 props 这两种方式将决定组件的形态。在实际开发中,可能 Vue 先入为主,ref 也用的比较多,因为它在组件封装力度上确实有优势, api 可让组件更抽象、更关注自身的功能,不受外界影响。而后来转到 React 几乎都是用 props 通信,一开始还以为是 React 的问题,甚至还得出了这样的结论:React 组件像是 UI 组件,Vue 组件更接近对象。直到最近看了 Facebook 文档,才发现另有蹊跷。先看看之前用 Vue ,我是如何去创建一个列表(List)组件,并实现列表数据的新增和删除,以及调用方式。

没用过 ref 的同学,可以先看下文档,不过看完下面代码也能大概知道 ref 的作用。

Vuejs