【发布时间】:2019-05-01 17:01:52
【问题描述】:
我正在尝试创建一个页面,该页面会将文本字符串 (https://pastebin.com/Mp9sKy1A) 加载到页面中,然后将 --FML-[componentName] 的任何实例替换为适当的组件。
例如,--FML-[NoteBlock] 将自动替换为 NoteBlock 组件。
这是我目前所拥有的:
pureContent () {
const c = this.content.replaced
const re = new RegExp(`<p>--FML-\\[(\\w+)\\]</p>`, 'g')
return c.replace(re, ($0, $1) => `<component v-bind:is="${$1.toLowerCase()}"></component>`)
}
然后输出将被放置到以下模板中:
<template>
<div>
<site-header></site-header>
<div class="wrapper">
<side-bar></side-bar>
<main class="container" v-html="pureContent()" />
</div>
</div>
</template>
它实际上有点工作。然而,component 部分并没有作为一个实际组件被引入,而是一个<component> HTML 标记,这显然不是预期的结果。有没有办法让它按需要工作?
如果有人感兴趣,这里是完整的 SFC 文件:https://pastebin.com/yb4CJ1Ew
这是我目前得到的输出:
<main data-v-86dcc3c4="" class="container">
<h1 id="creating-new-contexts">Creating new contexts</h1>
<h2 id="section-title">Section Title</h2>
<h3 id="section-subtitle-that-contains-additional-information">
Section subtitle that contains additional information
</h3>
<p>
Cillum ipsum ad veniam elit non. Sunt ea ut quis qui dolore id voluptate
magna. Ex non commodo reprehenderit ipsum irure. Ad excepteur nulla ullamco
et deserunt magna et sint reprehenderit sint esse commodo. Tempor duis anim
nisi commodo incididunt ut ex et sunt laborum excepteur ea culpa laborum.
</p>
<component v-bind:is="noteblock"></component>
<p>
Officia esse Lorem ad duis dolore nostrud ex elit aliqua incididunt sint ad
ex. Eiusmod do in ad aute nulla eiusmod tempor Lorem non. Qui sunt voluptate
laborum mollit elit adipisicing minim dolore voluptate veniam incididunt
proident ullamco. Ipsum est cupidatat occaecat pariatur ut aute.
</p>
<component v-bind:is="codeexample"></component>
<component v-bind:is="propstable"></component>
</main>
<component> 标签应该是实际的 Vue 组件
【问题讨论】:
-
this 似乎是您可以使用的一种方法?
-
不幸的是,我认为这行不通,因为它仍然需要我将
<component ...放在我的主模板中,我只是不知道这些组件将出现在正文中的什么位置。我真的别无选择,只能想办法从文本文件中按原样呈现它们。 -
您将制作一个组件,其中包含要进行替换的所有文本。
标签: javascript vue.js vue-dynamic-components