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 不兼容。

以上。

vue : 对 vue-class-component 的个人理解的更多相关文章

  1. Vue 2.0 生命周期-钩子函数理解

    Vue 2.0 + 生命周期钩子在项目过程中经常用到,所以闲下来整理了下,直接复制下面的实例运行: <!DOCTYPE html> <html lang="en" ...

  2. vue中央事件总线eventBus的简单理解和使用

    公共事件总线eventBus的实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信.它是实现非父子组件通信的一种解决方案. 用法如下: 第一步:项目中创建一个js文件(我通 ...

  3. Vue.mixin Vue.extend(Vue.component)的原理与区别

    1.本文将讲述 方法 Vue.extend Vue.mixin 与 new Vue({mixins:[], extend:{}})的区别与原理 先回顾一下 Vue.mixin 官网如下描述: Vue. ...

  4. [Vue] Dynamic Vue.js Components with the component element

    You can dynamically switch between components in a template by using the reserved <component>  ...

  5. Vue Vue.use() / Vue.component / router-view

    Vue.use Vue.use 的作用是安装插件 Vue.use 接收一个参数 如果这个参数是函数的话,Vue.use 直接调用这个函数注册组件 如果这个参数是对象的话,Vue.use 将调用 ins ...

  6. Vue (三) --- Vue 组件开发

    ------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...

  7. vue系列---Vue组件化的实现原理(八)

    _ 阅读目录 一. 什么是Vue组件? 如何注册组件? 1.1 全局注册组件 1.2 局部注册组件 二:组件之间数据如何传递的呢? 1) props 2) $emit 3) 使用$ref实现通信 4) ...

  8. vue学习:vue+webpack的快速使用指南(新手向)

    一.vue有两种使用方式: 1.下载vue.js <script src="vue.js"></script> 2.使用npm npm install vu ...

  9. Vue 项目 Vue + restfulframework

    Vue 项目 Vue + restfulframework 实现登录认证 - django views class MyResponse(): def __init__(self): self.sta ...

  10. 【vue】vue +element 搭建及开发中项目中,遇到的错误提示

    1. import Layout from '@/views/layout/Layout'; export default [ { // 配置路由,当路径为'/activePublic',使用组件ac ...

随机推荐

  1. GitHub 热点速览 Vol.25:距离优雅编程你差个它

    作者:HelloGitHub-小鱼干 摘要:如何优雅地夸一个程序员呢?vscode-rainbow-fart 作为一个彩虹屁的项目,深得程序员心,能在你编程时疯狂称赞你的除了你自己,还有它.除了鼓励之 ...

  2. android 事件分发机制2-案例测试

    我们来看程序的代码: 要求: 1.通过手指移动来拖动图片 2.控制图片不能超出屏幕显示区域 技术点: 1.MotionEvent处理 2.对View进行动态定位(layout) package im. ...

  3. Spring声明周期的学习心得

    我们首先来看下面的一个案例: 这里是 HelloWorld.java 文件的内容: package com.yiibai;    public class HelloWorld {   private ...

  4. 信息收集-DNS

    首先更正一个小白很普遍的错误观点,www.baidu.com(严格上是www.baidu.com. 这个点是根的意思,所有的记录从这里开始)并不是一个真正意义上的域名,而是百度服务器的A记录,baid ...

  5. 微信小程序-超出部分显示省略号(单行与多行)

    /*单行*/ .work_font{ display:block /*这里设置inline-block或者block:根据使用情况来定(行内元素需要加这个,块级元素和行内块级可以不用)*/ white ...

  6. 【Spring注解驱动开发】关于BeanPostProcessor后置处理器,你了解多少?

    写在前面 有些小伙伴问我,学习Spring是不是不用学习到这么细节的程度啊?感觉这些细节的部分在实际工作中使用不到啊,我到底需不需要学习到这么细节的程度呢?我的答案是:有必要学习到这么细节的程度,而且 ...

  7. 哈希传递攻击利用(Pass The Hash)

    最近又复习了一下内网的相关知识,把以前的整理了一下发出来做个记录. 0x01 哈希传递攻击概念 有一点内网渗透经验的都应该听说过哈希传递攻击,通过找到相应账户相关的密码散列值(LM Hash,NTLM ...

  8. 三分钟在任何电脑上使用 chrome os

    准备 什么是 chrome os? Chrome OS是一款Google开发的基于PC的操作系统. Google Chrome OS是一款基于Linux的开源操作系统. Chrome OS 系统和 C ...

  9. Redis 6.0 访问控制列表ACL说明

    背景 在Redis6.0之前的版本中,登陆Redis Server只需要输入密码(前提配置了密码 requirepass )即可,不需要输入用户名,而且密码也是明文配置到配置文件中,安全性不高.并且应 ...

  10. gitlab在k8s上运行的一些优化

    由 林坤创建,最终由 林坤修改于七月02,2020 gitlab组件图 gitlab在k8s上占用资源 kubectl top pods -n default | grep git* gitlab-g ...