使用 Vue + TypeScript 时项目中常用的装饰器
目录
备注: 代码中 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 时项目中常用的装饰器的更多相关文章
- 项目中常用的MySQL 优化
本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...
- JAVA项目中常用的异常处理情况总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- JAVA项目中常用的异常知识点总结
JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
- 在Vue&Element前端项目中,对于字典列表的显示处理
在很多项目开发中,我们为了使用方便,一般都会封装一些自定义组件来简化界面的显示处理,例如参照字典的下拉列表显示,是我们项目中经常用到的功能之一,本篇随笔介绍在Vue&Element前端项目中如 ...
- Android 项目中常用到的第三方组件
项目中常用到的第三方组件 1 社会化分享ShareSDK-Core-2.5.9.jarShareSDK-QQ-2.5.9.jarShareSDK-QZone-2.5.9.jarShareSDK-Sin ...
- 项目中常用js方法整理common.js
抽空把项目中常用js方法整理成了common.js,都是网上搜集而来的,大家一起分享吧. var h = {}; h.get = function (url, data, ok, error) { $ ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- VB的一些项目中常用的通用方法-一般用于验证类
1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer Dim mychar mychar = ...
随机推荐
- ZeroC ICE的远程调用框架 class与interface
我们在ice文件中定义的class或interface,slice都会为我们生成stub存根类和skeleton骨架类.在这里要注意slice并没有分别生成两份单独用在客户端或服务端的接口给开发分发. ...
- 读写分离很难吗?springboot结合aop简单就实现了
目录 前言 环境部署 开始项目 注意 參考: 前言 入职新公司到现在也有一个月了,完成了手头的工作,前几天终于有时间研究下公司旧项目的代码.在研究代码的过程中,发现项目里用到了Spring Aop来实 ...
- Few-shot Object Detection via Feature Reweighting (ICCV2019)
论文:https://arxiv.org/abs/1812.01866 代码:https://github.com/bingykang/Fewshot_Detection 1.研究背景 深度卷积神经网 ...
- 2019-9-28:渗透测试,基础学习,pgp常量,逻辑运算,DNS投毒,笔记
sunny.exe clientid 隧道ID route -n 查看网关netstat -rn 查看网关 DNS劫持ettercap用来内网渗透测试使用,可以嗅探内网,DNS劫持等攻击1,在攻击者电 ...
- python--数字灯管
import turtle import time def drawLine(draw): #绘制单段数码管 turtle.pendown() if draw else turtle.penup() ...
- C博客作业05--2019-指针
0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.2 本章学习体会 2.PTA实验作业 2.16 -7 输出月份英文名 2.1.1 伪代码 char* getmonth(int n) { ...
- 01 jQuery配置、jQuery语法结构、jQuery对象与DOM对象的互相转换
配置jQuery环境 下载jQuery 官网:jquery.com 学习或开发建议选择未压缩版,便于学习,发布建议选择压缩版,便于用户极速体验(点击下载若出现的是代码页 面,Ctrl+A全选复制 ...
- IDEA 自定义代码块
使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...
- 【搞定面试官】try中有return,finally还会执行吗?
本篇文章我们主要探讨 一下如果try {}语句中有return,这种情况下finally语句还会执行吗?其实JVM规范是对这种情况有特殊规定的,那我就先上代码吧! public class Final ...
- 区块链学习笔记:DAY05 如何使用公有云区块链服务
这是最后一节课了,主要讲华为云在云区块链提供的服务,如何基于华为云BCS来构建应用 先来个简单的比喻: 1.有关BaaS的范围定义 包含物理主机.虚拟主机.容器服务.区块链.智能合约和服务 2.华为云 ...