computed?: Accessors<Computed>;
export type Accessors<T> = {
[K in keyof T]: (() => T[K]) | ComputedOptions<T[K]>
}
export interface ComputedOptions<T> {
get?(): T;
set?(value: T): void;
cache?: boolean;
}
计算属性有两种写法
- 函数式
- 对象式
函数式
监听一些值,然后计算出一个值,带有缓存
<template>
<div>
<el-input v-model="value"></el-input>
<div>
result: {{syncValue}}
</div>
</div>
</template>
<script>
export default {
name: 'EmptyHome',
computed:{
syncValue(){
return this.value + '-9999'
}
},
data(){
return{
value: '6666'
}
}
}
</script>
<style scoped lang="scss">
</style>
对象式
对象式使用的方式就比较多了
- 配置v-model使用
- 拆分一个值
我个人用的多就是配合v-model封装组件的model
例子:封装el-input
<template>
<div>
<el-input v-model="syncValue"></el-input>
<div>
result: {{ value }}
</div>
</div>
</template>
<script>
export default {
name: 'EmptyHome',
model: {
event: 'update:value',
prop: 'value'
},
props: {
value: {
type: String,
default: () => ''
}
},
computed: {
syncValue: {
get() {
return this.value
},
set(val) {
this.$emit('update:value', val)
}
}
},
data() {
return {}
}
}
</script>
<style scoped lang="scss">
</style>
这样我们就简单封装了一下,在做model和视图强关联组件的时候很好用
set方法触发
这里要讲一下这个set方法只有在直接给变量赋值的时候才会触发
触发
<template>
<div>
<el-input v-model="syncValue"></el-input>
<div>
result: {{ value }}
</div>
</div>
</template>
<script>
export default {
name: 'EmptyHome',
model: {
event: 'update:value',
prop: 'value'
},
props: {
value: {
type: Number,
default: () => ''
}
},
computed: {
syncValue: {
get() {
return this.value + ''
},
set(val) {
this.$emit('update:value', Number(val))
}
},
value2:{
get(){
return this.value
},
set(val){
console.log(val)
this.$emit('update:value', Number(val))
}
}
},
mounted() {
this.value2 = 6
},
data() {
return {}
}
}
</script>
<style scoped lang="scss">
</style>
这里我们给计算属性value2赋值的时候就会触发这个set方法
不触发
如果计算属性是一个返回的是一个对象,我们给这个对象里面的属性赋值就不会触发
<template>
<div>
<el-input v-model="syncValue"></el-input>
<div>
result: {{ value }}
</div>
</div>
</template>
<script>
export default {
name: 'EmptyHome',
model: {
event: 'update:value',
prop: 'value'
},
props: {
value: {
type: Number,
default: () => ''
}
},
computed: {
syncValue: {
get() {
return this.value + ''
},
set(val) {
this.$emit('update:value', Number(val))
}
},
value3:{
get(){
return {
value: this.value
}
},
set(val){
console.log('触发',val)
this.$emit('update:value',Number(val.value))
}
}
},
mounted() {
this.value3.value = 6
},
data() {
return {}
}
}
</script>
<style scoped lang="scss">
</style>
这个是不会触发的
触发
要是我们改成直接给这个对象赋值就可以触发
<template>
<div>
<el-input v-model="syncValue"></el-input>
<div>
result: {{ value }}
</div>
</div>
</template>
<script>
export default {
name: 'EmptyHome',
model: {
event: 'update:value',
prop: 'value'
},
props: {
value: {
type: Number,
default: () => ''
}
},
computed: {
syncValue: {
get() {
return this.value + ''
},
set(val) {
this.$emit('update:value', Number(val))
}
},
value3:{
get(){
return {
value: this.value
}
},
set(val){
console.log('触发',val)
this.$emit('update:value',Number(val.value))
}
}
},
mounted() {
this.value3 = {
value: 6
}
},
data() {
return {}
}
}
</script>
<style scoped lang="scss">
</style>
最后
个人感觉,要是el-input-number是用计算属性重新封装el-input应该就不会出现值和视图不相同的问题