13

在 Vue.js 中创建幻灯片时出现以下错误:

[Vue warn]: Unhandled error during execution of scheduler flush. This is likely a Vue internals bug. Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue-next 
  at <Anonymous key=1 > 
  at <Anonymous pager="true" options= {initialSlide: 1, speed: 400} > 
  at <Anonymous fullscreen=true > 
  at <IonPage isInOutlet=true registerIonPage=fn<registerIonPage> > 
  at <Product Details ref=Ref< Proxy {…} > key="/products/1" isInOutlet=true  ... > 
  at <IonRouterOutlet> 
  at <IonApp> 
  at <App>
Uncaught (in promise) DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.
    at insert (webpack-internal:///./node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js:222:16)
    at mountElement (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:3958:9)
    at processElement (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:3899:13)
    at patch (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:3819:21)
    at componentEffect (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4312:21)
    at reactiveEffect (webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:71:24)
    at effect (webpack-internal:///./node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js:46:9)
    at setupRenderEffect (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4277:89)
    at mountComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4235:9)
    at processComponent (webpack-internal:///./node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js:4195:17)

如果我添加硬编码的幻灯片,它不会显示任何错误。但是,如果我使用v-for循环动态添加幻灯片,则会显示上述错误。

我通过以下方式添加了幻灯片:

这是模板:

  <ion-slides pager="true" :options="slideOpts">
    <ion-slide v-for="image in product.product_images" v-bind:key="image.id">
      <h1>Slide 1</h1>
    </ion-slide>
  </ion-slides>

这是脚本:

export default {
  name: "Product Details",
  components: {
    IonContent,
    IonHeader,
    IonPage,
    IonTitle,
    IonToolbar,
    IonSlides,
    IonSlide,
  },
  data() {
    return {
      product: {},
    };
  },
  setup() {
    // Optional parameters to pass to the swiper instance. See http://idangero.us/swiper/api/ for valid options.
    const slideOpts = {
      initialSlide: 1,
      speed: 400,
    };
    return { slideOpts };
  },
  mounted: function () {
    fetch("http://localhost:4000/api/products/" + this.$route.params.id, {
      method: "get",
    })
      .then((response) => {
        return response.json();
      })
      .then((jsonData) => {
        this.product = jsonData;
        // console.log(jsonData.product_images);
      });
  },
};

我在代码中做错了什么?

4

3 回答 3

10

可以说,这个错误消息可以得到改进。

该错误是由于尝试undefined使用v-for. 具体来说,在调用mount()返回之前,product.product_imagesis undefined,因为您product作为空对象启动。

Vue 2 风格的解决方案

  • 实例product.product_image化为可迭代:
//...
  data: () => ({ 
    product: { product_images: [] }
  })

或在模板中提供一个空数组作为后备:

<ion-slide v-for="image in product.product_images || []" v-bind:key="image.id">
  <h1>Slide 1</h1>
</ion-slide> 

或将 av-if放在 的父级上v-for

<ion-slides pager="true" :options="slideOpts" v-if="product.product_images">
  ...
</ion-slides>

Vue 3 风格的解决方案

通过赋予它一个功能,使整个ProductDetails组件具有悬念性。async setupsetup函数中,调用以获取产品。
概念证明:

//...
async setup() {
  const product = await fetch("http://localhost:4000/api/products/" + 
    this.$route.params.id, {
      method: "get",
    }).then(r => r.json());
  return { product }
}

现在<product-details>放入<Suspense>'s<template #default>中,提供一个后备模板(将在<Suspense>解析其默认模板中找到的所有异步组件时呈现该模板):

<Suspense>
  <template #default>
    <product-details></product-details>
  </template>
  <template #fallback>
    Product is loading...
  </template>
</Suspense>

使用的美妙(和优雅)<Suspense>在于父级不需要知道尚未呈现标记的实际条件。它只是等待所有可挂起的组件解决。
简而言之,使用<Suspense>您不再需要使用v-ifs 将渲染逻辑硬编码到模板中并在包装器上明确指定条件。每个异步子组件都包含自己的条件,它向父组件宣布的只是:我完成了。全部完成后,它们被渲染。

于 2021-01-22T10:03:37.260 回答
0

你能改变组件名称吗?

export default 

  name: "Product Details" ... <= here
于 2021-06-21T02:15:09.810 回答
-4

created使用格式错误的钩子( ,mounted等...)时也会遇到此错误。在我的例子中,created是一个对象而不是一个函数。

坏的:

created: { /* some code */ }

好的:

created() { /* some code */ }
// or...
created: function() { /* some code */ }
于 2021-02-07T18:38:41.087 回答