前端工作总结112-结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component

简介: 前端工作总结112-结构 vue操作一个很有意思的报错 [Vue warn]: You may have an infinite update loop in a component

结构

vue操作一个很有意思的报错

[Vue warn]: You may have an infinite update loop in a component render function. 

代码:

<template>
            <span class="show-filters" :class="show = !show">
                     {{ show ? '隐藏过滤器 ↑' :'显示过滤器 ↓' }}
          </span>
     </template>
      <script>       
         export default {
               data() {
                 return {
                       show: true
                     }
                }
           };
       </script>

分析

问题的本质

   NOTE: render method is triggered whenever any state changes

即任何时候vue实例状态的改变都会触发渲染方法的执行

   组件初始化时,将数据属性show值为true

   当渲染方法执行,内联表达式show = !show改变了状态

   响应状态show改变,重新执行render方法,企图生成新的VNode节点(以便生成真实节点插入页面)

   于是产生的局面会无尽循环这样:render - show改变 - render 重复执行步骤2-3-2

v-for

类似同样的报错,还很有可能在v-for指令中产生,如下

<div v-for="item in model.items" v-bind:class="test(item.result)">
     {{item.id}}
     </div>vue部分
    data() {
         return {
             accept: false,
             not_accept: false,
         };
     },
     methods: {
         test(result) {
             if (result == 'accept') {
                 this.accept = true;
                 this.not_accept = false;
             } else if (result == 'Not accept') {
                 this.accept = false;
                 this.not_accept = true;
             } else {
                 console.log(result);
             }
             return {
                 success: this.accept,
                 danger: this.not_accept,
             };
         },
     },

   也会出现如题报错,其原因是在for循环中 (render - test - render )间接修改了data响应数据而且没有终止条件。但是记住状态的改变会导致渲染方法的执行,上述两种情况的相同点在于,执行渲染时,又会改变状态,于是又渲染,迟迟不能生成真实节点,不休了。

解决方案

对同一依赖响应数据属性在同一实例的生命周期内只作一次变更。

比如:对示例一,将属性绑定改为vue事件绑定,事件是在下一次tick执行渲染

对于示例二,for指令通常只用来读取数据,而非写入响应数据。如需写入数据,无论直接还是间接操作都不要改变响应数据,如下所示:

methods: {
         test(result) {
             let accept;
             if (result == 'accept') {
                 accept = true;
             } else if (result == 'Not accept') {
                 accept = false;
             } else {
                 console.log(result);
             }
             return {
                 success: accept,
                 danger: !accept,
             };
         },
     }

小结

   慎用内联表达式,对于自定义vue属性而言,它会被渲染器自执行,上述两个小错误同样报错便如此

   尽可能用事件改变状态 ,驱动页面渲染重绘

相关文章
|
8月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
461 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
8月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
374 5
|
前端开发 JavaScript Docker
拿下奇怪的前端报错(五):SyntaxError: Unexpected token ‘??=‘或‘xxx‘ - 基于容器搭建开发环境或许是更好的选择
在前端开发中,同时维护多个项目时可能会遇到不同Node.js版本的问题。低版本Node.js可能导致依赖无法安装或启动失败,而高版本Node.js则可能引起第三方库的兼容性问题。推荐使用Docker搭建独立的开发环境,以避免版本不一致带来的困扰。
3384 2
|
Web App开发 缓存 前端开发
拿下奇怪的前端报错(六):多摄手机webrtc拉取视频流会导致应用崩溃,从而无法进行人像扫描
本文介绍了一种解决手机摄像头切换导致应用崩溃的问题的方法。针对不支持facingMode配置的四摄手机,通过缓存和序号切换的方式,确保应用在特定设备上不会频繁崩溃,提升用户体验。
383 1
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
9688 2
|
JavaScript 前端开发 Docker
拿下奇怪的前端报错(二):nvm不可用报错`GLIBC_2.27‘‘GLIBCXX_3.4.20‘not Found?+ 使用docker构建多个前端项目实践
本文介绍了在多版本Node.js环境中使用nvm进行版本管理和遇到的问题,以及通过Docker化构建流程来解决兼容性问题的方法。文中详细描述了构建Docker镜像、启动临时容器复制构建产物的具体步骤,有效解决了不同项目对Node.js版本的不同需求。
585 0
|
存储 前端开发 NoSQL
拿下奇怪的前端报错(四):1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点
在一个使用MongoDB GridFS存储文件的项目中,音频和视频文件在大部分设备上播放时长显示为无限,而单独播放则正常。经调查发现,问题源于HTTP Range请求的处理不当,导致最后一个字节未被正确返回。通过调整请求参数,使JavaScript/MongoDB的操作范围与HTTP Range一致,最终解决了这一问题。此案例强调了对HTTP协议深入理解及跨系统集成时注意细节的重要性。
296 0
|
缓存 JavaScript 前端开发
前端—vue学习
一. vue.js简介
241 0
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
301 2

热门文章

最新文章