zoukankan      html  css  js  c++  java
  • vue : 对 vue-class-component 的个人理解

    vue-class-component 是 vue 的官方库,作用是用类的方式编写组件。

    这种编写方式可以让.vue文件的js域结构更扁平,并使vue组件可以使用继承、混入等高级特性。

    简单的示例:

    ComponentA.vue

    <template>
      <div>
        <p>{{ nameString }}</p> 
        <p>{{ child }}</p> 
        <button @click="comClick">button</button>
      </div>
    </template>
    
    <script>
    import Vue from 'vue'
    import Component from 'vue-class-component'
    
    @Component({
      props: {
        child: String
      },
      watch:{
        
      },
      components: {
        
      }
    })
    export default class ComponentA extends Vue {
      // initial data
      nameString = `ComponentA`    
      
      // lifecycle hook
      mounted () {
      this.greet()
      }
    
      // computed
      get computedMsg () {
      return 'computed ' + this.nameString
      }
    
      // method
      greet () {
      console.log('greeting: ' + this.nameString)
      }
    
    }
    </script>
    
    <style>
    
    </style>

    App.vue

    <template>
      <div id="app">
    
        <component-a ref="a" :child="nameString" @com-click="fromChildEvent" />
    
      </div>
    </template>
    
    <script>
    import Vue from 'vue'
    import Component from 'vue-class-component'
    import ComponentA from './ComponentA'
    
    @Component({
      components: {
        'component-a': ComponentA
      }
    })
    export default class App extends Vue {}
    </script>
    
    <style lang="less">
    
    </style>

    开始我并不理解这种全新的写法,心想:props watch components 写哪儿呢?

    后来知道了,写在 @Component() 修饰器方法里。

    关于js的修饰器可以参考这一篇文章

    === 分割线 ===

    那么,能不能让这几个被拿出来的东西也写到里面呢?

    可以的。

    vue-property-decorator 是一个非官方库,是 vue-class-component 的很好的补充。它可以让vue的某些属性和方法,通过修饰器的写法让它也写到vue组件实例的类里面。

    比如 @Prop @Watch @Emit。

    我们把 ComponentA.vue 文件 App.vue文件 稍微改一下。

    ComponentA.vue

    <template>
      <div>
        <p>{{ nameString }}</p> 
        <p>{{ child }}</p> 
        <button @click="comClick">button</button>
      </div>
    </template>
    
    <script>
    import { Vue, Component, Emit } from 'vue-property-decorator'
    
    @Component({
      props: {
        child: String
      },
      watch:{
        
      },
      components: {
        
      }
    })
    export default class ComponentA extends Vue {
      // initial data
      nameString = `ComponentA`  
    
      @Emit()
      comClick() {
        return {
          nameString:this.nameString
        }
      }
    
    }
    </script>
    
    <style>
    
    </style>

    App.vue

    <template>
      <div id="app">
    
        <component-a ref="a" :child="nameString" @com-click="fromChildEvent" />
    
      </div>
    </template>
    
    <script>
    import Vue from 'vue'
    import Component from 'vue-class-component'
    import ComponentA from './ComponentA'
    
    @Component({
      components: {
        'component-a': ComponentA
      }
    })
    export default class App extends Vue {
      // initial data
      nameString = `App`
    
      fromChildEvent (obj) {
        console.log(obj)
        alert("METHODS fromChildEvent")
      }
    
    }
    </script>
    
    <style lang="less">
    </style>

    我们用vue-property-decorator写了 @Emit() 。另外可能你也发现了,Vue、Component 也可以通过 vue-property-decorator 引入。

    === 分割线 ===

    最后,有一个js公共修饰器库,core-decorators

    这个库提供了非常多的修饰器,用惯了大概可以提高开发效率。

    不过需要注意:core-decorators 和 typescript 不兼容。

    以上。

  • 相关阅读:
    java基础
    mysql入门
    基础整理
    遍历列表的两种方式
    oracle常用操作
    DIV+CSS网页布局技巧实例1:设置网页整体居中的代码
    html+css 淘宝首页静态页面案例
    WEB前端开发规范文档+CSS命名规范
    day05-苏宁易购导航html
    day04-html
  • 原文地址:https://www.cnblogs.com/foxcharon/p/10951227.html
Copyright © 2011-2022 走看看