uni-app 微信小程序中使用typescript的get方法不能取值

gblwokeq  于 2022-11-02  发布在  uni-app
关注(0)|答案(9)|浏览(334)

问题描述

[问题描述:尽可能简洁清晰地把问题描述清楚]
组件里面一个属性为对象

class A{
get prop1(){....}
get prop2(){.....}
}
<template>
view {{a.prop1}}
</template>
<script lang="ts">
....
data () {
    return {
      a: {} as A
    }
},
mounted(){
  this.a = new A()
}
.....
</script>

始终不能取得属性prop1的值,代码不变的情况下h5下则完全没问题。

另外微信小程序中组件的prop不能传递上面的A对象示例,但是h5没问题。

xjreopfe

xjreopfe1#

翻阅了vue-class-component代码,发现对 Component.prototype 的属性增加了计算属性。

我感觉是不是在解析对象属性的时候,使用 Object.getOwnPropertyNames 得到对象的 getter属性。

jdg4fx2g

jdg4fx2g2#

通过Object.keys并不能得到ts定义的class中的getter.

4ktjp1zp

4ktjp1zp3#

找到问题所在了,主要是因为 cloneWithData 通过JSON.stringify 把值去掉了。

zvms9eto

zvms9eto4#

@jcai 用 class 最好用 Vue-Property-decorator
另外 get 肯定能取到值, 但是 get return 的如果是 对象(可能数组也一样) 会缓存, 因为 get/set 会Map到 vue 的 computed , 而它默认会缓存, 一旦发送这种情况, 就需要 在

@Component<YourClass>({ 
    computed:{  
        yourGet:{ 
            type:Object, 
            get:function()=>this.xxx } 
        } 
    })
export default class YourClass extends Vue{
    yourGet!:{a:string,b:number};
    xxx:any = {}
}

我跟Vue官方说了,但他们并没有重视这个问题 😂

class-component: vuejs/vue-class-component#424
vue-property : kaorun343/vue-property-decorator#320

dpiehjr4

dpiehjr45#

@jcai 看错你的问题了 ,抱歉 😂

7cjasjjr

7cjasjjr6#

@John0King uni-app的 cloneWithData 方法,其实不是很高效,没搞明白为啥这么做?

xmd2e60i

xmd2e60i7#

你这个情况可能是因为对象检测的问题,因为空对象是对象,你的new新建的也是对象,vue可能只会变更成员属性,但不变constructor, 你试试一开始赋值undefined 或者null来试试, 我用class模式在类似你的那个地方是正常的, (可能也正因为vue是配置式的,导致vue在各方面不如angular稳定)

kninwzqo

kninwzqo8#

原因在于 a = new A() 后, a 的 prop1 是在 a.__proto__ 上,并且 prop1 是一个不可遍历的属性,这是遵循 es6 class 的规范的结果。然后在小程序里,会通过 setData的方式传递数据到 wxml 层,这时候会调用 JSON.stringify,它不会把不可遍历的属性带过去

方法有两个

  1. 把 prop1 设置到 a 的自有属性上, Object.defineProperty(a, 'prop1', { get(){}, enumerable: true }) ,并且设置为可枚举
  2. 为 a 添加 toJSON 方法,toJSON 返回一个对象,这样在 JSON.stringify 时就会把 toJSON 的结果来转换了
a.toJSON = function(){
  return Object.assign({}, a, { prop1: a.prop1 })
}

实际操作中,方法1和2都不会手写,可以封装一些方法来自动处理这些 getter 的属性

c2e8gylq

c2e8gylq9#

方法2是个好办法,只是有点麻烦

相关问题