vue-class-component和vue-property-decorator


1. vue-class-component


作用

用於將Vue中組件用類的方式編寫。

Demo

1.先定義一個組件ComponentA:

 1 <template>
 2   <div>
 3     <h3>Simple header {{getText}}</h3>
 4   </div>
 5 </template>
 6 <script>
 7 import Vue from 'vue'
 8 import Component from 'vue-class-component'
 9 
10 @Component({
11   props: {
12     name: String
13   }
14 })
15 export default class SimpleHeader extends Vue {
16   // initial data
17   id = 'myId'
18 
19   // computed
20   get getText () {
21     return `${this.name}(${this.id})`
22   }
23 }
24 </script>
25 <style>
26 </style>

2. 在App.vue中引用它

<template>
  <div>
    <div class="sc-width-full sc-height-full">
      <Layout>
        <SimpleHeader ref="headerMenu" name="david"></SimpleHeader>
        <div class="ivu-layout ivu-layout-has-sider" style="height:100%;">
          <Layout id="pageContainer">
            <div>
              <Content id="pageContent">
                <router-view></router-view>
              </Content>
            </div>
          </Layout>
        </div>
      </Layout>
    </div>
  </div>
</template>
<script>
import Vue from 'vue'
import Component from 'vue-class-component'
import SimpleHeader from './simple-header.vue'

@Component({
  components: {
    SimpleHeader
  }
})
export default class Index extends Vue {
  userName = null;
  userRole = null;
  created () {
    this.getUserInfo()
  }
  getUserInfo () {
    // getUserInfo
  }
}
</script>
<style>
.ivu-layout {
  height: 100%;
}
.ivu-layout.ivu-layout-has-sider {
  display: block;
  height: calc(100% - var(--header-height));
  margin-left: 0.75rem;
  padding: 0.5rem 1.25rem;
}
</style>

效果:

可以看出,借用vue-class-component我們可以把組件寫成class的模式,和面向對象非常像,可以很方便地實現繼承和封裝。

2. vue-property-decorator


 

作用

裝飾器來簡化書寫

Demo

還是剛剛的例子,App.vue改成

<template>
  <div>
    <div class="sc-width-full sc-height-full">
      <Layout>
        <SimpleHeader ref="headerMenu" name="david"></SimpleHeader>
        <div class="ivu-layout ivu-layout-has-sider" style="height:100%;">
          <Layout id="pageContainer">
            <div>
              <Content id="pageContent">
                <router-view></router-view>
              </Content>
            </div>
          </Layout>
        </div>
      </Layout>
    </div>
  </div>
</template>
<script>
import {Component, Vue} from 'vue-property-decorator'
import SimpleHeader from './simple-header.vue'

@Component({
  components: {
    SimpleHeader
  }
})
export default class Index extends Vue {
  userName = null;
  userRole = null;
  created () {
    this.getUserInfo()
  }
  getUserInfo () {
    this.$axios({
      method: 'GET',
      url: `/user_info`
    }).then(res => {
      if (res && res.status === 200) {
        this.userName = res.data.userName
        this.userRole = res.data.userRole
        this.$store.commit('setUserName', res.data.userName)
        this.$store.commit('setRole', res.data.userRole)
      } else {
      }
    }).catch(e => {
      console.error(e)
    })
  }
}
</script>
<style>
.ivu-layout {
  height: 100%;
}
.ivu-layout.ivu-layout-has-sider {
  display: block;
  height: calc(100% - var(--header-height));
  margin-left: 0.75rem;
  padding: 0.5rem 1.25rem;
}
</style>

和vue-class-component的區別不是很大,只是統一從vue-property-decorator引用了。當然還是其他的差異,我們在今后vue+ts里體會。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM