angular與vue的應用對比

由於各類筆試面試,最近都沒時間作一些值得分享的東西,正好複習一下vue技術棧,與angular作一下對比。html

angular1就跟vue比略low了。vue

1.數據綁定es6

  ng1 ng-bind,{{ scope }}   雙向是ng-model面試

  ng2  {{scope}}  [scope] 雙向是[(scope)]   (ng2的綁定拆分開來,並且支持函數返回是很棒的設計)redux

      vue v-bind , {{ scope }} ,:scope 雙向是v-modelapi

2.組件化app

  ng1的組件化就是每一個指令堆積起來的,自己並無特別組件化的思想,只是你們把指令分爲組件化指令和裝飾性指令。那ng1的組件化就是angular註冊好多指令dom

  ng2的組件化是ts的class,好比:ide

@Component({
  selector: 'my-app',
  template: `
    <h1>{{title}}</h1>
  `,
  styles: [`
    .selected {
      background-color: #CFD8DC !important;
      color: white;
    }
  `]
})
export class AppComponent {
  title = 'Tour of Heroes';
}

 ng2的組件用ts的類實現,每一個組件一個文件,而後經過import引入。用上高級語言就是比ng1高大上。函數

vue的組件能夠分到文件也能夠註冊vue全局組件,純vue的話須要:

var MyComponent = Vue.extend({
  template: '<div>A custom component!</div>'
})

// 註冊
Vue.component('my-component', MyComponent)

// 建立根實例
new Vue({
  el: '#example'
})

固然,加es6的話vue組件就變成了一個個.vue文件:

<style scoped>
.container {
  border: 1px solid #00f;
}
</style>

<template>
  <div class="container">
    <h2 class="red">{{msg}}</h2>
    <Bpp :ok='msg' ></Bpp>
  </div>
</template>

<script>
import Bpp from './bpp.vue' 
 
export default {
  data () {
    return {
      msg: "456"
    }
  },
  components: {
    Bpp
  }
}
</script>

我更喜歡這種形式,一個組件的樣式,js,dom都在一個文件裏,或者在一個文件夾裏。固然.vue須要過一下vue-loader。

3.組件通訊

ng1父組件跟子組件通訊,至關於props把屬性寫到子組件上,還能夠公用一個$scope,service,還有萬能的事件系統。

  反過來共用$scope也是行得通的,service,事件系統。。在傳統的組件流中是不推薦子組件與父組件通訊的。

ng2通訊

<my-hero-detail [hero]="selectedHero"></my-hero-detail>
@Component({
  selector: 'my-hero-detail',
  template: `
    <div *ngIf="hero">
      <h2>{{hero.name}} details!</h2>
    </div>
  `
})
export class HeroDetailComponent {
  @Input() hero: Hero;
}

相似props,但須要@Input聲明。

vue通訊是經過props字段,

  <Bpp :ok='msg' ></Bpp>

在Bpp組件裏聲明props屬性來接受ok:

<script>
    export default {
         props:['ok'],
        data(){
            return {
                data:1
            }
        }
    }
</script>

能夠看到ng2和vue的實現方式已經很相似了,只是ng2的ts經過註解來實現的,vue經過屬性,api設計趨於大同。。

子組件到父組件的傳輸方式略有不一樣,大致解決思路就是觀察者模式,不過也能夠用redux這種全局的store思想。

ng2的觀察者模式是rxjs,vue的就是自帶的事件系統,各有優劣,ng2的rxjs功能強大,寫起來簡單舒服,可是須要引入rxjs,不過ng2自己就依賴rxjs。

4.路由

ng1路由ng-router,提供了 $routeProvider來控制路由,若是用到權限控制要:

 $routeProvider .when('/home', {
        templateUrl: 'views/home.html',
        controller: 'HomeCtrl',
        auth:'home'
 })

auth是本身加的屬性,爲實現權限的控制,ng-router還提供了鉤子函數: $rootScope.$on('$routeChangeStart', function(scope, next, current) {})。這樣就能夠判斷權限了。

相似的vue:

router.map({
  '/a': {
    component: { ... },
    auth: true // 這裏 auth 也是一個自定義字段
  }
})

路由嵌套的話在該路由的對象上面加一個subRoutes。然而ng-router不支持嵌套,就須要第三方庫ui-router。

vue這裏也提供了鉤子函數,爲驗證auth:

router.beforeEach(function (transition) {
  if (transition.to.auth) {
    // 對用戶身份進行驗證...
  }
})

對於ng2,路由好像還沒穩定下來,不知道api會不會改。。:

const appRoutes: Routes = [
  {
    path: 'heroes',
    component: HeroesComponent
  }
];

ng2的驗證auth爲:

{
  path: 'guanggao',
  component: MainContentComponent,
  canActivate: [BlockIn]
}

 

有個canActivate屬性,BlockIn是一個類,咱們能夠在BlockIn裏寫一些權限驗證什麼的。

三者的路由好像沒怎麼改,配置api都是相似的。

5.動畫

ng1的動畫模塊,ng2強大的動畫系統:

 animations: [
    trigger('heroState', [
      state('inactive', style({
        backgroundColor: '#eee',
        transform: 'scale(1)'
      })),
      state('active',   style({
        backgroundColor: '#cfd8dc',
        transform: 'scale(1.1)'
      })),
      transition('inactive => active', animate('100ms ease-in')),
      transition('active => inactive', animate('100ms ease-out'))
    ])
  ]

vue也提供了動畫鉤子:

Vue.transition('expand', {

  beforeEnter: function (el) {
    el.textContent = 'beforeEnter'
  },
  enter: function (el) {
    el.textContent = 'enter'
  },
  afterEnter: function (el) {
    el.textContent = 'afterEnter'
  },
  enterCancelled: function (el) {
    // handle cancellation
  },

  beforeLeave: function (el) {
    el.textContent = 'beforeLeave'
  },
  leave: function (el) {
    el.textContent = 'leave'
  },
  afterLeave: function (el) {
    el.textContent = 'afterLeave'
  },
  leaveCancelled: function (el) {
    // handle cancellation
  }
})

 

ng1和vue都會給dom添加一些固定class...

相關文章
相關標籤/搜索