这是我在计算下的代码
computed: {
display: {
get() {
return this.display
},
set(newValue) {
this.display = newValue
}
}
},
我正在尝试更新从模型下的函数计算的值
async submit() {
this.display = false;
}
提交函数运行时,我在控制台上出现以下错误
Uncaught (in promise) RangeError: Maximum call stack size exceeded
当你在set
中写this.display = newValue
时,它只会导致再次调用set
,循环一圈又一圈。
要将 prop 包装在计算属性中,您需要为其指定不同的名称。此外,set
应发出事件,以便父组件可以更新数据。您不能直接在当前组件中执行此操作。
下面的示例使用sync
修饰符,但如果您愿意,可以使用单独的事件侦听器。
const Child = {
template: `<input v-model="displayModel">`,
props: ['display'],
computed: {
displayModel: {
get () {
return this.display
},
set (display) {
this.$emit('update:display', display)
}
}
}
}
new Vue({
el: '#app',
components: {
Child
},
data () {
return {
parentDisplay: 'hello'
}
}
})
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
<p>{{ parentDisplay }}</p>
<child :display.sync="parentDisplay"></child>
</div>
您也可以直接emit
事件,而不是修改属性,完全跳过计算的属性。 即用$emit
替换this.display = false;
。
或者,如果 prop 仅用于设置属性的初始值,那么您应该在首次创建组件时将其复制到data
属性:
props: ['display'],
data () {
return {
internalDisplay: this.display
}
}
然后,您可以直接设置internalDisplay
的值。