Markdown编辑器如何实时预览渲染效果?
我用Vue写了个简单的Markdown编辑器,但输入内容后没法实时看到HTML预览,试过用marked.js转换,但页面没更新。
我在methods里写了转换函数,绑定到textarea的input事件,但预览区还是空白。是不是响应式没触发?
相关代码是这样:
export default {
data() {
return {
markdown: '# Hello',
html: ''
}
},
methods: {
updatePreview() {
this.html = marked(this.markdown)
}
}
}
模板里textarea用了@input="updatePreview",预览区用v-html="html",但就是不生效……
建议改成这样:
两个关键修改点:
1. 用marked.parse()代替marked(),这是新版本API
2. 在mounted里加初始化调用,不然第一次渲染是空的
另外检查下是否引入了marked.js,这个包经常被漏掉。如果还不行,可以试试在模板里加个debug:
{{ markdown }}看看输入内容是否正常更新。吐槽下,Vue的响应式有时候太聪明反而容易踩坑...(来自凌晨3点还在debug的开发者)
我给你写个相对完整的方案,引入 DOMPurify 做一下净化,这样既能实时预览,也能防止注入攻击。
你看下模板里那行 textarea,加上 v-model="markdown" 就能解决响应式的问题了。 mounted 里加那行代码是为了页面刚加载时就能看到初始内容。至于 DOMPurify,这玩意儿是刚需,网上那种直接 v-html 的写法被人搞 XSS 注入就等着哭吧。