vue报错cannot read property_vue3 ref 数组

vue报错cannot read property_vue3 ref 数组当函数执行到this.agents.splice()时,我设置了断点。发现传参index是0,但是页面上的列表项对应的第一行数据没有被删除,WTF!!!这是什么鬼!然后我打开VueDevtools,然后刷新了一下,发现那个数组的第一项还是存在的removeOneAgentByIndex:function(index){this.agents.splice(index,1)…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

当函数执行到this.agents.splice()时,我设置了断点。发现传参index是0,但是页面上的列表项对应的第一行数据没有被删除,

WTF!!! 这是什么鬼!然后我打开Vue Devtools, 然后刷新了一下,发现那个数组的第一项还是存在的


removeOneAgentByIndex: function (index) {
  this.agents.splice(index, 1)
}

然后我就谷歌了一下,发现这个splice not working properly my object list VueJs, 大概意思是v-for的时候最好给列表项绑定:key=。然后我是试了这个方法,发现没啥作用。

最终我决定,单步调试,如果我发现该问题出在Vue自身,那我就该抛弃Vue, 学习React了

单步调试中出现一个异常的情况,removeOneAgentByIndex是被A函数调用的,A函数由websocket事件驱动。正常情况下应该触发一次的事件,服务端却发送了两次到客户端。由于事件重复,第一次执行A删除时,实际上removeOneAgentByIndex是执行成功了,但是重复的第二个事件到来时,A函数又往agents数组中添加了一项。导致看起来,removeOneAgentByIndex函数执行起来似乎没有设么作用。而且这两个重复的事件是在几乎是在同一时间发送到客户端,所以我几乎花了将近一个小时去解决这个bug。引起这个bug的原因是事件重复,所以我在前端代码中加入事件去重功能,最终解决这个问题。

我记得之前看过一篇文章,一个开发者调通过回调函数计费,回调函数是由事件触发,但是没想到有时候事件会重发,导致重复计费。后来这名开发者在自己的代码中加入事件去重的功能,最终解决了这个问题。

事后总结:我觉得我不该怀疑Vue这种库出现了问题,但是我又不禁去怀疑。

通过这个bug, 我也学到了第二方法,可以删除Vue数组中的某一项,参考下面代码。


// Only in 2.2.0+: Also works with Array + index.
removeOneAgentByIndex: function (index) {
  this.$delete(this.agents, index)
}

另外Vue devtools有时候并不会实时的观测到组件属性的变化,即使点了Refresh按钮。如果点了Refresh按钮还不行,那建议你重新打开谷歌浏览器的devtools面板。

最后for循环是非常建议对列表项绑定:key, 这个key应当是固定且唯一的,可以是uuid,或者id。但是千万不要绑定数组的index, 否则就会出现Vue项目中v-for数组删除第n项元素产生渲染错误


// very bad
<li v-for="(item,index) in list" :key="index"></li>


// very good
<li v-for="(item,index) in list" :key="item.id"></li>

原文地址:https://segmentfault.com/a/1190000017356114

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193427.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python标识符以什么开头_哪个不是python合法标识符

    python标识符以什么开头_哪个不是python合法标识符python标识符命名规范介绍发布时间:2020-05-2311:03:48来源:亿速云阅读:146作者:Leahpython的标识符是什么?怎样命名?这些问题可能是我们日常工作会见到的。通过这些问题,希望你能收获更多。下面是揭开这些问题的详细内容。简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量、函数、类、模块以及其他对象的名称。Python中标识…

    2022年9月9日
  • PyCharm激活码永久有效PyCharm2020.2.4激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2020.2.4激活码教程-持续更新,一步到位PyCharm激活码永久有效2020.2.4激活码教程-Windows版永久激活-持续更新,Idea激活码2020.2.4成功激活

    2022年6月19日
  • uva 11732 – strcmp() Anyone? 不错的Trie题

    uva 11732 – strcmp() Anyone? 不错的Trie题

    2021年12月8日
  • python 爱心代码_python浪漫代码

    python 爱心代码_python浪漫代码动态心型importturtleimporttimedefLittleHeart():foriinrange(200):turtle.right(1)turtle.forward(2)love=’Ilove草莓’turtle.setup(width=900,height=500)turtle.color(‘red’,’red’)turtle.pensize(3)turtle.speed(50)turtle.

    2022年10月13日
  • ajax跨域问题的解决方案「建议收藏」

    ajax跨域问题的解决方案「建议收藏」什么是跨域问题?跨域问题来源于JavaScript的”同源策略”,即只有协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题。查看浏览器开发者工具Console报错:Failedtoloadhttp://a.a.com:8080/A/FromServlet?userName=123:No‘Access-Control-Allow-Origin’

    2022年8月24日
  • mips一个字是几个字节_计算机中字和字节的关系

    mips一个字是几个字节_计算机中字和字节的关系字节是byte,包括8个二进制位;字是word,长度与架构有关,如mips包括32个二进制位,一个字就是4个字节,它们的区别就是长度不一样。内存中是按字节寻值。因此是每byte也就是每8位存一个数值。当你想取一个word出来的时候,就是连续取了4个byte出来,然后拼成一个word。xx位机的xx位是指字长。这个字和word不一样,是指这种CPU一次…

    2022年10月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号