vue.js 使用nuxt/content显示从数据库中获取的markdown

zpgglvta  于 2023-04-21  发布在  Vue.js
关注(0)|答案(2)|浏览(315)

我在我的应用程序中使用nuxt / content,它工作正常。在应用程序的另一部分,我想从数据库中获取一些markdown并显示它。

let mytext = "Some *markdown* fetched from a db here."

<nuxt-content :document="mytext" />

这不起作用,因为我错过了一个解析步骤;当你执行$content("a_page_title_here").fetch()时,它会解析获取的文本,并将其作为结构化JSON呈现给组件。
如何使用$content解析文本,以便将其传递给组件进行显示?
我敢打赌一定有办法做到这一点,但是文档中没有包含一个参考部分来描述使用$content可以做的所有事情。
如果有一种简单的方法来使用底层的Remark组件,我可以做到这一点。

sbtkgmzw

sbtkgmzw1#

nuxt@3@nuxt/content@2

可以使用@nuxt/contentMarkdown transformer来解析任意字符串:

// ~/utils/parseMarkdown.js
import markdownParser from '@nuxt/content/transformers/markdown'

// first arg to parse() is for id, which is unused
export const parseMarkdown = md => markdownParser.parse('custom.md', md)

然后使用@nuxt/contentContentRendererMarkdown组件渲染它,如下所示:

<script setup>
import { parseMarkdown } from '~/utils/parseMarkdown'

const result = ref(null)
const loadMarkdown = async () => {
  const data = await $fetch('https://example.com/page.md')
  result.value = await parseMarkdown(data)
}
loadMarkdown()
</script>

<template>
  <ContentRendererMarkdown :value="result" v-if="result" />
</template>

demo 1

nuxt@2@nuxt/content@1

您可以使用@nuxt/content的底层Markdown类。其异步toJSON()函数获取包含Markdown的文件名或字符串(通过gray-matter)进行解析,并解析可以传递给<nuxt-content>.document的JSON对象。
要使用默认的rehype插件初始化Markdown,请使用getDefaults()processMarkdownOptions()

// ~/utils/parseMarkdown.js
import Markdown from '@nuxt/content/parsers/markdown'
import { getDefaults, processMarkdownOptions } from '@nuxt/content/lib/utils'

export async function parseMarkdown(md) {
  const options = getDefaults()
  processMarkdownOptions(options)
  return new Markdown(options.markdown).toJSON(md) // toJSON() is async
}

然后像这样在组件中使用它:

<script>
import { parseMarkdown } from '~/utils/parseMarkdown'

export default {
  async asyncData({ $axios }) {
    const resp = await $axios.get('https://example.com/page.md')
    const page = await parseMarkdown(resp.data)
    return { page }
  }
}
</script>

<template>
  <nuxt-content :document="page" />
</template>

demo 2

1tu0hz3e

1tu0hz3e2#

这样不行吗?

const mytext = await this.$content('a_page_title_here').fetch()

相关问题