v-model绑定对象检测不到属性变化?

本文探讨了在Vue中遇到的v-model绑定对象时,仅修改对象属性导致视图无法更新的问题。原因是Vue对对象的属性变化不做检测,只有当整个对象被替换时,v-model才能捕捉到变化。解决方案是确保v-model绑定的是对象的属性,或者在需要更新时完整地替换整个对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v-model绑定

v-model大家都知道绑定的是数据源,可以把数据的变化更新到页面上,但是昨天我却遇到了这个问题。看代码

 <!-- html代码 -->
<el-col :span="12">
         <el-form-item :label="$t('accountSubjectInfo.countriesCode')">
                    <el-select v-model="selectValue" value-key="id" style="width: 100%;">
                           <el-option v-for="i in country" :key="i.id" :label="i.name + ' +' + i.code" :value="i"></el-option>
                     </el-select>
         </el-form-item>
 </el-col>

export default {
	data() {
		selectValue: {}
	},
	computed: {
        ...mapGetters(['country'])
    },
	methods: {
        fetch() {
            this.requestLoading = true;
            getInfo({})
                .then(res => {
                    const {state, msg, result} = res.data;
                    if (state) {
                        this.formData.list = result;
                        this.formData.list.idType1 = this.formData.list.idType === 1 ? '个人' : '公司';
                        this.selectValue = {code: this.formData.list.telArea, id: this.formData.list.telCountryCode};
                    } else {
                        this.$message.error(msg);
                    }
                })
                .catch(err => {
                    this.$message({message: err.message, type: 'error'});
                })
                .finally(() => {
                    this.requestLoading = false;
                });
        },
    }
}

此时是对的,但是如果把fetch方法中==this.selectValue = {code: this.formData.list.telArea, id: this.formData.list.telCountryCode};==改成this.selectValue.code = this.formData.list.telArea;
this.selectValue.id = this.formData.list.telCountryCode;

看似这样的变化不会对页面造成影响,但是就会出现这样的不好效果,页面刷新第一次的时候,打印selectValue中有值id,code存在,并且页面会显示,但是当切换到其他页面再切换回来时,打印selectValue中有值id,code依然存在,但是页面下拉框默认值显示为空。

出现这个原因首先是因为又页面的computed计算属性导致country发生变化时会重新获取country的值,因为country是存放在store里面,相当于一个变量,当页面刷新或重载时,这个也会重新赋值,而下拉框中默认值的选择是根据后台返回的数据的id也就是this.formData.list.telCountryCode 与country中每个对象中的id进行匹配而获得的结果,所以当country发生变化时,也会导致selectValue变化。

但是v-model绑定的时候是绑定的selectValue这个对象,并不是对象里面的属性,而改成上面那个this.selectValue.code = this.formData.list.telArea;
this.selectValue.id = this.formData.list.telCountryCode;只是对对象的属性进行操作,vue优化的很好,你页面上并没有对selectValue的属性进行绑定,所以就不会检测属性的变化,而达到性能的优化。

如果把v-model改成 v-model=”selectValue.id“; v-model=”selectValue.code“那么这样就能够检测到属性的变化,所以每次重新获取值应当对整个对象进行重新赋值,而不是仅仅是操作里面的属性。

才尝试写,里面有非常多的问题,欢迎大家提出,本人将会非常感激。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值