首页 > 其他分享 >vue-property-decorator基础教程

vue-property-decorator基础教程

时间:2024-04-30 11:44:06浏览次数:21  
标签:Vue default Component vue export 基础教程 property class

vue-property-decorator基础教程

为什么要使用vue-property-decorator
如何使用vue-property-decorator
1. 基本写法
2. data中定义数据
3.生命周期钩子函数
4. 方法
5. @Component()
6. @Prop()
7. @PropSync()
8. @Emit()
9. 计算属性
10. @Watch()

为什么要使用vue-property-decorator
vue-property-decorator是在vue-class-component的基础上做了进一步的封装,在TypeScript官方文档 中,官方推荐了vue-class-component,提供了Vue,Component等,而vue-property-decorator是社区出品,深度依赖于vue-class-component,提供了更多操作符:@Component,@Prop,@Watch,@Emit……

如何使用vue-property-decorator

1. 基本写法

template和css的写法不变,只是script内的写法需要注意

<script lang='ts'>
import {Component, Vue} from vue-property-decorator;
@Component
export default class App extends Vue {

};
</script>

lang="ts":script声明当前语言是ts
@Component:注明此类为一个vue组件
export default class Test extends Vue: export当前组件类是继承vue的

2. data中定义数据

data中的数据由原来的data()方法改成直接在对象中定义,data内的属性直接作为实例属性书写,默认都是public公有属性

export default class App extends Vue {
  private msg1 : string = '123';
  private msg2 : number = 1;
}

3.生命周期钩子函数

export default class App extends Vue {
  private created(){
    this.init();
  }
}

4. 方法

export default class App extends Vue {
  private init(){
    console.log('init');
  }
}

5. @Component()

<script lang="ts">
@Component({
  components: {
    HelloWorld, // 声明子组件的引用
  }
})
export default class App extends Vue {}
</script>

6. @Prop()

参数可以传

Constructor 例如String, Number, Boolean
Constructor[], 构造函数的队列, 类型在这队列中即可
PropOptions
type 类型不对会报错 Invalid prop: type check failed for prop “xxx”. Expected Function, got String with value “xxx”.
default 如果父组件没有传的话为该值, 注意只能用这一种形式来表示默认值, 不能@Prop() name = 1来表示默认值 1, 虽然看起来一样, 但是会在 console 里报错, 不允许修改 props 中的值
required 没有会报错 [Vue warn]: Missing required prop: “xxx”
validator 为一个函数, 参数为传入的值, 比如(value) => value > 100

@Prop()
propA: string

@Prop()
propB: number

@Prop({
  type: Number,
  validator: (value) => {
    return value > 100;
  },
  required: true
}) private propC!: string // !表示有值, 否则 ts 会告警未初始化


@Prop({ 
  default: 'this is title',
  required: true
}) propD!: string; // !表示有值, 否则 ts 会告警未初始化

@Prop({ 
  default: true,
  required: true
}) propE: boolean | undefined;

7. @PropSync()

与 Prop 的区别是子组件可以对 props 进行更改, 并同步给父组件
子组件

<template>
  <div>
    <p>{{count}}</p>
    <button @click="innerCount += 1">increment</button>
  </div>
</template>

<script lang="ts">
@Component
export default class PropSyncComponent extends Vue {
  @PropSync('count') private innerCount!: number // 注意@PropSync 里的参数不能与定义的实例属性同名, 因为还是那个原理, props 是只读的.
}
</script>

父组件:注意父组件里绑定 props 时需要加修饰符 .sync

<template>
    <PropSyncComponent :count.sync="count"/>
</template>
<script lang="ts">
@Component({
  components: PropSyncComponent
})
export default class PropSyncComponent extends Vue {
  @PropSync('count') private innerCount!: number // 注意@PropSync 里的参数不能与定义的实例属性同名, 因为还是那个原理, props 是只读的.
}
</script>

8. @Emit()

定义emit事件,参数字符串表示分发的事件名,如果没有,则使用方法名作为分发事件名,会自动转连字符写法:

  1. @Emit()不传参数,那么它触发的事件名就是它所修饰的函数名.
  2. @Emit(name: string),里面传递一个字符串,该字符串为要触发的事件名.

js写法

export default {
  data() {
    return {
      count: 0
    }
  },
  methods: {
    addToCount(n) {
      this.count += n
      this.$emit('add-to-count', n)
    },
    resetCount() {
      this.count = 0
      this.$emit('reset')
    },
    returnValue() {
      this.$emit('return-value', 10)
    },
    promise() {
      const promise = new Promise(resolve => {
        setTimeout(() => {
          resolve(20)
        }, 0)
      })

      promise.then(value => {
        this.$emit('promise', value)
      })
    }
  }
}

ts写法

查看代码
 import { Vue, Component, Emit } from 'vue-property-decorator'

@Component
export default class YourComponent extends Vue {
  count = 0

  @Emit()
  addToCount(n: number) {
    this.count += n
  }

  @Emit('reset')
  resetCount() {
    this.count = 0
  }

  @Emit()
  returnValue() {
    return 10
  }

  @Emit()
  promise() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve(20)
      }, 0)
    })
  }
}

9. 计算属性

对于Vue中的计算属性,我们只需要将该计算属性名定义为一个函数,,在函数前加上get关键字即可,原本Vue中的computed里的每个计算属性都变成了在前缀添加get的函数。

public get computedMsg(){
   return '这里是计算属性' + this.message;
}
public set computedMsg(message: string){
}

10. @Watch()

监听属性发生更改时被触发. 可接受配置参数 options

  1. immediate: boolean 是否在侦听开始之后立即调用该函数
  2. deep: boolean 是否深度监听.
    import { Vue, Component, Watch } from vue-property-decorator;
    
    export default class App extends Vue {
      @Watch('child')
      onChangeChildValue(newValue: string, oldValue: string){
        ......todo
      }
    
      @Watch('parent', {immediate: true, deep: false})
      private onChangeParentValue(newValue: string, oldValue: string){
        ......todo
      }
    } 

     

标签:Vue,default,Component,vue,export,基础教程,property,class
From: https://www.cnblogs.com/panwudi/p/18167734

相关文章

  • yarn + vue3 + vite 创建项目
      yarncreatevite//通过yarn+vite创建项目填写的创建的项目名称,默认名称vite-project 选择框架,我们点击上下键,回车选择,我们这里选择vue 选择语言,我们点击上下键,回车选择,我们这里选择TypeScript,即ts,然后回车 创建成功,如下 按照提示,执行命令cdvite-pr......
  • react diff算法和vue的区别
    区别相同点都是两组虚拟dom的对比(react16.8之后是fiber与虚拟dom的对比)只对同级节点进行对比,简化了算法复杂度都用key做为唯一标识,进行查找,只有key和标签类型相同时才会复用老节点遍历前都会根据老的节点构建一个map,方便根据key快速查找不同点react在diff遍历的时候,......
  • Vue3+Ts i18n实现国际化
    1、下载依赖npminstallvue-i18n@nex2、在src目录下创建文件夹创建文件index.ts、zh/index.ts、en/index.ts //index.tsimport{createI18n}from'vue-i18n'importzhfrom'./zh/index'importenfrom'./en/index'constmessages={en,zh,}......
  • vue.js 3 初学经验:开发环境搭建,Windows,nginx
    Windows11nginx-1.20.0"vue":"^3.4.21"--- 序章vue3开发,不需要后端服务业是可以的。在需要后端服务时,使用nginx来转发请求是很好的(个人开发者)。 注,还有什么其它方式吗?注,本文的后端服务是使用Java开发的HTTP接口。注,参考资料#2介绍了多个vue.js3.0项目......
  • 在vue2中,什么是双向绑定,为什么vue3要进行优化?
    一、什么是双向绑定我们先从单向绑定切入单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定举个栗子 当用户填写表单时,View......
  • vue3中ctrl加回车换行,光标位置设置
    <input v-model="text" type="textarea"@click="sbwz"@keydown="keysbwz" @keydown.enter.ctrl.exact.prevent="ctrlEnter" /> //暂存光标位置,后续截取换行使用consttextSplit=ref(0)//判断是否改变了上次光标位置constisTest=r......
  • vue3 把quill的base64变成图片地址
      你可以看看https://www.kancloud.cn/liuwave/quill/1434141或者看看别人的文章我的项目是vu3的 template的是这样的<el-form-itemlabel="中文详情"prop="content"><div><quill-editorref="QuillEditor"v-model:content="form.......
  • Nuxt2项目Js文件使用Vuex
    背景当前项目是Nuxt2框架,建立了Vuex仓库。通过返回一个函数的形式,建立Vuex代码如下importVuefrom'vue'importVuexfrom'vuex'Vue.use(Vuex)conststore=()=> newVuex.Store({ state:{ name:'abc' }, mutations:{ setName(state,data){ ......
  • vue:子组件从后台获取数据期间,父组件被遮罩覆盖
    效果:父组件代码<template><el-containerv-loading="loading"class="container"element-loading-background="rgba(1,35,54,0.8)"><h1>这是父组件</h1><HelloWorldmsg="Welcometo......
  • Vue3中SEO优化实践:利用unhead vue插件设置Mate标签
    我们在构建Vue3项目时,搜索引擎优化(SEO)是一个不可忽视的重要方面。优化网站结构、内容和代码,使其更符合搜索引擎的排名规则,对于提升网站曝光度和吸引更多用户至关重要。其中,设置合适的Mate标签(如标题、描述和关键词)是SEO优化的关键步骤之一。在Vue3项目中,我们可以利用unhead插件来......