typescript - 在 vuejs 中实现简单的 markdown 指令,反应性问题
问题描述
我尝试实现一个非常简单的 Markdown 格式化指令(只是粗体、强调和打击),以使其更加独立于vue-18n
格式化。当前指令如下所示:
import _Vue from 'vue';
const emphasize = (str: string) => {
const matched = /(\*|_)(.*?)(\*|_)/gm;
return str.replace(matched, '<em>$2</em>');
};
const strong = (str: string) => {
const matched = /(\*\*|__)(.*?)(\*\*|__)/gm;
return str.replace(matched, '<strong>$2</strong>');
};
const strikeThrough = (str: string) => {
const matched = /~~(.*?)~~/gm;
return str.replace(matched, '<s>$2</s>');
};
const fromMd = (str: string) => strikeThrough(emphasize(strong(str)));
export default {
install: (Vue: typeof _Vue): void => {
/* eslint-disable no-param-reassign */
Vue.directive('tmd', {
bind(el: HTMLElement) {
el.innerHTML = fromMd(el.innerHTML);
},
inserted(el: HTMLElement) {
el.innerHTML = fromMd(el.innerHTML);
},
update(el: HTMLElement) {
el.innerHTML = fromMd(el.innerHTML);
},
});
},
};
我这样使用它:
<p v-tmd >{{ $t('path-to-translation', ) }}</p>
到目前为止它工作正常,但问题是,当我更改语言时,指令似乎没有更新。它接收到updated
事件,但el.innerHTML
没有更新,所以它呈现旧的。实现这种行为的最佳实践是什么?
解决方案
我不确定为什么解析el.innerHTML
不起作用,但您可以vnode
改为解析文本:
export default {
install: Vue => {
const childrenTextToMd = (el, binding, vnode) => {
if (vnode.children) {
el.innerHTML = vnode.children
.map(child => fromMd(child.text))
.join('')
}
}
Vue.directive('tmd', {
inserted: childrenTextToMd,
update: childrenTextToMd
})
}
}
旁注: strikeThrough()
有一个替代品$2
,但只有一个捕获组,所以应该是$1
.
推荐阅读
- bash - 在 bash 脚本上设置一个 cron 但它没有运行
- c# - C# 将字符串解析为 Func
- javascript - 对日期名称元素进行排序以获取映射值
- objective-c - Final cut pro 自定义共享到我的未响应的可编写脚本的应用程序
- docker - Docker 上的 JavaFX - 初始化 QuantumRenderer 时出错:找不到合适的管道
- javascript - HTML 2d 画布作为 webgl 画布上的纹理
- r - 使用 R 语言为 arima 生成示例路径
- ios - 如何使用联系人 UI 快速打开现有联系人的编辑联系人 UI
- windows - 批处理文件 - 设置参数值,然后传递给 exe
- r - 在 R rethinking 包中,嵌套索引的语法是什么?