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 () {}
}
我正在使用 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 () {}
}