0


vue3 ,naive-ui,嵌套modal踩坑

今天写代码,组合使用了,n-modal,n-datatable和n-select,在n-select组件出问题,无法展开,并且报错

Failed to execute 'insertBefore' on 'Node': This node type does not support this method.
Unhandled error during execution of scheduler flush. This is likely a Vue internals bug. Please open an issue at
Cannot read properties of null (reading 'emitsOptions')

先展示错误的demo代码

<script setup lang="ts">
import {  ref } from 'vue'
import {  NButton, NModal } from 'naive-ui'
import ModuleView from './ModuleView.vue';
const showModal_1 = ref(false)

</script>
<template>
  <div>
    <n-button type="info" @click="showModal_1 = true">点击展开modal</n-button>
    <n-modal v-model:show="showModal_1">
      <ModuleView/>
    </n-modal>
  </div>
</template>

ModuleView是抽象出来的组件,问题就出在这个抽象里面,下面是子组件代码;

<script setup lang="ts">
import { h, reactive, ref } from 'vue'
import { NSelect, NDataTable, NButton, NModal, NCard } from 'naive-ui'
const optionsRef = ref([
  {
    label: '1',
    value: 1
  },
  {
    label: '2',
    value: 2
  }
])

const columns = reactive([
  {
    title: '序号',
    key: 'index'
  },
  {
    title: '组件A',
    key: 'comp_a',
    render: () =>
      h(
        NSelect,
        {
          options: optionsRef.value,
          style: { width: '200px' }
        },
        {}
      )
  },
  {
    title: '组件B',
    key: 'comp_b',
    render: () =>
      h(NSelect, {
        options: optionsRef.value,
        style: { width: '200px' }
      })
  }
])
const data = ref<any>([])
const handelAdd = () => {
  const item: any = {
    index: data.value.length + 1,
    comp_a: 1,
    comp_b: 2
  }
  data.value.push(item)
}
const showModal_2 = ref(false)
</script>

<template>
  <div>
    <n-card>
      <n-button @click="handelAdd">+</n-button>
      <n-data-table :columns="columns" :data="data"> </n-data-table>
    </n-card>
  </div>

  <n-modal v-model:show="showModal_2"> </n-modal>
</template>

<style scoped></style>

很明显这是一个嵌套modal的代码。
效果图:
在这里插入图片描述

大伙都知道,vue2的时候template里面第一层只能写一个组件:

<template>
    <div>
        <div>你好</div>
        <a>hello world<a/>
    </div>
</template>

但是到了vue3就支持多组件了,比如:

<template>
    <div>你好</div>
    <a>hello world<a/>
</template>

我写vue3保留了vue2的习惯,只写一个组件,唯独用modal的时候习惯写到主组件外面,因为这个组件是遮罩的,会覆盖全页面。
但是问题也出在这,如果直接在modal里面写两个组件,naive会直接报错。

  <div>
    <n-button type="info" @click="showModal_1 = true">点击展开modal</n-button>
    <n-modal v-model:show="showModal_1">
      <n-button @click="">+</n-button>
      <n-data-table> </n-data-table>
      <n-modal> </n-modal>
    </n-modal>
  </div>
App.vue:11 [naive/getFirstSlotVNode]: slot[default] should have exactly one child
App.vue:11 [naive/modal]: default slot is empty 这个是错误报错

意思是说,modal里面只能有一个子组件。

    <n-modal v-model:show="showModal_1">
      <ModuleView/>
    </n-modal>

但是如果像我这样,抽象出来,就不会报错,会影响子组件内部的调用,导致我一直以为是Select或者DataTable写错了。
解决办法也很简单,直接把子组件写成一整个div就好。

标签: ui vue.js javascript

本文转载自: https://blog.csdn.net/qq_45756468/article/details/135414320
版权归原作者 今天的西瓜有点贵 所有, 如有侵权,请联系我们删除。

“vue3 ,naive-ui,嵌套modal踩坑”的评论:

还没有评论