备注: 代码中 el-* 的标签是 ElementUI 的组件。

一、@Component 装饰器

@Component 装饰器是用以声明子组件。

1)父组件

	<template>
<div>
<h1>@Component - 声明(引入)组件</h1>
<ComponentSub></ComponentSub>
</div>
</template> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import ComponentSub from '@/components/decorator/other_decorator/ComponentSub.vue'; @Component({ components: { ComponentSub } })
export default class Home extends Vue { }
</script>

2)子组件

	<template>
<p>这是子组件</p>
</template> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator'; @Component
export default class ComponentSub extends Vue { }
</script>

二、 @Emit 装饰器

@Emit 装饰器是用以子组件触发父组件的自定义事件。

1)父组件

	<template>
<div>
<h1>@Emit - 子组件触发父组件的自定义事件</h1>
<EmitSub @bind-no-arg="welcomeNoArg" @welcome="sayHi"></EmitSub>
</div>
</template> <script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import EmitSub from '@/components/decorator/property_decorator/EmitSub.vue'; @Component({ components: { EmitSub } })
export default class Prop extends Vue {
private welcomeNoArg(): void {
console.log(111);
} private sayHi(arg: string[]): void {
console.log(arg);
alert(arg[0]);
}
}
</script>

2)子组件

<template>
<div>
<el-row>
<el-button @click="bindNoArg">无返回值</el-button>
<el-button @click="bindHaveArg">无返回值</el-button>
</el-row>
</div>
</template> <script lang="ts">
import { Component, Prop, Vue, Emit } from 'vue-property-decorator'; @Component
export default class HelloWorld extends Vue {
@Emit() private bindNoArg(): void {
console.log('bindNoArg');
} @Emit('welcome') private bindHaveArg(): string[] {
console.log('bindHaveArg');
return ['Yes', 'No', 'Maybe'];
}
}
</script>

三、 @Model 装饰器

@Model 装饰器是用以组件上实现双向绑定。

1)父组件

	<template>
<div>
<h1>@Model - 组件上实现双向绑定</h1>
<el-button type="primary" @click="onAlterFoo">父组件改变foo</el-button>
<ModelSub v-model="foo"></ModelSub>
</div>
</template> <script lang="ts">
import { Vue, Component, Model } from 'vue-property-decorator';
import ModelSub from '@/components/decorator/property_decorator/ModelSub.vue'; @Component({ components: { ModelSub } })
export default class ModelComponent extends Vue {
private foo: boolean = true; private onAlterFoo() {
this.foo = !this.foo;
}
}
</script>

2)子组件

	<template>
<div>
<input type="checkbox" v-bind:checked="checked"
v-on:change="$emit('balabala', $event.target.checked)"
>
</div>
</template> <script lang="ts">
import { Vue, Component, Model, Prop } from 'vue-property-decorator'; @Component
export default class ModelComponent extends Vue {
@Model('balabala', { type: Boolean }) private checked!: boolean;
}
</script>

四、 @Prop 装饰器

@Prop 装饰器是用以接收来自父组件的数据。

1)父组件

	<template>
<div>
<h1>@Prop - 接收来自父组件的数据</h1>
<PropSub msg="中野三玖"></PropSub>
</div>
</template> <script lang="ts">
import { Component, Vue, Emit, Inject } from 'vue-property-decorator';
import PropSub from '@/components/decorator/property_decorator/PropSub.vue'; @Component({ components: { PropSub } })
export default class Prop extends Vue { }
</script>

2)子组件

<template>
<div>
这是子组件收到的值:{{ msg }}
</div>
</template> <script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'; @Component
export default class HelloWorld extends Vue {
@Prop() private msg!: string; // ! 表示确定msg有值
}
</script>

五、 @Provide 装饰器 和 @Inject 装饰器

@Provide 装饰器是用以注入数据,@Inject 装饰器是用以获取注入的数据。

1)父组件 @Provide

	<template>
<div>
<h1>@Provide/@Inject - 接收来自父组件的数据</h1>
父组件通过依赖注入赋予的值是:{{ foo }}
<ProvideInject></ProvideInject>
</div>
</template> <script lang="ts">
import { Component, Vue, Provide } from 'vue-property-decorator';
import ProvideInject from '@/components/decorator/property_decorator/ProvideInject.vue'; @Component({ components: { ProvideInject } })
export default class Home extends Vue {
@Provide('bar') private foo = '111';
}
</script>

2)子组件 @Inject

<template>
<div>
子组件通过依赖注入接收的值是:{{ bar }}
</div>
</template> <script lang="ts">
import { Component, Vue, Inject } from 'vue-property-decorator'; @Component
export default class ProvideInject extends Vue {
@Inject() private readonly bar!: string;
}
</script>

六、 @Watch 装饰器

@Watch 装饰器是用以监控数据是否改变。

	<template>
<div>
<h1>@Watch - 监控数据是否改变</h1>
<el-input v-model="child" placeholder="请输入内容"></el-input>
<p>当前值:{{ val }} 原来值:{{ oldVal }}</p>
</div>
</template> <script lang="ts">
import { Component, Vue, Inject, Watch } from 'vue-property-decorator'; @Component
export default class ProvideInject extends Vue {
private child: number | null = null;
private val: number | null = null;
private oldVal: number | null = null; @Watch('child')
private onChildChanged(val: number, oldVal: number): void {
this.val = val;
this.oldVal = oldVal;
}
}
</script>

参考文档 :

使用 Vue + TypeScript 时项目中常用的装饰器的更多相关文章

  1. 项目中常用的MySQL 优化

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...

  2. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  3. JAVA项目中常用的异常知识点总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  4. ES6系列之项目中常用的新特性

    ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...

  5. 在Vue&Element前端项目中,对于字典列表的显示处理

    在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...

  6. Android 项目中常用到的第三方组件

    项目中常用到的第三方组件 1 社会化分享ShareSDK-Core-2.5.9.jarShareSDK-QQ-2.5.9.jarShareSDK-QZone-2.5.9.jarShareSDK-Sin ...

  7. 项目中常用js方法整理common.js

    抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...

  8. 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)

    记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...

  9. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...

随机推荐

  1. GitHub注册失败,卡在第一步

    同事说他无法注册GitHub,我一开始以为GitHub又无法登录进去,我就登录了自己的GitHub账号,没有问题,可以登录啊,见第一个标签页.同一局域网,不可能我能登录,你无法完成注册啊.于是,我就在 ...

  2. Redis入门,对Redis的理解和基本环境搭建及操作

    Redis入门使用 参考:https://blog.csdn.net/hellozpc/article/details/81267030 一).缓存的用途举例 1.前端页面广告的数据无需每次查询后台系 ...

  3. HTML_本地存储

    在HTML5当中,新增了很多的存储方式,这里我先介绍两种,方便我们的使用和操作,具体新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问 ...

  4. 理解Redis的反应堆模式

    1. Redis的网络模型 Redis基于Reactor模式(反应堆模式)开发了自己的网络模型,形成了一个完备的基于IO复用的事件驱动服务器,但是不由得浮现几个问题: 为什么要使用Reactor模式呢 ...

  5. Git及Github

    目录 Git及Github的使用 Git的基本介绍 Git命令行操作 1.设置签名 2.创建本地库 3.仓库初始化 4.状态查看 5.添加文件 6.提交文件 7.历史记录 8.前进后退 9.删除文件 ...

  6. nginx常用模块(三)

    Nginx常用模块(三) ngx_http_proxy_module模块配置(http或https协议代理) proxy_pass URL; 应用上下文:location, if in locatio ...

  7. urllib练习

    # coding = utf-8 """ 解析https://www.kuaidaili.com/free/网站里的代理地址, 并测试是否可用 ""& ...

  8. myql数据库,sql横排转竖排以及竖排转横排,oracle的over函数的使用

    一.引言 前些日子遇到了一个sql语句的横排转竖排以及竖排转横排的问题,现在该总结一下,具体问题如下: 这里的第二题和第三题和下面所讲述的学生的成绩表是相同的,这里给大家留一下一个念想,大家可以自己做 ...

  9. maven中的setting文件

      localRepository默认jar包下载到本地哪个目录下 pluginGroups 把自己的插件放在这里进行管理 这样不用写groupId和artifactId     一个生命周期包含很多 ...

  10. 微信小程序——页面栈

    刚开始用小程序的时候没怎么在意页面的跳转,也没仔细看文档中说的页面栈的内容.只要能跳转就行,wx.navigateTo,wx.redirectTo 这些方法一顿乱用.最后在做一个十层页面(以前页面栈是 ...