问题描述
[问题描述:尽可能简洁清晰地把问题描述清楚]
组件里面一个属性为对象
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没问题。
9条答案
按热度按时间xjreopfe1#
翻阅了vue-class-component代码,发现对 Component.prototype 的属性增加了计算属性。
我感觉是不是在解析对象属性的时候,使用 Object.getOwnPropertyNames 得到对象的 getter属性。
jdg4fx2g2#
通过Object.keys并不能得到ts定义的class中的getter.
4ktjp1zp3#
找到问题所在了,主要是因为 cloneWithData 通过JSON.stringify 把值去掉了。
zvms9eto4#
@jcai 用 class 最好用 Vue-Property-decorator
另外 get 肯定能取到值, 但是 get return 的如果是 对象(可能数组也一样) 会缓存, 因为 get/set 会Map到 vue 的 computed , 而它默认会缓存, 一旦发送这种情况, 就需要 在
我跟Vue官方说了,但他们并没有重视这个问题 😂
class-component: vuejs/vue-class-component#424
vue-property : kaorun343/vue-property-decorator#320
dpiehjr45#
@jcai 看错你的问题了 ,抱歉 😂
7cjasjjr6#
@John0King uni-app的 cloneWithData 方法,其实不是很高效,没搞明白为啥这么做?
xmd2e60i7#
你这个情况可能是因为对象检测的问题,因为空对象是对象,你的new新建的也是对象,vue可能只会变更成员属性,但不变constructor, 你试试一开始赋值undefined 或者null来试试, 我用class模式在类似你的那个地方是正常的, (可能也正因为vue是配置式的,导致vue在各方面不如angular稳定)
kninwzqo8#
原因在于
a = new A()
后, a 的 prop1 是在a.__proto__
上,并且 prop1 是一个不可遍历的属性,这是遵循 es6 class 的规范的结果。然后在小程序里,会通过 setData的方式传递数据到 wxml 层,这时候会调用 JSON.stringify,它不会把不可遍历的属性带过去方法有两个
Object.defineProperty(a, 'prop1', { get(){}, enumerable: true })
,并且设置为可枚举实际操作中,方法1和2都不会手写,可以封装一些方法来自动处理这些 getter 的属性
c2e8gylq9#
方法2是个好办法,只是有点麻烦