更改组件的根元素

时间:2019-04-28 21:43:08

标签: javascript vue.js

VueJS每个组件仅允许一个根元素。在大多数情况下,可以将组件包装在div标记内,但有时可能会导致意外行为。

例如,在使用Bootstrap时,如果在两个元素(例如<b-row><b-col>)之间放置一个div,则布局将完全损坏。

框架中的许多其他元素都需要遵循特定的顺序,这就是为什么拥有一个根元素可能会造成问题的原因。

有没有办法动态设置根元素?

为说明我的意思,请看以下示例:

如果a具有这样的成分my-h1

<template>
    <div>
        <h1>Hello world</h1>
    </div>
</template>

在这里被呼叫

<div id="my-app">
    <my-h1 />
</div>

上面的代码将输出:

<div id="my-app">
    <div>
        <h1>Hello world</h1>
    </div>
</div>

我如何获得此输出:

<div id="my-app">
    <p>
        <h1>Hello world</h1>
    </p>
</div>

在另一个地方,这个地方:

<div id="my-app">
    <a>
        <h1>Hello world</h1>
    </a>
</div>

(我知道这些标签没有任何意义,仅是出于本示例的目的)


我希望你明白我的意思。仍然有一个根元素,但是使用道具或其他东西将其设置为不同:)

2 个答案:

答案 0 :(得分:1)

只需使用特殊的<component>组件,该组件即可动态选择该组件:

MyComponent.vue

<template>
  <component :is="is" v-bind="props">
    Hello world
  </component>
<template>
export default {
  props: ['is', 'props'],
}

用法如下:

<my-component is="div"/>
<my-component is="p"/>

答案 1 :(得分:0)

使用插槽,您将不得不替换整个组件,我认为这不是您想要的。

另一种解决方案是将 type 属性传递给您的组件并进行切换(我不知道它是否符合vue的一般原理)

但这是我在想的一个例子:

<template>
    <template v-if="type === 'div'">
      <div>
        <h1>Hello world</h1>
      </div>
    </template>

    <template v-else-if="type === 'a'">
      <a>
        <h1>Hello world</h1>
      </a>
    </template>

    <template v-else-if="type === 'p'">
      <p>
        <h1>Hello world</h1>
      </p>
    </template>

    <template v-else>
      <i>
        This is a default
        <b>ITALIC TEXT</b>
      </i>
    </template>
</template>

<script>
export default {
  props: {
    type: String
  }
};
</script>

然后您调用组件

<component type="div|p|a|whatever"/>