当 VueJS prop 作为方法的参数时,为什么它不会响应式更新?
Why doesn't a VueJS prop reactively update when it's an argument to a method?
我的这个组件有两个文本字段和两个表达式,它们的计算结果应该是相同的。
<template>
<div>
{{ value.flange?value.circle.diameter:413 }}
{{ get(value, 'circle.diameter') }}
</div>
</template>
<script>
import _ from "lodash/fp"
export default {
name: "MyComponent",
props: {
value: {
type: Object,
default: () => ({}),
},
},
methods: {
get (obj, path) {
return _.get(obj, path)
},
},
}
</script>
这是我试图防止我的页面在 属性 未定义 this.value
的短暂瞬间崩溃。我更喜欢使用 lodash/fp 的 _.get
函数,因为对于更深层次的嵌套对象,它的可读性更高,而且不那么乏味。
但是,当我加载此页面时,我看到了 413 的短暂闪烁,但什么也没有,这是预料之中的。由于 413 是第一个表达式的占位符值,第二个应该是未定义的。然后,当 value
获得更新时,413 会迅速更改为 value.circle.diameter
,这是应该的,但是包裹在 get
中的那个永远不会更新。
为什么方法调用会阻止传播?我通常应该如何防止我的深层嵌套对象在未定义值时在 属性 访问时崩溃?
注意:我不想在对象为 null 时阻止页面呈现,例如,div
上的 v-if="value"
。这是因为我希望能够编辑值 {}
并在用户编辑时构建该结构。
这是因为属性是反应性的而函数调用不是。但是,您可以使用计算属性实现此目的:
<template>
<div>
{{ value.flange?value.circle.diameter:413 }}
{{ diameter }}
</div>
</template>
<script>
import _ from "lodash/fp"
export default {
name: "MyComponent",
props: {
value: {
type: Object,
default: () => ({}),
},
},
computed: {
diameter: function () {
return _.get(this.value, 'circle.diameter');
}
}
}
</script>
我的这个组件有两个文本字段和两个表达式,它们的计算结果应该是相同的。
<template>
<div>
{{ value.flange?value.circle.diameter:413 }}
{{ get(value, 'circle.diameter') }}
</div>
</template>
<script>
import _ from "lodash/fp"
export default {
name: "MyComponent",
props: {
value: {
type: Object,
default: () => ({}),
},
},
methods: {
get (obj, path) {
return _.get(obj, path)
},
},
}
</script>
这是我试图防止我的页面在 属性 未定义 this.value
的短暂瞬间崩溃。我更喜欢使用 lodash/fp 的 _.get
函数,因为对于更深层次的嵌套对象,它的可读性更高,而且不那么乏味。
但是,当我加载此页面时,我看到了 413 的短暂闪烁,但什么也没有,这是预料之中的。由于 413 是第一个表达式的占位符值,第二个应该是未定义的。然后,当 value
获得更新时,413 会迅速更改为 value.circle.diameter
,这是应该的,但是包裹在 get
中的那个永远不会更新。
为什么方法调用会阻止传播?我通常应该如何防止我的深层嵌套对象在未定义值时在 属性 访问时崩溃?
注意:我不想在对象为 null 时阻止页面呈现,例如,div
上的 v-if="value"
。这是因为我希望能够编辑值 {}
并在用户编辑时构建该结构。
这是因为属性是反应性的而函数调用不是。但是,您可以使用计算属性实现此目的:
<template>
<div>
{{ value.flange?value.circle.diameter:413 }}
{{ diameter }}
</div>
</template>
<script>
import _ from "lodash/fp"
export default {
name: "MyComponent",
props: {
value: {
type: Object,
default: () => ({}),
},
},
computed: {
diameter: function () {
return _.get(this.value, 'circle.diameter');
}
}
}
</script>