有没有办法让一个vue组件拥有一个只包含纯文本的模板区域?我在当前解决方案(使用div包装文本)中面临的问题是,我在一行中递归地将这些组件与其他文本片段连接在一起,这通常会导致跳转到父容器的下一行,因为当前文本片段之前的文本片段右侧没有足够的空间。因此,文本段落应该如下所示:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.Integer molestie sit amet mauris sed sollicitudin.Curabitur non quam at nibh venenatis facilisis.Integer vitae augue vel quam condimentum ultricies.Mauris consequat elit vitae sollicitudin auctor.Donec volutpat velit nulla, vitae fermentum erat aliquet non.Mauris congue nibh eget justo sodales luctus.
最终结果如下:
这是一个痛苦的故事。整数猥亵坐在amet mauris sed sollicitudin。
venenatis设施的Curabitur non quam。完整的简历预示着调味品的品质。
Mauris结果elit vitae sollicitudin拍卖商。Donec volutpat velit nulla,vitae fermentum erat aliket non。
mauris congue niget justo sodales luctus。
考虑到在上面的例子中分别有5个文本片段。
这就是上述组件通过模板标签内的注释实现的方式,以具体化我的问题:
<template>
<div>{{element.text}}</div> <!-- This is how I can do it to this point-->
{{element.text}} <!-- This is what I would like to do-->
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
import TextElement from '@/models/elements/Text'
@Component
export default class TextWrapper extends Vue {
@Prop() element!: TextElement
}
</script>
<style scoped>
</style>
简单的答案是否定的,渲染函数/模板需要根元素。而不是使用
Vue组件模板应具有DOM中存在的根元素。通常使用div
或span
包装器元素。这很少是一个问题,因为根元素可以设置为适合布局。
vue中有一个vue片段插件,它提供了React.Frage
的功能。它基本上打开了挂载上的根元素。由于这是一个黑客,它可能不会像预期的那样在所有情况下工作。
Render函数可用于使用_v
内部方法渲染文本节点。它使用了未记录的API,这表明它也是一个黑客。
我通过将css样式属性传递给父vue-组件的模板,为我的初始意图使用解决方法解决了这个问题:
<template>
<div>
<span v-for="(line, index) in paragraph.lines" :key="index">
<p v-if="line.length">
<span v-for="(lineFragment, index) in line" :key="index">
<component class="inline-component" :element="lineFragment" :is="lineFragment.type"/>
</span>
</p>
</span>
</div>
</template>
<script lang="ts">
import { Component, Prop } from 'vue-property-decorator'
import ElementHook from '@/views/ElementHook.vue'
@Component
export default class ParagraphWrapper extends ElementHook {
@Prop() element!: ParagraphElement
}
</script>
<style scoped>
.inline-component {
display: inline;
}
</style>
ElementHook组件作为一个基本抽象类,它导入所有可以通过`:is=“lineFragment.type”显示的子组件(例如TextWrapper组件的'text')。
如果要确保段落仍然环绕在父容器对象的边界周围,您需要考虑添加whit-space: pre-cel;
到SFC底部定义的css类。