Javascript Vue<;模板>;在遍历列表时,标记的行为不符合预期

Javascript Vue<;模板>;在遍历列表时,标记的行为不符合预期,javascript,vue.js,vuejs2,vue-component,Javascript,Vue.js,Vuejs2,Vue Component,我的app.js可以生成如下选项卡: 输入: <tabs> <div> <a slot="header">Tab 1</a> <article slot="content"> <h2>Tab 1 Content</h2> <p>Lorem ipsum dolor sit amet</p>

我的app.js可以生成如下选项卡:

输入:

<tabs>
    <div>
        <a slot="header">Tab 1</a>
        <article slot="content">
            <h2>Tab 1 Content</h2>
            <p>Lorem ipsum dolor sit amet</p>
        </article>
    </div>
    <div>
        <a slot="header">Tab 2</a>
        <article slot="content">
            <h2>Tab 2 Content</h2>
            <p>Sed ut perspiciatis unde</p>
        </article>
    </div>
    <div>
        <a slot="header">Tab 3</a>
        <article slot="content">
            <h2>Tab 3 Content</h2>
            <p>Neque porro quisquam est</p>
        </article>
    </div>
</tabs>
使用上述选项卡的输入,如何获得上面在渲染函数或Vue模板中指定的输出

如果我试图通过
this.$slots.header
迭代slots,我将得到未定义


有人能帮我实现这一点吗?这是Vue中的基本循环。希望这有帮助

Vue.component('tabs'{
道具:['tabs'],
模板:`
  • {{item.title}
` }) var app=新的Vue({ el:“#应用程序”, 数据(){ 返回{ 选项卡:[ { 标题:“表1”, 内容:“表1内容” }, { 标题:“表2”, 内容:“表2内容” }, { 标题:“表3”, 内容:“表3内容” } ] } } })

这是Vue中的基本循环。希望这有帮助

Vue.component('tabs'{
道具:['tabs'],
模板:`
  • {{item.title}
` }) var app=新的Vue({ el:“#应用程序”, 数据(){ 返回{ 选项卡:[ { 标题:“表1”, 内容:“表1内容” }, { 标题:“表2”, 内容:“表2内容” }, { 标题:“表3”, 内容:“表3内容” } ] } } })

属性
$slots
包含直接子级插槽,因此嵌套命名插槽(如示例中所示)将被排除。在您的情况下,只有
default
插槽,其中包含包装
div
s(即选项卡)。在中,您必须手动处理选项卡的子项以获取内部插槽,以便生成您描述的HTML:

render(h) {
  const tabs = this.$slots.default;
  const headers = tabs && tabs.map(tab => tab.children.filter(x => x.data.attrs['slot'] === 'header'));
  const bodies = tabs && tabs.map(tab => tab.children.filter(x => x.data.attrs['slot'] === 'content'));

  if (!tabs || !bodies) {
    return h('div', 'No tabs');
  }

  return h('section', [
    h('nav', { class: 'tabs-nav' }, [
      h('ul', { class: 'tabs-list' },
        headers.map(header => h('li', { class: 'tabs-listitem' }, header)))
    ]),
    h('div', { class: 'tabs-body' }, bodies)
  ]);
}

属性
$slots
包含直接子级的插槽,因此嵌套命名插槽(如示例中所示)将被排除。在您的情况下,只有
default
插槽,其中包含包装
div
s(即选项卡)。在中,您必须手动处理选项卡的子项以获取内部插槽,以便生成您描述的HTML:

render(h) {
  const tabs = this.$slots.default;
  const headers = tabs && tabs.map(tab => tab.children.filter(x => x.data.attrs['slot'] === 'header'));
  const bodies = tabs && tabs.map(tab => tab.children.filter(x => x.data.attrs['slot'] === 'content'));

  if (!tabs || !bodies) {
    return h('div', 'No tabs');
  }

  return h('section', [
    h('nav', { class: 'tabs-nav' }, [
      h('ul', { class: 'tabs-list' },
        headers.map(header => h('li', { class: 'tabs-listitem' }, header)))
    ]),
    h('div', { class: 'tabs-body' }, bodies)
  ]);
}

您应该使用for循环并生成选项卡吗?是@DuongDang。我想用loop生成标签你找到解决方案了吗?没有。我找不到@DuongDang。我仍然在寻找帮助,我在下面发布了一个示例代码片段。希望这将有助于您使用for循环并生成选项卡?是@DuongDang。我想用loop生成标签你找到解决方案了吗?没有。我找不到@DuongDang。我仍然在寻找帮助,我在下面发布了一个示例代码片段。希望这会有所帮助