vue 监听不到数据更新

本文解决在使用Vue.js结合ElementUI进行循环渲染多选框时,新增属性selectList无法正确监听并更新视图的问题。阐述了在实例创建后动态添加属性,导致视图不更新的原因及解决方案。

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

最近在做一个循环渲染多行多选框的页面,使用可element ui  的 checkdebox 组件。一维数组循环的是每一个多选框组,二维循环的是每个多选框组的选项。

<el-row v-for="(item,index) in settingData" :key="index">
      <el-col :span="4">
        <span >{{item.typeName}}:</span>
      </el-col>
      <el-col :span="20">
        <el-checkbox-group v-model="item.selectList">
          <el-checkbox v-for="(optionItem,optionIndex) in item.list"
                       :label="Number(optionItem.value)"
                       :key="optionIndex"
                       :disabled="index===0">{{optionItem.key}}</el-checkbox>
        </el-checkbox-group>
      </el-col>
    </el-row>

settingData =[
{list: [{key: "计划完成率", value: "1"}], typeName: "计划状态",typeValue: 0},
 {list: [{key: "未处理", value: "1"}, {key: "初筛不合格", value: "2"}, {key: "初筛通过",value: "3"}],typeName: "简历初筛"typeValue: 1]

最后的结果是点击多选框没有显示选中转态,打印 item.selectList 却是有选中数据。然后怀疑是vue监听不到数据变化,没有刷新页面。item.selectList  是之前没有定义的,是在这里新加的一个存储多选框选中内容的属性。 

折腾了好久,以为是二维数组监听不到的问题,后来发现是:

在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。

根据官方文档定义:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新

item.selectList 是在实例创建之后添加的,vue 监听不到,必需在实例创建之前添加才可以被监听到。

参考:https://www.jianshu.com/p/71b1807b1815  这是简书上大佬写的,写的很明白。

Vue中的`watch`是一个响应式系统,用于监听数据的变动并执行相应的函数。然而,有时候可能会遇到`watch`监听不到数据变化的情况,这可能有以下几个原因: 1. **数据源问题**:确保你正在`watch`的数据绑定到了正确的变量或响应式属性上。如果数据是在组件之外定义的,或者使用了`v-model.lazy`这样的特殊行为,`watch`可能不会立即响应。 2. **依赖更新时机**:`watch`是异步的,特别是在首次设置时,会等到下一次数据更新循环(通常在DOM渲染后)才会开始监听。如果你期望立即生效,可以在`watch`回调中显式调用`$set`方法手动触发更新。 3. **深度监听**:默认情况下,`watch`只监听数据对象的浅层次属性。如果你需要监听嵌套对象或数组的变化,需要启用深度监听,通过在`watch`选项里添加`deep: true`。 4. **异步函数**:如果被监听数据是由异步操作返回的,那么`watch`可能无法立即捕获到变化,因为数据还没有更新。在这种情况下,你可以考虑使用`async`和`await`,或者`immediate`选项。 5. **watch生命周期问题**:`watch`不是在每个属性改变时都执行的,而是根据Vue内部的策略来调度。如果你的监听函数在其他逻辑中修改了被观察的,可能导致预期外的结果。 6. **惰性求**:`watch`中的函数默认是惰性求的,这意味着它们只有在第一次执行时才会被编译。如果你在`watch`回调里创建了新的函数或引用,这些可能不会被立即更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值