vue - - - - - vue-property-decorator的使用

news2025/1/6 19:46:45

哪有小孩天天哭,哪有赌徒天天输 。遇到不会的技术、知识点,看得多了,掉的坑多了,也就会了。

vue-property-decorator的使用

  • 1. 单文件组件写法 - ```@Component的使用```
  • 2. 组件内使用变量
  • 3. 使用计算属性 - ```get的使用```
  • 4. 生命周期
  • 5. methods方法
  • 6. 使用自定义组件
    • 6.1 父传子 - ```@Prop的使用```
    • 6.2 子传父 - ```@Emit的使用```
  • 7. 监听变量变化 - ```@Watch的使用```
  • 8. 双向绑定 - ```@Model的使用```

1. 单文件组件写法 - @Component的使用

<template>
	<div class="study" id="root">
    	I like learning
    	<hr/>
	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';
    @Component({})  
    export default class index extends Vue { 
	}
</script>
<style lang="scss">
</style>

效果如图:
在这里插入图片描述

2. 组件内使用变量

<template>
	<div class="study" id="root">
	    I like learning
	    <hr/>
	    
	    <!-- 组件内变量使用 -->
	    姓名: {{name}}<br/>
	    性别: {{gender}}<br/>
	    年龄: {{age}}<br/>
	    <hr/>
	    
	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';
    @Component({})  
    export default class index extends Vue { 
      name:string = 'lee'
      gender:string = '男'
      age:number = 18
	}
</script>
<style lang="scss">
</style>

效果如图:
在这里插入图片描述

3. 使用计算属性 - get的使用

<template>
	<div class="study" id="root">
	    I like learning
	    <hr/>
	    
	    <!-- 组件内变量使用 -->
	    姓名: {{name}}<br/>
	    性别: {{gender}}<br/>
	    年龄: {{age}}<br/>
	    <hr/>
	    
	    <!-- 组件内使用getter计算属性 -->
    	使用计算属性:{{concatenatedCharacter}}
    	<hr/>
	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';
    @Component({})  
    export default class index extends Vue { 
       name:string = 'lee'
       gender:string = '男'
       age:number = 18


	    // 定义计算属性
        get concatenatedCharacter(){
            return `我叫${this.name}${this.gender},今年${this.age}`
        }
   }
</script>
<style lang="scss">
</style>

效果如图:
在这里插入图片描述

4. 生命周期

<template>
	<div class="study" id="root">
    I like learning
    <hr>

    <!-- 组件内变量使用 -->
    姓名: {{name}}<br/>
    性别: {{gender}}<br/>
    年龄: {{age}}<br/>
    <hr>


    <!-- 组件内使用getter计算属性 -->
    <!-- 使用计算属性:{{concatenatedCharacter}} -->
    <!-- <hr> -->
	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';  
  @Component({})  
  export default class index extends Vue { 
    // 组件内定义变量
    name:string = 'lee'
    gender:string = '男'
    age:number = 18


    // 定义计算属性
    get concatenatedCharacter(){
      return `我叫${this.name}${this.gender},今年${this.age}`
    }

	// 生命周期
    created() {
      console.log('我是生命周期');
    }
    
  }
</script>
<style lang="scss">
</style>

效果如图:
在这里插入图片描述

5. methods方法

<template>
	<div class="study" id="root">
	    I like learning
	    <hr>
	
	    <!-- 组件内变量使用 -->
	    姓名: {{name}}<br/>
	    性别: {{gender}}<br/>
	    年龄: {{age}}<br/>
	    <hr>
	
	    <!-- 年龄+1 -->
	    <button @click="increaseInAge"> 年龄+1 </button>
	    <hr>

	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';  
  @Component({})  
  export default class index extends Vue { 
    // 组件内定义变量
    name:string = 'lee'
    gender:string = '男'
    age:number = 18


    // 定义计算属性
    get concatenatedCharacter(){
      return `我叫${this.name}${this.gender},今年${this.age}`
    }

    created() {
      console.log('我是生命周期');
    }

    // methods方法定义: 年龄+1
    increaseInAge(){
      this.age++
    }
    
  }
</script>
<style lang="scss">
</style>

效果图:
在这里插入图片描述

6. 使用自定义组件

6.1 父传子 - @Prop的使用

父组件:

<template>
	<div class="study" id="root">
	    I like learning
	    <hr>
	
	    <!-- 组件内变量使用 -->
	    姓名: {{name}}<br/>
	    性别: {{gender}}<br/>
	    年龄: {{age}}<br/>
	    <hr>
	
	    <!-- 年龄+1 -->
	    <button @click="increaseInAge"> 年龄+1 </button>
	    <hr>
	
	    <!-- 使用自定义组件 & 传递参数 -->
	    <CustomComp :age='age'/>
	    <hr>

	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';  
  import CustomComp from './CustomComp.vue'
  @Component({
    // 声明组件
    components: {
      CustomComp
    }
  })  
  export default class index extends Vue { 
    // 组件内定义变量
    name:string = 'lee'
    gender:string = '男'
    age:number = 18


    // 定义计算属性
    get concatenatedCharacter(){
      return `我叫${this.name}${this.gender},今年${this.age}`
    }

    created() {
      console.log('我是生命周期');
    }

    // 年龄+1
    increaseInAge(){
      this.age++
    }
    
  }
</script>
<style lang="scss">
</style>

子组件:

<template>
	<div class="study" id="root">
      I am a subcomponent; <br/>
      接收到的数据: {{age}}
	</div>
</template>
<script lang="ts">  
  import { Vue, Component, Prop } from 'vue-property-decorator';  
  @Component({})  
  export default class CustomComp extends Vue {  
    @Prop() age!: Number

  };  
</script>
<style lang='scss' scoped>
</style>

效果如图:
在这里插入图片描述

6.2 子传父 - @Emit的使用

子组件:

<template>
	<div class="study" id="root">
      I am a subcomponent; <br/>
      接收到的数据: {{age}}<br/>
      <button @click="childMethod">子传父</button>

	</div>
</template>
<script lang="ts">  
  import { Vue, Component, Prop, Emit } from 'vue-property-decorator';  
  @Component({})  
  export default class CustomComp extends Vue {  
    @Prop() age!: Number

    // emitToFather为父组件自定义的方法名
    // childMethod为子组件的方法名
    @Emit("emitToFather")
    childMethod() {
      console.log('我是子组件的方法');
      return 123
    }
  };  
</script>
<style lang='scss' scoped>
</style>

父组件:

<template>
	<div class="study" id="root">
	    I like learning
	    <hr>
	
	    <!-- 组件内变量使用 -->
	    姓名: {{name}}<br/>
	    性别: {{gender}}<br/>
	    年龄: {{age}}<br/>
	    <hr>
	
	    <!-- 年龄+1 -->
	    <button @click="increaseInAge"> 年龄+1 </button>
	    <hr>
	
	    <!-- 使用自定义组件 & 传递参数 -->
	    <CustomComp :age='age' @emitToFather='updateAge'/>
	    <hr>

	</div>
</template>

<script lang="ts">  
  import { Vue, Component } from 'vue-property-decorator';  
  import CustomComp from './CustomComp.vue'
  @Component({
    // 声明组件
    components: {
      CustomComp
    }
  })  
  export default class index extends Vue { 
    // 组件内定义变量
    name:string = 'lee'
    gender:string = '男'
    age:number = 18


    // 定义计算属性
    get concatenatedCharacter(){
      return `我叫${this.name}${this.gender},今年${this.age}`
    }

    created() {
      console.log('我是生命周期');
    }

    // 年龄+1
    increaseInAge(){
      this.age++
      console.log(`年龄增加1,现在是${this.age}`);
    }

    // 子传父 修改数据  
    updateAge(age: number) {
      console.log('我是父组件的方法, 接收到的数据为:', age);
      this.age = age;
    }
    
  }
</script>
<style lang="scss">
</style>

效果如图:
在这里插入图片描述

7. 监听变量变化 - @Watch的使用

<template>
	<div class="study" id="root">
      I am a subcomponent; <br/>
      接收到的数据: {{age}}<br/>
      <button @click="childMethod">子传父</button>

	</div>
</template>
<script lang="ts">  
  import { Vue, Component, Prop, Emit, Watch} from 'vue-property-decorator';  
  @Component({})  
  export default class CustomComp extends Vue {  
    @Prop() age!: Number

    // emitToFather为父组件自定义的方法名
    // childMethod为子组件的方法名
    @Emit("emitToFather")
    childMethod() {
      console.log('我是子组件的方法');
      return 123
    }

    // 监听age的变化
    // 当age发生变化时,会执行watchCallBack函数,并将旧值与新值一并传入
    @Watch("age", {deep: true})
    watchCallBack(val: number, oldVal: number) {
      console.log('val,oldVal: ', val, oldVal);
    }

  };  
</script>
<style lang='scss' scoped>
</style>

效果如图:
在这里插入图片描述

8. 双向绑定 - @Model的使用

此处再次演示了计算属性的用法

<template>
	<div class="study" id="root">
      I am a subcomponent; <br/>
      接收到的数据: {{age}}<br/>
      <button @click="childMethod">子传父</button><br/>
      
      双向绑定Model: <br/>
      <input type="text" v-model="people.firstName"><br/>
      <input type="text" v-model="people.lastName"><br/>
      姓名:{{ fullName }}<br/>
      <button @click="logModel"> log model</button><br/>

	</div>
</template>
<script lang="ts">  
  import { Vue, Component, Prop, Emit, Watch} from 'vue-property-decorator';  
  @Component({})  
  export default class CustomComp extends Vue {  
    @Prop() age!: Number

    people: any = {
      firstName: '',
      lastName: ''
    }

    // emitToFather为父组件自定义的方法名
    // childMethod为子组件的方法名
    @Emit("emitToFather")
    childMethod() {
      console.log('我是子组件的方法');
      return 123
    }

    // 监听age的变化
    // 当age发生变化时,会执行watchCallBack函数,并将旧值与新值一并传入
    @Watch("age", {deep: true})
    watchCallBack(val: number, oldVal: number) {
      console.log('val,oldVal: ', val, oldVal);
    }

    get fullName(){
      const { firstName, lastName } = this.people
      return `${firstName}-${lastName}`
    }
    logModel(){
      console.log('model数据', this.people);
    }

  };  
</script>
<style lang='scss' scoped>
</style>

效果如图:

在这里插入图片描述



更多可参考下列文档:
vue-property-decorator用法
聊聊在Vue项目中使用Decorator装饰器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nydus 镜像扫描加速

文&#xff5c;余硕上海交通大学22届毕业生阿里云开发工程师从事云原生底层系统的开发和探索工作。本文 6369 字 阅读 16 分钟GitLink 编程夏令营是在 CCF 中国计算机学会指导下&#xff0c;由 CCF 开源发展委员会&#xff08;CCF ODC&#xff09;举办的面向全国高校学生的暑期…

Java字符集编码解码详细介绍

文章目录字符集字符集的基本认识字符集编码和解码字符集 字符集的基本认识 字符集基础知识 计算机底层不可以直接存储字符的。计算机中底层只能存储二进制(0、1) 二进制是可以转换成十进制的 计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储&#xff0c;这套…

【进阶C语言】数据的存储形式

文章目录一.数据类型分类二.整形的存储形式1.源码&#xff0c;反码&#xff0c;补码的关系内存中数据的存储——二进制源码&#xff0c;反码&#xff0c;补码的关系正数负数三.大小端1.概念2.例题&#xff1a;判断当前编译器的存储形式四.浮点数的存储形式1.二进制的补充&#…

【k8s系列】kube-state-metrics中kube_endpoint_address指标

文章目录背景环境操作方法1&#xff1a;kube_endpoint_address_not_ready选择大于0的验证方式1验证方式2方法2&#xff1a;kube_endpoint_address_available选小于0的方法3&#xff1a;kube_endpoint_address{ready"false"}选大于0的解释参考author: ningan123date: …

java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分+微序幕就此拉开之RocketM消息中间件~整起

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 RocketMQ一、RocketMQ概念~一览无余1.消息队列有啥用&#xff1f;能干啥&#xff1f;消息队列的应用场景&#xff1f;2.常见的消息队列有哪些&#xff1f;如何进行消息队列的…

2、MySQL支持的数据类型

目录 1、整数类型 &#xff08;1&#xff09;fillzero&#xff1a;根据整数类型的长度自动添加0 &#xff08;2&#xff09;unsigned&#xff1a;非负整数 &#xff08;3&#xff09;bin&#xff08;m&#xff09;&#xff1a;将十进制数转为m进制 2、日期时间类型 &#x…

【MySQL基础教程】函数的介绍与使用

前言 本文为 【MySQL基础教程】函数的介绍与使用 相关知识&#xff0c;下边具体将对字符串函数&#xff0c;数值函数&#xff0c;日期函数&#xff0c;流程函数等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&…

MAXHUB+腾讯会议:为未来办公造一部动力引擎

科技领域有个规律&#xff0c;我们经常高估一年的变化&#xff0c;而低估了十年或者更长时间所可能发生的变化。不信可以做个测试&#xff0c;你觉得未来线上办公会怎么发展&#xff1f;不少朋友会说&#xff0c;既然线上办公是疫情到来之后的PlanB&#xff0c;那么随着疫情结束…

【STM32F4系列】【HAL库】【自制库】ps2手柄模块驱动

外观和电气连接 外观 手柄外观如下 接收器外观 这是接收器和底座 电气连接 需要4根连接线 单片机输出是CLK DO CS 单片机输入是DI 电源电压是3.3-5v 注意模块和单片机共地 模块不支持高速,最大时钟周期约为4us左右 因此使用软件模拟时序的方式来与模块通信 只需要将模块的4根线…

Golang Context 的几种应用场景

Golang context主要用于定义超时取消&#xff0c;取消后续操作&#xff0c;在不同操作中传递值。本文通过简单易懂的示例进行说明。 超时取消 假设我们希望HTTP请求在给定时间内完成&#xff0c;超时自动取消。 首先定义超时上下文&#xff0c;设定时间返回取消函数&#xff…

Apache POI操作百万数据excel实战方案及JDK性能监控工具Jvisualvm实战

百万数据报表概述 文章目录**百万数据报表概述****1、** **概述****2、 JDK性能监控工具介绍****2.1、 Jvisualvm概述****2.2、 Jvisualvm的位置****2.3、 Jvisualvm的使用****3、** **解决方案分析****4**、**百万数据报表导出****4.1** **需求分析****4.2** **解决方案****4.…

玩转门店管理新方法,促进营收利润加倍

门店管理的好坏是门店是否可以运营下去的重要因素&#xff0c;决定了门店的存亡与兴衰。以往很多门店管理者为了更简单方便&#xff0c;采用的是传统方式进行管理。即运用手工的方式记录和计算门店的各种信息。但是随着门店规模的扩大、商品种类的丰富、客户需求的增加以及员工…

普惠微光汇聚暖阳,招联携手奋斗者筑梦前行

撰稿 | 多客 来源 | 贝多财经 近年来&#xff0c;受疫情反复带来的经济下行压力&#xff0c;收入减少生活难以保障成了社会一大难题。值此艰难时刻&#xff0c;一大批爱心企业出资出力&#xff0c;纷纷用实际行动诠释企业的使命和担当。口罩、防护服、矿泉水、食品、药物、免费…

vue配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)

vue-cli区分办法 vue配置生产环境.env.production、测试环境.env.development vue配置webpack生产环境、测试环境 在使用webpack创建完vue2项目的时候&#xff0c;为了解决生产打包、测试打包对应的全局变量不一致的问题。 首先看一下package.json的改动&#xff1a; "…

MARL算法系列(1):IQL【原理+代码实现】

原文题目&#xff1a;Multiagent cooperation and competition with deep reinforcement learning 作者&#xff1a;Tampuu, Ardi and Matiisen, Tambet and Kodelja, Dorian等 发表时间&#xff1a;2017年 主要内容&#xff1a;相互独立的两个DQN智能体&#xff0c;竞争任务下…

2022年威胁隐私和安全的数个“罪魁祸首”

随着互联网技术的不断发展&#xff0c;我们对网络的信任也在不断增加&#xff0c;甚至将自己的私人数据委托给各种在线平台&#xff0c;如个人数字身份信息、银行账户、各种机密信息。网络一方面的确带来变革型的进步&#xff0c;但另一方面&#xff0c;频频曝光的数据泄露事件…

VueJs中setup的使用(下)

前言在Vue当中,父组件想要向子组件传值,是通过在父组件标签上通过自定义属性实现的,而在子组件中是通过props进行接收在Vue2.0里面,在子组件中的选项式API配置项选项中props进行接收就可以了的,在子组件中的模板中可以直接使用但在Vue3里面与Vue2.0存在一些差异,这个主要是针对…

excel文件管理:如何进行密码保护和破解? 下篇

在上篇文章中&#xff0c;我们提到了设置工作簿的打开权限密码、修改权限密码、保护工作簿的密码、允许编辑区域的密码&#xff0c;并且讲到了两种破解excel密码的方式。今天&#xff0c;我们书接上回&#xff0c;继续讲解excel中常见的密码保护和破解方式&#xff0c;一起来看…

浅谈屏幕适配

文章目录1. 概述2. 屏幕尺寸3. 屏幕分辨率4. 屏幕像素密度5. dp、sp、px6. mdpi、hdpi、xdpi..7. 屏幕分辨率限定符8. 最小宽度限定符8.1 获取设计图最小宽度(dp)8.2 生成对应的dimens.xml文件8.3 尺寸限定符8.4 其它9. 今日头条相关9.1 系统状态栏获取不对问题9.2 autosize1. …

Elasticsearch8.X入门实战(二)Elasticsearch集群架构

Elasticsearch集群由一个或多个节点(服务器)组成,这些节点一起保存Elasticsearch的所有数据,并提供跨所有节点的联合索引和搜索功能。集群由一个唯一的名称来标识,该名称默认为“elasticsearch”(可以在配置文件中修改)。当某个节点被设置为相同的集群名称时,该节点才能…