我正在玩Contentful!并且我遇到了富文本内容字段的问题。
我正在使用'@ contentful / rich-text-types'和 @ contentful / rich-text-html-renderer 模块自定义此阻止的方式呈现并显示以RTF文本内容链接的一些资产和参考。
在nuxt asyncData函数中调用getEntries之后,我的页面组件中有一个描述数据。 我正在使用带有选项的documentToHtmlString函数。
一切正常,但是我想使用已经编写的组件(Post.vue),而不是使用ES6模板字符串返回模板。
我知道这是可能的,但是我对JS世界来说还是个新手。
我尝试要求使用components / post / Post.vue,但我不知道如何使用它。
import { BLOCKS } from '@contentful/rich-text-types';
import { documentToHtmlString } from "@contentful/rich-text-html-renderer"
呈现富文本字段的Vue组件模板
<section class="container">
<div class="columns">
<div class="column">
<div v-html="formatContent(description)" />
</div>
</div>
</section>
我只需调用formatContent方法即可按如下方式调用documentToHtmlString(有效):
methods: {
formatContent(content) {
return documentToHtmlString(content, options)
}
}
并按照doc中所述的选项自定义documentToHtmlString:
const embeddedEntryRender = (node) => {
const { data: { target: entry} } = node
const fields = entry.fields
const sys = entry.sys
// LOOK HERE
// const postComponent = require('~/components/post/Post')
return `
<div class="column is-4">
<div class="card">
<div class="card-content">
<div class="media">
<div class="media-content">
<h3 class="title is-4">${fields.title}</h3>
<div class="subtitle is-6">${fields.description}</div>
</div>
</div>
<div class="content">
</div>
</div>
</div>
</div> `
}
const options = {
renderNode: {
[BLOCKS.EMBEDDED_ENTRY]: (node) => embeddedEntryRender(node),
// [BLOCKS.EMBEDDED_ASSET]: (node) => `<custom-component>${customComponentRenderer(node)}</custom-component>`
}
}
未检测到错误
-
非常感谢
答案 0 :(得分:0)
是的,您可以在其中具有不同的npm库的自定义vue组件,我也遇到了同样的问题。
npm i contentful-rich-text-vue-renderer
在模板中:
<rich-text-renderer :document="document" :nodeRenderers="renderNode" />
其中“文档”是通过内容发送的数据,看起来就像您称之为描述。 RenderNode是下面描述的方法。
在脚本中:
data () {
return {
renderNode: [INLINES.ASSET_HYPERLINK]: (node, key, h) => {
return h('my-vue-component', { key: hey, props: { myProp: 'blah blah' }},'what I want inside the <my-vue-component> tag'`)
}
}
这可能有点令人困惑。因此,首先从该npm库中实现richTextRenderer组件,并确保在vue组件的components部分中对其进行声明。 (或傲慢地)
接下来将内容丰富的富文本字段传递到其“文档”中
如果要自定义渲染,请将一个函数传递给nodeRenders属性(我必须在数据部分声明它)
我的示例采用任何资产超链接类型,并将其替换为标记中我想要的组件
仅当我在main.js文件中全局声明my-vue-component时,我才能使用此功能。
import MyVueComponent from 'wherever/it/is';
Vue.component('my-vue-component', MyVueComponent);
为此有更多配置,只需阅读npm libs文档(尽管它不是很棒的文档,我花了很长时间才弄清楚如何传递道具,我不得不阅读他们的github代码以弄清楚大声笑)