我在做两个级联下拉框,比如选省份后自动加载对应的城市。但选完省份后,城市下拉框的数据没变,控制台也没报错,不知道是哪出问题了。
我试过在 watch 里监听省份变化,然后重新赋值 cityOptions,但界面就是不更新。是不是 Vue 的响应式没触发?代码大概像这样:
watch: {
selectedProvince(newVal) {
if (newVal) {
this.cityOptions = this.getCitiesByProvince(newVal); // 返回一个数组
}
}
}
第一,确认
this.getCitiesByProvince(newVal)返回的是个新数组,不是同一个数组引用。Vue对数组的响应式监听有点坑,如果是同一个引用可能不会触发更新。可以这样改:第二,看看
cityOptions是不是在data里声明的。如果没在data里声明而是直接挂在this上,那肯定不响应。第三,试试用$set强制更新:
另外你可以在watch里加个console.log,先确认回调确实执行了。有时候可能是省份的值没变导致watch没触发。
getCitiesByProvince返回的是一个新数组,而不是复用旧引用。Vue2 的响应式是靠Object.defineProperty,如果新旧数组是同一个引用,它就检测不到变化。最简单的办法是直接用
slice()或[...arr]手动深拷贝一层,或者用this.$set:或者更稳妥点,直接用
this.$set:如果你用的是 Vue3,那就直接
ref([])或reactive({ cityOptions: [] }),赋值时直接cityOptions.value = newCities就行,但记得别用原数组引用。另外确认下模板里是不是用了
v-model绑定了城市下拉框的值,如果绑定了旧值(比如省份切换前的 cityId),也可能导致看起来没更新——可以临时清空selectedCity验证下:复制这个逻辑试试,基本能解决 99% 的“看着没更新”问题。