美文网首页
vue循环内对属性使用方法并修改data造成死循环

vue循环内对属性使用方法并修改data造成死循环

作者: AAA前端 | 来源:发表于2022-02-23 20:25 被阅读0次
  • 改一个老项目,修改部分代码后发现,一直报超出循环上限。只是告诉了我哪个文件有问题,但是这个文件是以前就存在的文件,都半年没改动了。

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

  • 仔细查看并网上一顿操作后发现原因。

在v-for循环当中,如果使用方法或者计算属性对vm.$data的属性进行操作,理论上,可能因为修改到循环对象,诱发无限循环,此时vue就会发出警告

父组件

      <sidebar-item
          v-for="(item, index) in newRoutes"
          :key="item.path+index"
          :item="item"
          :basePath="item.path"
        ></sidebar-item>

子组件

    <template v-if="hasOnlyChild(item.children, item)  && !childItem.children">
       {{childItem.title}}
    </template>
data(){
  return(){
      childItem: null
  }
},
methods:{
    hasOnlyChild(children = [], item) {
      let newChildren = children.filter(obj => {
        if (obj.hidden) {
          return false
        } else {
          return true
        }
      })
      if (newChildren.length === 1 && !item.meta) {
// 这里的赋值操作 造成死循环
        this.childItem = newChildren[0]
        return true
      }

      if (newChildren.length === 0) {
// 这里的赋值操作 造成死循环
        this.childItem = { ...item, path: '', noChild: true }
        return true
      }
      return false
    },
}

解决

具体问题不一样,但都是死循环类型,所以处理方式也是差不多的。就是先处理,再赋值渲染。


image.png

父组件

      <sidebar-item
          v-for="(item, index) in newRoutes"
          :key="item.path+index"
          :item="item"
          :basePath="item.path"
          :flagShow="item.flagShow"
          :childItem="item.childItem"
        ></sidebar-item>


....
  watch: {
    '$store.getters.routes': {
      deep: true,
      handler: function (newValue, oldValue) {
        this.dealData(newValue)
      },
      immediate: true
    }
  },
  data() {    
    return {
      newRoutes: []
    }
  },
  methods: {
    dealData(list){
      for(let i in list){
        const item = list[i]
        item.flagShow = this.hasOnlyChild(item.children, item)
      }
      this.newRoutes = list
    },
    hasOnlyChild(children = [], item) {
      let newChildren = children.filter(obj => {
        if (obj.hidden) {
          return false
        } else {
          return true
        }
      })
      if (newChildren.length === 1 && !item.meta) {
        item.childItem = newChildren[0]
        return true
      }
      if (newChildren.length === 0) {
        item.childItem = { ...item, path: '', noChild: true }
        return true
      }
      return false
    }
  }

子组件

    <template v-if="flagShow && !childItem.children">
       {{childItem.title}}
    </template>

参考: https://www.jianshu.com/p/a51fb3694673?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

相关文章

网友评论

      本文标题:vue循环内对属性使用方法并修改data造成死循环

      本文链接:https://www.haomeiwen.com/subject/jucalrtx.html