在vue项目使用ts时,装饰器有如下几种,下面为这些装饰器的具体用法而且有和js中写法的对比:vue
下面为具体代码:bash
<template>
<div class="parent">
parent组件--{{title}}
<hr>
<Home v-model="title"></Home>
<About v-model="title"></About>
</div>
</template>
<script lang='ts'>
import Home from './Home.vue'
import About from './About.vue'
import { Component, Vue } from 'vue-property-decorator';
@Component({
components: {
Home,
About
}
})
export default class extends Vue {
private title: string = '父组件中的值'
}
</script>
复制代码
<script>
import Home from './Home.vue'
import About from './About.vue'
export default {
data() {
return {
title: '父组件中的值'
}
},
components: {
Home,
About
}
}
</script>
复制代码
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
<button @click="triggerEmit('qqq')">触发emit</button>
</div>
</template>
<script lang="ts">
import { Component, Vue, Emit } from 'vue-property-decorator';
@Component({})
export default class Home extends Vue {
private mounted() {
this.$on('demo-log', (data: any): void => {
alert(data)
})
}
@Emit('demo-log')
triggerEmit(n: any) {
console.log('hhh')
}
}
</script>
复制代码
下面为@Emit的另外一种写法,$on位置使用 - 连接,@Emit位置直接使用驼峰命名,则能够省略括号中的名称:”ide
export default class Home extends Vue {
private mounted() {
this.$on('trigger-emit', (data: any): void => {
alert(data)
})
}
@Emit()
triggerEmit(n: any) {
console.log('hhh')
}
}
复制代码
export default {
data() {
return {}
},
mounted() {
this.$on('trigger-emit', data => {
alert(data)
})
},
methods: {
triggerEmit(val) {
this.$emit('trigger-emit', val)
}
}
}
复制代码
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
<p>这是从父组件中传过来的值: {{title}}</p>
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component({})
export default class Home extends Vue {
@Prop() title!: string;
// prop的类型和默认值
// @Prop({type: String, default: 'default value'}) title!: string;
}
</script>
复制代码
export default {
data() {
return {}
},
props: ['title'],
// props: {
// title: {
// style: String,
// default: 'default value'
// }
// }
}
复制代码
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
<input type="text" v-model="inputValue">
</div>
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
@Component({})
export default class Home extends Vue {
private inputValue: string = ''
@Watch('inputValue')
valueChange(newValue: string, oldValue: string) {
console.log(newValue, oldValue)
}
// 对watch的配置为第二个参数,以对象形式传入
// @Watch('inputValue',{ deep: true })
// valueChange(newValue: string, oldValue: string) {
// console.log(newValue, oldValue)
// }
}
</script>
复制代码
export default {
data() {
return {
inputValue: ''
}
},
watch: {
inputValue(newValue, oldValue) {
console.log(newValue, oldValue)
}
}
}
复制代码
父组件代码以下ui
<template>
<div class="parent">
parent组件--{{title}}
<hr>
<Home v-model="title"></Home>
<!-- 直接使用v-mode为如下使用标签的语法糖,默认子组件使用value接受prop传值使用emit调用input方法修改值,在使用model参数prop修改如何接受,event修改emit调用哪一个方法来修改值 -->
<!--<Home :value="title" @input="title=$event.target.value"></Home>-->
</div>
</template>
<script lang='ts'>
import Home from './Home.vue'
import { Component, Vue } from 'vue-property-decorator';
@Component({
components: {
Home
}
})
export default class extends Vue {
private title: string = '父组件中的值'
}
</script>
复制代码
子组件ts代码以下this
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
<input type="text" v-model="inputValue" @input="valueChange($event.target.value)">
</div>
</template>
<script lang="ts">
import { Component, Vue, Model, Emit, Prop } from 'vue-property-decorator';
@Component({})
export default class Home extends Vue {
private inputValue: string = ''
private created() {
this.inputValue = this.valueFromModel
}
@Model ('changeValueFromModel') valueFromModel !: string;
@Emit('changeValueFromModel')
// 参数应该为输入框的值,因此上面传过来的值应该为value而不能是e
valueChange(val: string) {}
}
</script>
复制代码
export default {
model:{
prop: 'valueFromModel',
event: 'changeValueFromModel'
},
props: ['valueFromModel'],
data() {
return {
inputValue: ''
}
},
created() {
this.inputValue = this.valueFromModel
},
methods: {
valueChange(e) {
this.$emit('changeValueFromModel', e.target.value)
}
}
}
复制代码
父组件spa
<template>
<div class="parent">
parent组件--{{title}}
<Home></Home>
</div>
</template>
<script lang='ts'>
import Home from './Home.vue'
import { Component, Vue, Provide } from 'vue-property-decorator';
@Component({
components: {
Home
}
})
export default class extends Vue {
private title: string = '父组件中的值'
@Provide()
pOne = 'oneFromProvide'
@Provide('pTwo')
two = 'twoFromProvide'
}
</script>
复制代码
子组件code
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
来自provide中的值--1--{{pOne}}--2--{{pTwo}}
</div>
</template>
<script lang="ts">
import { Component, Vue, Inject } from 'vue-property-decorator';
import outMixins from './mixins';
@Component({})
export default class Home extends Vue {
@Inject('pOne')
pOne!: string;
@Inject({
from:'pTwo',
default:'default value'
})
pTwo!: string;
}
</script>
复制代码
父组件component
<template>
<div class="parent">
parent组件
<About></About>
</div>
</template>
<script>
import About from './About.vue'
export default {
components: {
About
},
provide () {
return {
pOne: 'oneFromProvide',
pTwo: 'twoFromProvide'
}
}
}
</script>
复制代码
子组件对象
<template>
<div class="home">
vue+js项目
<hr>
来自provide中的值--1--{{pOne}}--2--{{pTwo}}
</div>
</template>
<script>
export default {
inject: {
pOne: 'pOne',
pTwo: { from: 'pTwo', default: 'default value' }
}
}
</script>
复制代码
mixins.ts文件以下ip
import { Vue, Component } from 'vue-property-decorator';
@Component
export default class myMixins extends Vue {
valueFromMixins: string = "来自mixins的value"
}
复制代码
ts代码以下
<template>
<div class="home">
vue+ts项目vue-property-decorator用法
<hr>
来自mixins中的变量--{{valueFromMixins}}
</div>
</template>
<script lang="ts">
import { Component, Vue, Model, Emit, Prop } from 'vue-property-decorator';
import outMixins from './mixins';
@Component({
mixins: [outMixins]
})
export default class Home extends Vue {}
</script>
复制代码
<script>
import {outMixins} from './mixins'
export default {
mixins:[outMixins]
}
</script>
复制代码