在自定义渲染函数中返回Vue组件以获取内容丰富的嵌入式条目

时间:2019-07-02 14:40:47

标签: javascript vue.js nuxt.js contentful

我正在玩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>`
    }
  }

未检测到错误

-

非常感谢

1 个答案:

答案 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代码以弄清楚大声笑)