vue大坑:v-for的key以及props传参不当导致的闭包

27 篇文章 1 订阅
  • 为什么props传参在模版中使用没问题,在函数中使用不变化
  1. 场景
    当我们点击上方的月份时,会改变下方加载的卡片信息
    在这里插入图片描述

  2. 代码:

    父组件:

    		<div
    			v-for="(item, index) in vocalStore.getCardMonthData"
    			:key="index"
    		>
    			<DetailCard :data="item" />
    		</div>
    

    字组件

    <div 
    	@click="jumpUrl(data.name || '')">
    	大致模版
    </div>
    
    const { data } = defineProps<{
    	data: IvocalData
    }>()
    
    function jumpUrl() {
    	jumpData.find(a => {
    		if (a.name === val) window.location.href = a.url
    	})
    }
    
  3. 流程:

  • 当我们点击月份的时候,会加载对应月份的子组件卡片
  • 当我们点击某一个子组件的时候,会判断是否跳转
  1. 问题:

    • 如果我们设置key为index,会导致我们点击月份的时候,子组件并没有销毁然后重新构建,而是由于设置了key,导致每次点击月份会判断子组件没有变化(diff)。
    • 然后这时我们子组件的方法jumpUrl()就会一直存在在内存中,然后我们每次点击触发jumpUrl()的时候会闭包:
      • 因为vue3中的setup中返回了jumpUrl()这个方法
      • 并且jumpUrl()使用了setup中的data属性
      • 最后再次重复调用jumpUrl()
    • 导致我们更新了月份,但是点击子组件的时候,判断的却是其他月份的数据(第一次加载的月份)
  2. 解决方法:
    * 使用传参的方式,就是在调用函数的时候把参数传递进去,避免的闭包
    * 重新规划v-for的key值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值