正如我在标题中所写,我正在try 构建自己的选项卡组件.到目前为止,这是非常基本的:

Tabs.vue

setup(props, { slots }) {
  const { activeTab } = toRefs(props);
  provide("activeTab", activeTab);

  const newSlots = slots.default().map((slot, index) => {
    return h(slot, {
      index, // for each tab to know, whether is active
      key: index, // for TransitionGroup
    });
  });

  return () =>
    h(
      TransitionGroup,
      {
        name: "tabs-fade",
      },
      () => newSlots
    );
}

Tab.vue

<template>
  <div v-if="activeTab === index">
    <slot />
  </div>
</template>
setup() {
  const activeTab = inject("activeTab");

  return {
    activeTab,
  };
},

我打算这样使用它:

<ul>
  <li @click="activeTab = 0">1</li>
  <li @click="activeTab = 1">2</li>
  <li @click="activeTab = 2">3</li>
</ul>
<Tabs :activeTab="activeTab">
  <Tab> 1 </Tab>
  <Tab> 2 </Tab>
  <Tab> 3 </Tab>
</Tabs>

如果没有TransitionGroup,一切都可以正常工作,尽管当我试图添加它以实现更平滑的过渡时,我在try 在选项卡之间切换时遇到了一个错误:

[Vue warn]: Unhandled error during execution of render function 
  at <TransitionGroup name="tabs-fade" > 
  at <Tabs activeTab=1 > 
  at <Testing> 
  at <App>

[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/core 
  at <TransitionGroup name="tabs-fade" > 
  at <Tabs activeTab=1 > 
  at <Testing> 
  at <App>
Uncaught (in promise) TypeError: child.el.getBoundingClientRect is not a function

Screenshot of errors

推荐答案

TransitionGroup需要一致数量的子对象,以便它可以从一个状态过渡到另一个状态.目前,Tabs.vue的根元素是有条件呈现的,因此当不满足条件时,可能根本没有元素,从而导致崩溃:

<!-- Tab.vue -->
<template>
  <div v-if="activeTab === index"> ❌ when false, no element exists
    <slot/>
  </div>
</template>

解决方案

div上添加v-else,以确保Tab.vue中始终存在一个元素:

<!-- Tab.vue -->
<template>
  <div v-if="activeTab === index">
    <slot/>
  </div>
  <div v-else /> ????
</template>

demo

Javascript相关问答推荐

如何禁用附加图标点击的v—自动完成事件

处理时间和字符串时MySQL表中显示的日期无效

构造HTML表单以使用表单数据创建对象数组

如何将Openjphjs与next.js一起使用?

为什么Mutations 观察器用微任务队列而不是macrotask队列处理?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

当我在Reaction中创建一个输入列表时,我的输入行为异常

在FAQ Accodion应用程序中使用React useState时出现问题

按下单键和多值

有效路径同时显示有效路径组件和不存在的路径组件

在JS/TS中将复杂图形转换为数组或其他数据 struct

Pevent触发material 用户界面数据网格中的自动保存

如何让SVG图标在被点击和访问后改变 colored颜色 ,并在被访问后取消点击时恢复到原来的 colored颜色 ?

使用可配置项目创建网格

是否设置以JavaScript为背景的画布元素?

未找到用于 Select 器的元素:in( puppeteer 师错误)

在Java脚本中构建接口的对象

不允许在对象文本中注释掉的属性

如何在底部重叠多个div?

Node.js的Fetch()调用总是创建新的Express会话