Vue计算属性setter调用自身getter是否会递归?是否允许?
在Vue计算属性的setter中调用其getter是否可行?
完全可行,不会出现递归或异常交互问题,原因如下:
- Vue的计算属性getter和setter是相互独立的逻辑分支:调用
this.statesSearchQuery本质是触发getter执行并返回当前解析后的数组,这个操作不会触发setter,自然不存在递归调用的风险。 - 你的场景里,setter中先通过getter拿到当前的状态数组,再对传入的
val做存在性判断(添加/移除),最后转成字符串同步回prop,这个逻辑是合理且安全的。
举个对应你场景的简化代码示例,更直观:
computed: { statesSearchQuery: { get() { // 将逗号分隔的字符串转为非空数组 return (this.searchQuery['by-multiple-states'] || '').split(',').filter(Boolean) }, set(val) { // 调用getter获取当前数组 const currentStates = this.statesSearchQuery const newStates = currentStates.includes(val) ? currentStates.filter(s => s !== val) : [...currentStates, val] // 同步回prop(遵循单向数据流,通过事件通知父组件更新) this.$emit('update:searchQuery', { ...this.searchQuery, 'by-multiple-states': newStates.join(',') }) } } }
需要注意的额外细节:
- 确保getter是纯函数逻辑,不包含副作用,这样每次调用都能准确返回当前prop对应的数组状态。
- 修改prop时要遵循Vue的单向数据流原则,通过事件通知父组件更新,而非直接修改prop本身。
内容的提问来源于stack exchange,提问作者crazyyou
相关产品推荐
相关产品推荐

