vue2中使用ts 定义属性undefined后属性不具有响应性

Talk is cheap. Show me the code:

<template>
  <span>{{ count }}</span>
</template>

<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
@Component({})
export default class TsComp extends Vue {
  count: any = undefined;

  mgs = 123;

  mounted() {
    setTimeout(() => {
      this.count = 10;
    }, 1000);
  }
}
</script>

上面的代码在我们运行中会出现

而我们期望的结果是页面显示10,但是却不会显示任何内容。经过排查发现:

data中并没有我们定义的变量,经过翻查vue的代码终于在vue-class-component中找到了答案

vue在处理ts组件的时候会使用@component这个装饰器,这个装饰器对代码进行了处理,下面来分析下component这个装饰器:

如何处理methods,hooks以及computed这里不做分析,有兴趣可以直接看源码,源码很清晰。我们主要分析如何把ts class中的成员变量处理成vue中的data的。

我们在代码中看到有个collectDataFromConstructor方法,这个方法中手动初始化要包装的类,目的是拿到初始化后的实例,我们在类中定义的成员属性可以通过实例获取到,循环遍历实例中的属性,但是有个重点是值为undefined的不会保留下来,也就是说值为undefined的属性不会添加到data中,故vue遍历data处理响应性的时候,就不会有值为undefined的属性,所以我们页面定义的属性不是响应式的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值