首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在vue插槽中嵌套一个插槽

在vue插槽中嵌套一个插槽
EN

Stack Overflow用户
提问于 2019-01-14 23:12:46
回答 1查看 7.2K关注 0票数 2

更新:以下是我试图在这里实现的简化版本(来自下面的线程对话):

接受组件A-接受组件B -接受一个条件-如果条件为真:用组件A包装组件B并呈现-否则只呈现组件B。

--我对感兴趣的创建了一个组件,该组件有条件地呈现包装器。我认为这样的理论方法可能是最好的方法

代码语言:javascript
复制
<template>
    <div>
        <slot v-if="wrapIf" name="wrapper">
            <slot name="content"></slot>
        </slot>

        <slot v-else name="content"></slot>
    </div>
</template>
<script>
    export default {
        props: {
            wrapIf: Boolean,
        }
    }
</script>

然后,当我们实现时,它看起来像--如下所示:

代码语言:javascript
复制
...
<wrapper-if :wrap-if="!!link">
    <a :href="link" slot="wrapper"><slot></slot></a>

    <template slot="content">
         content
    </template>
</wrapper-if>

在本例中,如果 a link,那么让用包装槽包装内容(可以是任何组件/元素)。如果存在e 225E 126,则不是E 227,那么让我们将E 128仅呈现内容E 229而不使用包装链接。非常简单的逻辑,但我似乎误解了一些基本的vue功能,因为这个特定的示例不起作用。

,我的代码或有什么问题吗?是否有某种原生api已经实现了这个或,也许是,一个已经在执行之类的依赖?

输出应该如下所示:

wrapIf === true

代码语言:javascript
复制
<a href="some.link">
    content
</a>

wrapIf === false

代码语言:javascript
复制
content
EN

回答 1

Stack Overflow用户

发布于 2019-01-15 01:21:02

只需关注内容本身,让组件担心是否要包装默认设置命名内容插槽。

如果您需要包装器是动态的,动态分量应该解决这个问题。我已经相应地更新了我的解决方案。因此,如果需要包装器成为label元素,只需将tag属性设置为它,以此类推。

代码语言:javascript
复制
const WrapperIf = Vue.extend({
  template: `
    <div>
      <component :is="tag" v-if="wrapIf" class="wrapper">
        <slot name="content"></slot>
      </component>

      <slot v-else name="content"></slot>
    </div>
  `,

  props: ['wrapIf', 'tag']
});


new Vue({
  el: '#app',

  data() {
    return {
      link: 'https://stackoverflow.com/company',

      tagList: ['p', 'label'],
      tag: 'p',
      wrap: true
    }
  },

  components: {
    WrapperIf
  }
})
代码语言:javascript
复制
.wrapper {
  display: block;
  padding: 10px;
}

p.wrapper {
  background-color: lightgray;
}

label.wrapper {
  background-color: lavender;
}
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div id="app">
  <wrapper-if :wrap-if="wrap" :tag="tag">
    <a :href="link" slot="content">
       content
    </a>
  </wrapper-if>

  <div>
    Change wrapper type:
    <select v-model="tag">
      <option v-for="tag in tagList">{{tag}}</option>
    </select>
  </div>

  <button @click="wrap = !wrap">Toggle wrapper</button>
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54190569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档