sonicsunsky
sonicsunsky
  • 发布:2019-07-10 11:50
  • 更新:2020-03-19 11:37
  • 阅读:13033

uni-app 小程序端 v-for循环绑定事件@event="func(item)"传值触发时打印item为undefined

分类:uni-app

uni-app 小程序端 v-for循环绑定事件@event="func(item)"传值触发时打印item为undefined;

小程序web开发者工具版本最新版本 RC v1.02.1906141;

HBuilderX最新正式版本2.01.2019.06.14;

**小程序端v-for循环一段数据的时候绑定事件传值item触发之后打印item为undefined;

例如最简单的v-for一个数字<view v-for="n in 10" :key="n" @tap="testTap(n)">{{ n }}</view>触发testTap打印n报错;**

发现v-for绑定key无效(该key不存在)的时候打印item值为undefined

现在的问题就是v-for一个数字v-for="n in 10" 触发绑定事件打印n的时候直接报错不是很理解,错误内容如下:
VM4479:1 thirdScriptError
Cannot read property '4' of undefined; [Component] Event Handler Error @ pages/cost-list/cost-list#handleEvent
TypeError: Cannot read property '4' of undefined
at http://127.0.0.1:48464/appservice/common/vendor.js:2773:27
at Array.forEach (<anonymous>)
at getExtraValue (http://127.0.0.1:48464/appservice/common/vendor.js:2760:22)
at http://127.0.0.1:48464/appservice/common/vendor.js:2828:37
at Array.forEach (<anonymous>)
at processEventExtra (http://127.0.0.1:48464/appservice/common/vendor.js:2811:15)
at processEventArgs (http://127.0.0.1:48464/appservice/common/vendor.js:2860:22)
at http://127.0.0.1:48464/appservice/common/vendor.js:2937:41
at Array.forEach (<anonymous>)
at http://127.0.0.1:48464/appservice/common/vendor.js:2919:23

相关代码如下:

testData: [  
                { id: 1, title: '测试1' },  
                {  
                    id: 2,  
                    title: '测试2'  
                },  
                {  
                    id: 3,  
                    title: '测试3'  
                }  
            ]  

<view class="" v-for="n in 10" :key="n" @tap="testTap(n)">{{ n }}</view>  
<view class="" v-for="item in testData" :key="index" @tap="testTap2(item)">{{ item.title }}</view>  

testTap(item) {  
            console.log(item);  
直接报错: //VM3859:1 thirdScriptError  
Cannot read property '2' of undefined; [Component] Event Handler Error @ pages/cost-list/cost-list#handleEvent  
TypeError: Cannot read property '2' of undefined  
        },  

        testTap2(item) {  
            console.log(item);  
打印 //undefined  
        },
2019-07-10 11:50 负责人:无 分享
已邀请:
9***@qq.com

9***@qq.com

是key的问题,处理一下key就解决undefined问题了

  • wow老花椒

    感谢,解决了。原本我使用 :key="item.id" 报这个错误,但是 data-id="item.id" 中有值。按照你这个方法把 :key="item.id" 改成 :key="index" 就好了。真是蛋疼

    2019-10-23 10:43

哒

- 哒哒哒哒哒哒

请问你这个问题解决了吗?我也遇到了相同的问题,发现他的传参好像跟循环有关系

data-event-opts="change,bindPickerChangerelation,$0,dic,,3,mouldfactors,,3,inputcode"  
...  
data-event-opts="change,bindPickerChangerelation,$0,dic,,6,mouldfactors,,6,inputcode"

这是我的传参,我看他的绑定事件,这个数字是跟每个循环的下标是一致的。

熬了好久还是没找到解决办法QAQ

  • 我查到这个问题好像只是在微信端有这个,官方说这个是一个bug,暂时可以通过索引曲线实现。

    2019-07-11 16:59

  • sonicsunsky (作者)

    回复 : 官方还没有回复,暂时也是用:data-index=n和e.currentTarget.dataset.index暂时解决的,我现在只是在单纯循环一个具体数字响应事件打印n的时候报错,其他应该正常注意绑定:key要真实存在有效,否则也会打印undefined

    2019-07-12 09:20

  • sonicsunsky (作者)

    回复 : 话说你的代码写有点晦涩看不太懂,代码尽量简单化

    2019-07-12 09:21

  • 回复 sonicsunsky:

    我现在的处理方案的绑定动态的id去区分,我需要判断的条件也好几个,所以动态拼接了一个id,在根据e.target.id获取之后再判断=。=,

    哈哈,那不是我写的代码,是uni-app运行之后的显示的绑定的事件以及传的参数

    2019-07-12 11:00

  • sonicsunsky (作者)

    回复 : 噢噢,哈哈

    2019-07-14 08:37

  • 9***@qq.com

    是key的问题,处理一下key就解决undefined问题了

    2019-09-03 11:13

  • 6***@qq.com

    回复 sonicsunsky: 要在回调里拿到index只有这么干了,大佬

    2020-03-24 00:01

n***@163.com

n***@163.com

同获取到undefined 排了半天的错误 原来是bug uni真是坑···

2***@qq.com

2***@qq.com

我今天遇到了跟你一样的问题,一直认为是uni-app的bug(确实如此)

但是我又认真审视了一下Cannot read property '2' of undefined;以及 v-for="(item,i) in 6"

发现可能是后面这个6的原因导致的;

最终将6改为一个正常的长度为6的数组;


html: v-for="(item,i) in list" :key="i"

js: list: [...new Array(6)].map((_, i) => i),


问题得到解决!!!

因为事件回调里使用了item,而 item需要读 6[i] , 所以导致报错, h5中vue处理方式可能不一样,所以h5中没有此错误

cloud_yan

cloud_yan

从内部处理效率上来说,使用 index 作为 key 最省资源

  • 从虚拟dom复用角度来看用index不是容易出问题么,所以现在我都不用index了=。=

    2020-09-30 18:57

  • cloud_yan

    回复 : 这里仅仅说 uni-app 内部的代码逻辑,实际上,index 确实不被推荐,只是用在没有对应 key 的情况下

    2021-08-16 15:09

该问题目前已经被锁定, 无法添加新回复