Vue.js “超出最大调用堆栈大小”错误。为孩子使用对话框并将数据从父母传递给孩子失败

Posted

技术标签:

【中文标题】Vue.js “超出最大调用堆栈大小”错误。为孩子使用对话框并将数据从父母传递给孩子失败【英文标题】:Vue.js “Maximum call stack size exceeded” error. Use dialog for child and passing data from parent to child failing 【发布时间】:2020-04-30 21:41:19 【问题描述】:

我正在研究 Vuetify.js,我是 Vue 的新手,我参考了此文档 Vuetify Dialogs,用于从此链接 Open a Vuetify dialog from a component template in VueJS 创建 Matheus Dal'Pizzol 的对话框和解决方案,以将其与组件分开。 结果我有子组件作为对话框如下

家长

    <template>
      <v-container fluid>
        <v-row dense>
          <v-col cols="12">
            <v-btn large color="success">Add product</v-btn>
          </v-col>
          <v-col cols="3" v-for="product in products" :key="product.id">
            <v-card class="mx-auto" outlined>
              <v-list-item three-line>
                <v-list-item-content>
                  <v-list-item-title class="headline mb-1">product.name</v-list-item-title>
                  <v-list-item-subtitle>product.title</v-list-item-subtitle>
                </v-list-item-content>
              </v-list-item>
              <v-card-actions>
                <v-btn dark color="cyan" @click.stop="showScheduleForm = true">
                  <v-icon dark>mdi-television</v-icon>
                </v-btn>
                <v-btn color="primary">Detail</v-btn>
              </v-card-actions>
            </v-card>
            <modal-detail v-model="showScheduleForm" :productDetailInfo="product"></modal-detail>
          </v-col>
        </v-row>
      </v-container>
    </template>

    <script>
    import axios from "axios";
    import ModalDetail from "./ModalDetail.vue";
    export default 
      name: "HelloWorld",
      components: 
        ModalDetail
      ,
      data: function() 
        return 
          showScheduleForm: false,
          products: [],
          errors: []
        ;
      ,
    ...

儿童

    <template>
      <v-dialog v-model="show" max- v-if="Object.keys(productDetailInfo).length !== 0">
        <v-card>
          <v-card-title class="headline grey lighten-2" primary-title> productDetailInfo.name </v-card-title>

          <v-card-text> productDetailInfo.title </v-card-text>

          <v-divider></v-divider>

          <v-card-actions>
            <v-spacer></v-spacer>
            <v-btn color="green darken-1" text @click.stop="show = false">Close</v-btn>
            <v-btn color="primary">Detail</v-btn>
          </v-card-actions>
        </v-card>
      </v-dialog>
    </template>
    <script>
    export default 
      name: "ModalDetail",
      props: 
        productDetailInfo: 
          type: Object
        ,
        value: Boolean
      ,
      computed: 
        show: 
          get() 
            return this.value;
          ,
          set(value) 
            this.$emit("input", value);
          
        
      
    ;
    </script>

但是,当我单击icon-button“超出最大调用堆栈大小”时出现异常。 似乎有一个连续的循环发生。 请帮忙!我错过了什么吗?

【问题讨论】:

【参考方案1】:

那是因为您的v-dialogv-for 循环中,这是常见的problem。要解决此问题,请将 :retain-focus="false" 作为道具添加到您的 v-dialog

【讨论】:

【参考方案2】:

也许尝试在v-btn 中使用v-on:click.stop 而不是@click.stop,因为这是 Vue 2.x 的推荐语法。

【讨论】:

以上是关于Vue.js “超出最大调用堆栈大小”错误。为孩子使用对话框并将数据从父母传递给孩子失败的主要内容,如果未能解决你的问题,请参考以下文章

超出最大调用堆栈大小 - 没有明显的递归

Angular 11最大调用堆栈大小超出错误

如何捕获“超出最大调用堆栈大小”错误?

npm 错误!超出最大调用堆栈大小

递归过多/超出最大调用堆栈大小(Jquery 1.9.1)

Angular 8 - ng lint:超出最大调用堆栈大小错误