vue中给数组添加新属性后当属性值变化时为什么页面没效果?

文章讲述了在Vue.js应用中,如何正确处理从接口获取的config.list数组,确保在切换导航时checked属性的响应性。作者指出,直接操作config可能不会使其列表响应式,需先赋值给data中的变量并使用$set方法设置响应式属性。
摘要由CSDN通过智能技术生成

拿到请求接口数据后,给其中的config.list数组的每一项添加checked属性来控制当前导航是否选中,切换导航时修改checked的值:

data: function () {
    return {
        configList: [],
        menuList: [],   
        curType: null, 
        curMenu: 'coin',
    }
}
// res是接口返回值
if (res?.code == 0) {
    const config = res.data.config;

    this.configList = config; 
    // console.log(config);
    
    this.menuList = config.list.map(item => {
        if (item.name == this.curMenu) {
            item.checked = true;
            this.curType = item.type;
        } else {
            item.checked = false;
        }
        return item;
    });
}
// 切换导航
changeMenu(item) {
    if(item.type == this.curType) return; 
    this.menuList?.forEach(menu => {
        if (menu.type == item.type) {
            menu.checked = true;
            this.curType = item.type;
        } else {
            menu.checked = false;
        }
    })
},

这里的this.configList = config在后面没有用到,写的时候忘记删了,结果发现在切换导航时一直无法切换,打印出来发现数组中的checked是改变了,但是页面上没有效果。

打印config的值才知道,如果先把config赋值给data中的变量configList,config本身也会变成响应式的(多了getter和setter),所以后续给config里面的数组增加属性并要让该属性也成为响应式就需要用this.$set(item, 'checked', false)

如果config不做赋值操作,它就仍然是一个普通对象,给它里面的list数组加上checked属性后也还是一个普通数组,只有赋值给data中的变量menuList时才会让config.list变成响应式。

修改:

// 第一种
if (res?.code == 0) {
    const config = res.data.config;
    // 先加属性再赋值
    this.menuList = config.list.map(item => {
        if (item.name == this.curMenu) {
            item.checked = true;
            this.curType = item.type;
        } else {
            item.checked = false;
        }
        return item;
    });
}

// 第二种 
if (res?.code == 0) {
    const config = res.data.config;
    // 先赋值变成响应式,通过this.$set()设置响应式属性值
    this.configList = config;
    this.menuList = config.list.map(item => {
        if (item.name == this.curMenu) {
            this.$set(item, 'checked', true);
            this.curType = item.type;
        } else {
            this.$set(item, 'checked', false);
        }
        return item;
    });
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值