Vue.js 降价过滤器

Vue.js markdown filter

我正在使用 Evan You 的示例来说明如何将 HTML 转换为 markdown - https://jsfiddle.net/yyx990803/oe7axeab/.

通过 npm 安装 marked 包,然后实施它会导致错误 'marked' is not defined

如果我在我的 index.html 文件中包含 cdn link,降价会被转换为“0”,我得到错误:

[Vue warn]: Property or method "marked" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

编辑:

我尝试将其包含在我的 main.js 中,如下所示:

import App from './App.vue';
import router from './router';
import store from './store';

import './css/main.css';
import i18n from './i18n';
import marked from 'marked';

const debugSetting = window.ApplicationConfig.DEBUG;
Vue.config.debug = debugSetting;

Vue.config.productionTip = false;

new Vue({
    router,
    store,
    i18n,
    marked,

    render: function(h) {
        return h(App);
    },
}).$mount('#app');

虽然这感觉不对,因此我尝试使用 cdn 只是为了看看它是否至少有效。

分量

<template>
    <main-layout>
        <div class="wrapper" v-html="terms | marked"></div>
    </main-layout>
</template>

<script>
import MainLayout from '@/layouts/Main.vue';

import { getTerms } from '../api';

export default {
    name: 'Terms',
    components: {
        MainLayout,
    },
    data() {
        return {
            terms,
        };
    },
    filters: {
        marked: marked,
    },
    async mounted() {
        try {
            const response = await getTerms();

            if (response) {
                this.terms = response.data;
                console.log(this.terms);
            }
        } catch (err) {
            console.log(err);
        }
    },
};
</script>

您缺少 marked 导入。将其全局注入 main.js 无济于事!

<template>
    <main-layout>
        <div class="wrapper" v-html="terms | marked"></div>
    </main-layout>
</template>

<script>
...
import marked from 'marked';
...
</script>

我使用了该示例的最新版本,并且立即生效。

https://jsfiddle.net/yyx990803/v368d4g3/

    compiledMarkdown: function () {
      return marked(this.input, { sanitize: true })
    }
  },

之所以如此,是因为过滤器不适合在 v-html 指令中使用。这样做时,marked 会查看组件的 properties/methods,实际上,它没有声明(因为它是一个过滤器)。

你唯一的方法是将 marked 移动到 data()methods{} 或者更好,从中构建一个计算的 属性 (因此它被缓存) .

本来可以如果模板引擎中有一个{{{ }}},但是没有,你想要实现的是不可能的。


PS:您提到的示例正在运行,因为它使用的是 Vue v1.0 ;仅更新依赖项会使 fiddle 失败。

如何在全球范围内使用 marked 的示例。

main.js

import Vue from 'vue'
import App from './App.vue'

import router from './router'
import store from '@/store'

import marked from 'marked'

// Lets use the code below inside a components
// Vue.marked()
// this.$marked()
Vue.use({
  install () {
    Vue.marked = marked
    Vue.prototype.$marked = marked
  }
})

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

someFile.vue

<template>
    <div v-html="$marked(someMarkdownText)"></div>
</template>

export default {
    name: 'Terms',
    components: {},
    data () {
        return {
            someMarkdownText: '# hello',
        }
    },
    mounted () {}
}