前端工作总结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属性而言,它会被渲染器自执行,上述两个小错误同样报错便如此

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

相关文章
|
1天前
|
存储 JavaScript 前端开发
使用Vue.js构建交互式前端的技术探索
【5月更文挑战第12天】Vue.js是渐进式前端框架,以其简洁和强大的特性深受开发者喜爱。它聚焦视图层,采用MVVM模式实现数据与视图的双向绑定,简化开发。核心特性包括响应式数据绑定、组件化、模板系统和虚拟DOM。通过创建Vue实例、编写模板及定义方法,可以构建交互式前端,如计数器应用。Vue.js让复杂、交互式的前端开发变得更加高效和易维护。
|
2天前
|
JavaScript 前端开发 容器
Vue 3 中 <transition-group> 组件报错的非 props 属性传递问题
Vue 3 中 <transition-group> 组件报错的非 props 属性传递问题
12 1
|
3天前
|
JSON JavaScript 前端开发
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
vue的 blob文件下载文件时,后端自定义异常,并返回json错误提示信息,前端捕获信息并展示给用户
|
3天前
|
JSON JavaScript 前端开发
vue前端运行时出现RangeError: Maximum call stack size exceeded
vue前端运行时出现RangeError: Maximum call stack size exceeded
11 4
|
4天前
|
JavaScript 前端开发
vue前端展示【1】
vue前端展示【1】
7 1
|
4天前
|
JavaScript 数据处理
vue报错 ‘超出最大堆栈大小‘
vue报错 ‘超出最大堆栈大小‘
8 0
|
5天前
|
JavaScript 搜索推荐 前端开发
vue报错 ‘超出最大堆栈大小‘
vue报错 ‘超出最大堆栈大小‘
16 3
|
12天前
|
JSON JavaScript Java
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
22 0
|
13天前
|
前端开发 JavaScript 开发者
【专栏:HTML与CSS前端技术趋势篇】前端框架(React/Vue/Angular)与HTML/CSS的结合使用
【4月更文挑战第30天】前端框架React、Vue和Angular助力UI开发,通过组件化、状态管理和虚拟DOM提升效率。这些框架与HTML/CSS结合,使用模板语法、样式管理及组件化思想。未来趋势包括框架简化、Web组件标准采用和CSS在框架中角色的演变。开发者需紧跟技术发展,掌握新工具,提升开发效能。
|
14天前
|
JSON JavaScript 前端开发
前端框架vue的样式操作,以及vue提供的属性功能应用实战
前端框架vue的样式操作,以及vue提供的属性功能应用实战